Remove second url bar

       Remove the overlay "fake" titlebar by telling the
       WebView where to render the embedded titlebar
       Simplify focus handling
       requires Ic979b641c8cc80acb83eeab49c4f700fc5c50e72
       in frameworks/base

Change-Id: I7896cd731949fdcc47cd18abfee5ef947b0e8cee
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 756f8b8..025482b 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -32,7 +32,6 @@
 import android.view.Menu;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.View.OnKeyListener;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 import android.view.WindowManager;
@@ -86,6 +85,8 @@
 
     private Toast mStopToast;
 
+    private boolean mTitleShowing;
+
     // the default <video> poster
     private Bitmap mDefaultVideoPoster;
     // the video progress view
@@ -114,6 +115,7 @@
         mCustomViewContainer = (FrameLayout) mBrowserFrameLayout
                 .findViewById(R.id.fullscreen_custom_content);
         frameLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);
+        mTitleShowing = false;
     }
 
     /**
@@ -222,8 +224,7 @@
         onTabDataChanged(tab);
         onProgressChanged(tab);
         boolean incognito = mActiveTab.getWebView().isPrivateBrowsingEnabled();
-        getEmbeddedTitleBar().setIncognitoMode(incognito);
-        getFakeTitleBar().setIncognitoMode(incognito);
+        getTitleBar().setIncognitoMode(incognito);
     }
 
     Tab getActiveTab() {
@@ -292,7 +293,7 @@
     }
 
     private void removeTabFromContentView(Tab tab) {
-        hideFakeTitleBar();
+        hideTitleBar();
         // Remove the container that contains the main WebView.
         WebView mainView = tab.getWebView();
         View container = tab.getViewContainer();
@@ -381,49 +382,47 @@
         mContentView.addView(container, COVER_SCREEN_PARAMS);
     }
 
-    void showFakeTitleBar() {
-        if (!isFakeTitleBarShowing() && !isActivityPaused()) {
-            WebView mainView = mUiController.getCurrentWebView();
-            // if there is no current WebView, don't show the faked title bar;
-            if (mainView == null) {
-                return;
-            }
-            // Do not need to check for null, since the current tab will have
-            // at least a main WebView, or we would have returned above.
-            if (mUiController.isInCustomActionMode()) {
-                // Do not show the fake title bar, while a custom ActionMode
-                // (i.e. find or select) is showing.
-                return;
-            }
-            attachFakeTitleBar(mainView);
+    boolean canShowTitleBar() {
+        return !isTitleBarShowing()
+                && !isActivityPaused()
+                && (getActiveTab() != null)
+                && (getActiveTab().getWebView() != null)
+                && !mUiController.isInCustomActionMode();
+    }
+
+    void showTitleBar() {
+        mTitleShowing = true;
+    }
+
+    protected void hideTitleBar() {
+        mTitleShowing = false;
+    }
+
+    protected boolean isTitleBarShowing() {
+        return mTitleShowing;
+    }
+
+    protected abstract TitleBarBase getTitleBar();
+
+    protected void setTitleGravity(int gravity) {
+        getTitleBar().setTitleGravity(gravity);
+        Tab tab = getActiveTab();
+        if ((tab != null) && (tab.getWebView() != null)) {
+            tab.getWebView().setTitleBarGravity(gravity);
         }
     }
 
-    protected abstract void attachFakeTitleBar(WebView mainView);
-
-    protected abstract void hideFakeTitleBar();
-
-    protected abstract boolean isFakeTitleBarShowing();
-
-    protected abstract TitleBarBase getFakeTitleBar();
-
-    protected abstract TitleBarBase getEmbeddedTitleBar();
-
     @Override
     public void showVoiceTitleBar(String title) {
-        getEmbeddedTitleBar().setInVoiceMode(true);
-        getEmbeddedTitleBar().setDisplayTitle(title);
-        getFakeTitleBar().setInVoiceMode(true);
-        getFakeTitleBar().setDisplayTitle(title);
+        getTitleBar().setInVoiceMode(true);
+        getTitleBar().setDisplayTitle(title);
     }
 
     @Override
     public void revertVoiceTitleBar(Tab tab) {
-        getEmbeddedTitleBar().setInVoiceMode(false);
+        getTitleBar().setInVoiceMode(false);
         String url = tab.getUrl();
-        getEmbeddedTitleBar().setDisplayTitle(url);
-        getFakeTitleBar().setInVoiceMode(false);
-        getFakeTitleBar().setDisplayTitle(url);
+        getTitleBar().setDisplayTitle(url);
     }
 
     @Override
@@ -440,7 +439,7 @@
         FrameLayout wrapper =
             (FrameLayout) mContentView.findViewById(R.id.webview_wrapper);
         wrapper.setVisibility(View.GONE);
-        hideFakeTitleBar();
+        hideTitleBar();
         dismissIME();
         if (mActiveTab != null) {
             WebView web = mActiveTab.getWebView();
@@ -547,8 +546,7 @@
         } else if (lockIconType == LockIcon.LOCK_ICON_MIXED) {
             d = mMixLockIcon;
         }
-        getEmbeddedTitleBar().setLock(d);
-        getFakeTitleBar().setLock(d);
+        getTitleBar().setLock(d);
     }
 
     protected void setUrlTitle(Tab tab) {
@@ -559,8 +557,7 @@
         }
         if (tab.isInVoiceSearchMode()) return;
         if (tab.inForeground()) {
-            getEmbeddedTitleBar().setDisplayTitle(url);
-            getFakeTitleBar().setDisplayTitle(url);
+            getTitleBar().setDisplayTitle(url);
         }
     }
 
@@ -568,8 +565,7 @@
     protected void setFavicon(Tab tab) {
         if (tab.inForeground()) {
             Bitmap icon = tab.getFavicon();
-            getEmbeddedTitleBar().setFavicon(icon);
-            getFakeTitleBar().setFavicon(icon);
+            getTitleBar().setFavicon(icon);
         }
     }
 
@@ -578,7 +574,7 @@
         if (inLoad) {
             // the titlebar was removed when the CAB was shown
             // if the page is loading, show it again
-            showFakeTitleBar();
+            showTitleBar();
         }
     }
 
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index 4119c29..7463ca5 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -17,16 +17,12 @@
 package com.android.browser;
 
 import android.app.Activity;
-import android.content.Context;
-import android.graphics.PixelFormat;
 import android.util.Log;
 import android.view.ActionMode;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
 import android.webkit.WebView;
 
 /**
@@ -37,7 +33,6 @@
     private static final String LOGTAG = "PhoneUi";
 
     private TitleBar mTitleBar;
-    private TitleBar mFakeTitleBar;
     private ActiveTabsPage mActiveTabsPage;
 
     boolean mExtendedMenuOpen;
@@ -53,7 +48,6 @@
         // mTitleBar will be always be shown in the fully loaded mode on
         // phone
         mTitleBar.setProgress(100);
-        mFakeTitleBar = new TitleBar(mActivity, mUiController);
 
     }
 
@@ -90,7 +84,7 @@
 
     @Override
     public void onDestroy() {
-        hideFakeTitleBar();
+        hideTitleBar();
     }
 
     @Override
@@ -107,14 +101,14 @@
     public void onProgressChanged(Tab tab) {
         if (tab.inForeground()) {
             int progress = tab.getLoadProgress();
-            mFakeTitleBar.setProgress(progress);
+            mTitleBar.setProgress(progress);
             if (progress == 100) {
                 if (!mOptionsMenuOpen || !mExtendedMenuOpen) {
-                    hideFakeTitleBar();
+                    hideTitleBar();
                 }
             } else {
                 if (!mOptionsMenuOpen || mExtendedMenuOpen) {
-                    showFakeTitleBar();
+                    showTitleBar();
                 }
             }
         }
@@ -130,7 +124,7 @@
             Log.e(LOGTAG, "active tab with no webview detected");
             return;
         }
-        view.setEmbeddedTitleBar(getEmbeddedTitleBar());
+        view.setEmbeddedTitleBar(getTitleBar());
         if (tab.isInVoiceSearchMode()) {
             showVoiceTitleBar(tab.getVoiceDisplayTitle());
         } else {
@@ -140,57 +134,23 @@
     }
 
     @Override
-    protected void attachFakeTitleBar(WebView mainView) {
-        WindowManager manager = (WindowManager)
-                mActivity.getSystemService(Context.WINDOW_SERVICE);
-
-        // Add the title bar to the window manager so it can receive
-        // touches while the menu is up
-        WindowManager.LayoutParams params =
-                new WindowManager.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.WRAP_CONTENT,
-                        WindowManager.LayoutParams.TYPE_APPLICATION,
-                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
-                        PixelFormat.TRANSLUCENT);
-        params.gravity = Gravity.TOP;
-        boolean atTop = mainView.getScrollY() == 0;
-        params.windowAnimations = atTop ? 0 : R.style.TitleBar;
-        manager.addView(mFakeTitleBar, params);
+    void showTitleBar() {
+        if (canShowTitleBar()) {
+            setTitleGravity(Gravity.TOP);
+            super.showTitleBar();
+        }
     }
 
     @Override
-    protected void hideFakeTitleBar() {
-        if (!isFakeTitleBarShowing()) return;
-        WindowManager.LayoutParams params =
-                (WindowManager.LayoutParams) mFakeTitleBar.getLayoutParams();
-        WebView mainView = mUiController.getCurrentWebView();
-        // Although we decided whether or not to animate based on the
-        // current
-        // scroll position, the scroll position may have changed since the
-        // fake title bar was displayed. Make sure it has the appropriate
-        // animation/lack thereof before removing.
-        params.windowAnimations =
-                mainView != null && mainView.getScrollY() == 0 ?
-                        0 : R.style.TitleBar;
-        WindowManager manager = (WindowManager) mActivity
-                .getSystemService(Context.WINDOW_SERVICE);
-        manager.updateViewLayout(mFakeTitleBar, params);
-        manager.removeView(mFakeTitleBar);
+    protected void hideTitleBar() {
+        if (isTitleBarShowing()) {
+            setTitleGravity(Gravity.NO_GRAVITY);
+            super.hideTitleBar();
+        }
     }
 
     @Override
-    protected boolean isFakeTitleBarShowing() {
-        return (mFakeTitleBar.getParent() != null);
-    }
-
-    @Override
-    protected TitleBarBase getFakeTitleBar() {
-        return mFakeTitleBar;
-    }
-
-    @Override
-    protected TitleBarBase getEmbeddedTitleBar() {
+    protected TitleBarBase getTitleBar() {
         return mTitleBar;
     }
 
@@ -200,7 +160,7 @@
     public void showActiveTabsPage() {
         mActiveTabsPage = new ActiveTabsPage(mActivity, mUiController);
         mTitleBar.setVisibility(View.GONE);
-        hideFakeTitleBar();
+        hideTitleBar();
         mContentView.addView(mActiveTabsPage, COVER_SCREEN_PARAMS);
         mActiveTabsPage.requestFocus();
     }
@@ -226,7 +186,7 @@
     public void onOptionsMenuOpened() {
         mOptionsMenuOpen = true;
         // options menu opened, show fake title bar
-        showFakeTitleBar();
+        showTitleBar();
     }
 
     @Override
@@ -234,32 +194,32 @@
         // Switching the menu to expanded view, so hide the
         // title bar.
         mExtendedMenuOpen = true;
-        hideFakeTitleBar();
+        hideTitleBar();
     }
 
     @Override
     public void onOptionsMenuClosed(boolean inLoad) {
         mOptionsMenuOpen = false;
         if (!inLoad) {
-            hideFakeTitleBar();
+            hideTitleBar();
         }
     }
 
     @Override
     public void onExtendedMenuClosed(boolean inLoad) {
         mExtendedMenuOpen = false;
-        showFakeTitleBar();
+        showTitleBar();
     }
 
     @Override
     public void onContextMenuCreated(Menu menu) {
-        hideFakeTitleBar();
+        hideTitleBar();
     }
 
     @Override
     public void onContextMenuClosed(Menu menu, boolean inLoad) {
         if (inLoad) {
-            showFakeTitleBar();
+            showTitleBar();
         }
     }
 
@@ -267,7 +227,7 @@
 
     @Override
     public void onActionModeStarted(ActionMode mode) {
-        hideFakeTitleBar();
+        hideTitleBar();
     }
 
     @Override
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
index 6326f2e..23dcced 100644
--- a/src/com/android/browser/PieControl.java
+++ b/src/com/android/browser/PieControl.java
@@ -126,14 +126,14 @@
                 web.reload();
             }
         } else if (mUrl == v) {
-            mUi.showFakeTitleBarAndEdit();
+            mUi.showTitleBarAndEdit();
         } else if (mOptions == v) {
             mActivity.openOptionsMenu();
         } else if (mBookmarks == v) {
             mUiController.bookmarksOrHistoryPicker(false);
         } else if (mNewTab == v) {
             mUiController.openTabToHomePage();
-            mUi.showFakeTitleBarAndEdit();
+            mUi.showTitleBarAndEdit();
         } else if (mClose == v) {
             mUiController.closeCurrentTab();
         } else {
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index d115f1a..c00e1f5 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -75,8 +75,6 @@
 
     private Map<Tab, TabView> mTabMap;
 
-    private int mVisibleTitleHeight;
-
     private Drawable mGenericFavicon;
 
     private int mCurrentTextureWidth = 0;
@@ -96,7 +94,6 @@
     private int mTabOverlap;
     private int mAddTabOverlap;
     private int mTabSliceWidth;
-    private int mTabPadding;
     private boolean mUseQuickControls;
 
     public TabBar(Activity activity, UiController controller, XLargeUi ui) {
@@ -122,14 +119,11 @@
         mGenericFavicon = res.getDrawable(R.drawable.app_web_browser_sm);
 
         updateTabs(mUiController.getTabs());
-
-        mVisibleTitleHeight = 1;
         mButtonWidth = -1;
         // tab dimensions
         mTabOverlap = (int) res.getDimension(R.dimen.tab_overlap);
         mAddTabOverlap = (int) res.getDimension(R.dimen.tab_addoverlap);
         mTabSliceWidth = (int) res.getDimension(R.dimen.tab_slice);
-        mTabPadding = (int) res.getDimension(R.dimen.tab_padding);
 
         mActiveShaderPaint.setStyle(Paint.Style.FILL);
         mActiveShaderPaint.setAntiAlias(true);
@@ -198,14 +192,16 @@
             mUiController.openTabToHomePage();
         } else if (mTabs.getSelectedTab() == view) {
             if (mUseQuickControls) {
-                if (mUi.isFakeTitleBarShowing() && !isLoading()) {
-                    mUi.hideFakeTitleBar();
+                if (mUi.isTitleBarShowing() && !isLoading()) {
+                    mUi.stopEditingUrl();
+                    mUi.hideTitleBar();
                 } else {
                     mUi.stopWebViewScrolling();
-                    mUi.showFakeTitleBarAndEdit();
+                    mUi.showTitleBarAndEdit();
                 }
-            } else if (mUi.isFakeTitleBarShowing() && !isLoading()) {
-                mUi.hideFakeTitleBar();
+            } else if (mUi.isTitleBarShowing() && !isLoading()) {
+                mUi.stopEditingUrl();
+                mUi.hideTitleBar();
             } else {
                 showUrlBar();
             }
@@ -220,7 +216,7 @@
 
     private void showUrlBar() {
         mUi.stopWebViewScrolling();
-        mUi.showFakeTitleBar();
+        mUi.showTitleBar();
     }
 
     void showTitleBarIndicator(boolean show) {
@@ -251,9 +247,11 @@
 
     // callback after fake titlebar is hidden
     void onHideTitleBar() {
-        showTitleBarIndicator(mVisibleTitleHeight == 0);
         Tab tab = mTabControl.getCurrentTab();
-        tab.getWebView().requestFocus();
+        WebView w = tab.getWebView();
+        if (w != null) {
+            showTitleBarIndicator(w.getVisibleTitleHeight() == 0);
+        }
     }
 
     // webview scroll listener
@@ -266,7 +264,7 @@
                 && !isLoading()) {
             if (visibleTitleHeight == 0) {
                 if (!showsTitleBarIndicator()) {
-                    mUi.hideFakeTitleBar();
+                    mUi.hideTitleBar();
                     showTitleBarIndicator(true);
                 }
             } else {
@@ -275,7 +273,6 @@
                 }
             }
         }
-        mVisibleTitleHeight = visibleTitleHeight;
     }
 
     @Override
@@ -588,7 +585,6 @@
             WebView webview = tab.getWebView();
             if (webview != null) {
                 int h = webview.getVisibleTitleHeight();
-                mVisibleTitleHeight = h -1;
                 onScroll(h);
             }
         }
diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java
index 024f83c..1e944f1 100644
--- a/src/com/android/browser/TitleBarBase.java
+++ b/src/com/android/browser/TitleBarBase.java
@@ -23,7 +23,9 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.PaintDrawable;
+import android.view.Gravity;
 import android.view.View;
+import android.widget.AbsoluteLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
@@ -76,4 +78,24 @@
     /* package */ void setInVoiceMode(boolean inVoiceMode) {}
 
     /* package */ void setIncognitoMode(boolean incognito) {}
+
+    void setTitleGravity(int gravity) {
+        int newTop = 0;
+        if (gravity != Gravity.NO_GRAVITY) {
+            View parent = (View) getParent();
+            if (parent != null) {
+                if (gravity == Gravity.TOP) {
+                    newTop = parent.getScrollY();
+                } else if (gravity == Gravity.BOTTOM) {
+                    newTop = parent.getScrollY() + parent.getHeight() - getHeight();
+                }
+            }
+        }
+        AbsoluteLayout.LayoutParams lp = (AbsoluteLayout.LayoutParams) getLayoutParams();
+        if (lp != null) {
+            lp.y = newTop;
+            setLayoutParams(lp);
+        }
+    }
+
 }
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index 0dcece6..55347a0 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -35,7 +35,10 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnFocusChangeListener;
+import android.view.ViewGroup;
 import android.webkit.WebView;
+import android.widget.AbsoluteLayout;
+import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 
@@ -76,7 +79,6 @@
     private boolean mInVoiceMode;
 
     private boolean mInLoad;
-    private boolean mEditable;
     private boolean mUseQuickControls;
 
     public TitleBarXLarge(Activity activity, UiController controller,
@@ -95,6 +97,18 @@
         mInVoiceMode = false;
     }
 
+    @Override
+    void setTitleGravity(int gravity) {
+        if (mUseQuickControls) {
+            FrameLayout.LayoutParams lp =
+                    (FrameLayout.LayoutParams) getLayoutParams();
+            lp.gravity = gravity;
+            setLayoutParams(lp);
+        } else {
+            super.setTitleGravity(gravity);
+        }
+    }
+
     private void initLayout(Context context) {
         LayoutInflater factory = LayoutInflater.from(context);
         factory.inflate(R.layout.url_bar, this);
@@ -126,7 +140,6 @@
         mGoButton.setOnClickListener(this);
         mClearButton.setOnClickListener(this);
         mVoiceSearch.setOnClickListener(this);
-        mUrlContainer.setOnClickListener(this);
         mUrlInput.setUrlInputListener(this);
         mUrlInput.setContainer(mUrlContainer);
         mUrlInput.setController(mUiController);
@@ -148,19 +161,21 @@
         }
     }
 
-    public void setEditable(boolean editable) {
-        mEditable = editable;
-        mUrlInput.setFocusable(mEditable);
-        if (!mEditable) {
-            mUrlInput.setOnClickListener(this);
+    private ViewGroup.LayoutParams makeLayoutParams() {
+        if (mUseQuickControls) {
+            return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+                    LayoutParams.WRAP_CONTENT);
         } else {
-            mUrlContainer.setOnClickListener(null);
+            return new AbsoluteLayout.LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
+                    0, 0);
         }
     }
 
     void setUseQuickControls(boolean useQuickControls) {
         mUseQuickControls = useQuickControls;
         mUrlInput.setUseQuickControls(mUseQuickControls);
+        setLayoutParams(makeLayoutParams());
         if (mUseQuickControls) {
             mBackButton.setVisibility(View.GONE);
             mForwardButton.setVisibility(View.GONE);
@@ -184,15 +199,7 @@
 
     @Override
     public void onFocusChange(View view, boolean hasFocus) {
-        if (!mEditable && hasFocus) {
-            mUi.editUrl(false);
-        } else {
-            if (hasFocus) {
-                setEditMode(hasFocus);
-            } else {
-                mUrlInput.stopEditing();
-            }
-        }
+        setEditMode(hasFocus);
         mUrlContainer.setBackgroundDrawable(hasFocus
                 ? mFocusDrawable : mUnfocusDrawable);
     }
@@ -203,8 +210,6 @@
 
     /**
      * called from the Ui when the user wants to edit
-     * Note: only the fake titlebar will get this callback
-     * independent of which input field started the edit mode
      * @param clearInput clear the input field
      */
     void onEditUrl(boolean clearInput) {
@@ -227,15 +232,13 @@
         return mUrlInput.hasFocus();
     }
 
+    void stopEditingUrl() {
+        mUrlInput.clearFocus();
+    }
+
     @Override
     public void onClick(View v) {
-        if (mUrlInput == v) {
-            mUi.editUrl(false);
-        } else if (mUrlContainer == v) {
-            if (!mUrlInput.hasFocus()) {
-                mUi.editUrl(false);
-            }
-        } else if (mBackButton == v) {
+        if (mBackButton == v) {
             mUiController.getCurrentTopWebView().goBack();
         } else if (mForwardButton == v) {
             mUiController.getCurrentTopWebView().goForward();
@@ -260,17 +263,13 @@
         }
     }
 
-    int getHeightWithoutProgress() {
-        return mContainer.getHeight();
-    }
-
     @Override
     void setFavicon(Bitmap icon) { }
 
     private void clearOrClose() {
         if (TextUtils.isEmpty(mUrlInput.getText())) {
             // close
-            mUrlInput.stopEditing();
+            mUrlInput.clearFocus();
         } else {
             // clear
             mUrlInput.setText("");
@@ -286,7 +285,7 @@
     @Override
     public void onAction(String text, String extra, String source) {
         mUiController.getCurrentTopWebView().requestFocus();
-        mUi.hideFakeTitleBar();
+        mUi.hideTitleBar();
         Intent i = new Intent();
         String action = null;
         if (UrlInputView.VOICE.equals(source)) {
@@ -312,7 +311,7 @@
     @Override
     public void onDismiss() {
         final Tab currentTab = mUi.getActiveTab();
-        mUi.hideFakeTitleBar();
+        mUi.hideTitleBar();
         post(new Runnable() {
             public void run() {
                 TitleBarXLarge.this.clearFocus();
@@ -328,14 +327,14 @@
      * copy text to input field and stay in edit mode
      */
     @Override
-    public void onEdit(String text) {
+    public void onCopySuggestion(String text) {
         mUrlInput.setText(text, true);
         if (text != null) {
             mUrlInput.setSelection(text.length());
         }
     }
 
-    void setEditMode(boolean edit) {
+    private void setEditMode(boolean edit) {
         if (edit) {
             mUrlInput.setDropDownWidth(mUrlContainer.getWidth());
             mUrlInput.setDropDownHorizontalOffset(-mUrlInput.getLeft());
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 23e412d..6817b36 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -166,16 +166,14 @@
                 performFiltering(getText().toString(), 0);
                 showDropDown();
             }
+        } else {
+            finishInput(null, null, null);
         }
         if (mWrappedFocusListener != null) {
             mWrappedFocusListener.onFocusChange(v, hasFocus);
         }
     }
 
-    void stopEditing() {
-        finishInput(null, null, null);
-    }
-
     public void setUrlInputListener(UrlInputListener listener) {
         mListener = listener;
     }
@@ -221,7 +219,7 @@
 
     @Override
     public void onSearch(String search) {
-        mListener.onEdit(search);
+        mListener.onCopySuggestion(search);
     }
 
     @Override
@@ -232,9 +230,10 @@
 
     @Override
     public boolean onKeyPreIme(int keyCode, KeyEvent evt) {
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
+        if ((evt.getAction() == KeyEvent.ACTION_DOWN)
+                && (keyCode == KeyEvent.KEYCODE_BACK)) {
             // catch back key in order to do slightly more cleanup than usual
-            finishInput(null, null, null);
+            clearFocus();
             return true;
         }
         return super.onKeyPreIme(keyCode, evt);
@@ -254,7 +253,7 @@
 
         public void onAction(String text, String extra, String source);
 
-        public void onEdit(String text);
+        public void onCopySuggestion(String text);
 
     }
 
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 562705b..3e200ea 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -28,8 +28,6 @@
 import android.view.View;
 import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
-import android.widget.FrameLayout;
-import android.widget.FrameLayout.LayoutParams;
 
 import java.util.List;
 
@@ -44,7 +42,6 @@
     private TabBar mTabBar;
 
     private TitleBarXLarge mTitleBar;
-    private TitleBarXLarge mFakeTitleBar;
 
     private boolean mUseQuickControls;
     private PieControl mPieControl;
@@ -57,9 +54,6 @@
         super(browser, controller);
         mTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
         mTitleBar.setProgress(100);
-        mTitleBar.setEditable(false);
-        mFakeTitleBar = new TitleBarXLarge(mActivity, mUiController, this);
-        mFakeTitleBar.setEditable(true);
         mTabBar = new TabBar(mActivity, mUiController, this);
         mActionBar = mActivity.getActionBar();
         setupActionBar();
@@ -90,31 +84,28 @@
 
     private void setUseQuickControls(boolean useQuickControls) {
         mUseQuickControls = useQuickControls;
+        mTitleBar.setUseQuickControls(mUseQuickControls);
         if (useQuickControls) {
             checkTabCount();
             mPieControl = new PieControl(mActivity, mUiController, this);
             mPieControl.attachToContainer(mContentView);
-            setFakeTitleBarGravity(Gravity.BOTTOM);
-
-            // remove embedded title bar if present
-            WebView web = mTabControl.getCurrentWebView();
-            if ((web != null) && (web.getVisibleTitleHeight() > 0)) {
-                web.setEmbeddedTitleBar(null);
+            Tab tab = getActiveTab();
+            if ((tab != null) && (tab.getWebView() != null)) {
+                tab.getWebView().setEmbeddedTitleBar(null);
             }
+            setTitleGravity(Gravity.BOTTOM);
         } else {
             mActivity.getActionBar().show();
             if (mPieControl != null) {
                 mPieControl.removeFromContainer(mContentView);
             }
-            setFakeTitleBarGravity(Gravity.TOP);
-            // remove embedded title bar if present
+            setTitleGravity(Gravity.TOP);
             WebView web = mTabControl.getCurrentWebView();
-            if ((web != null) && (web.getVisibleTitleHeight() == 0)) {
+            if (web != null) {
                 web.setEmbeddedTitleBar(mTitleBar);
             }
         }
         mTabBar.setUseQuickControls(mUseQuickControls);
-        mFakeTitleBar.setUseQuickControls(mUseQuickControls);
     }
 
     private void checkTabCount() {
@@ -130,7 +121,7 @@
 
     @Override
     public void onDestroy() {
-        hideFakeTitleBar();
+        hideTitleBar();
     }
 
     // webview factory
@@ -174,7 +165,6 @@
         if (tab.inForeground()) {
             boolean isBookmark = tab.isBookmarkedSite();
             mTitleBar.setCurrentUrlIsBookmark(isBookmark);
-            mFakeTitleBar.setCurrentUrlIsBookmark(isBookmark);
         }
     }
 
@@ -183,23 +173,23 @@
         int progress = tab.getLoadProgress();
         mTabBar.onProgress(tab, progress);
         if (tab.inForeground()) {
-            mFakeTitleBar.setProgress(progress);
+            mTitleBar.setProgress(progress);
             if (progress == 100) {
-                if (!mFakeTitleBar.isEditingUrl()) {
-                    hideFakeTitleBar();
+                if (!mTitleBar.isEditingUrl()) {
+                    hideTitleBar();
                     if (mUseQuickControls) {
-                        mFakeTitleBar.setShowProgressOnly(false);
-                        setFakeTitleBarGravity(Gravity.BOTTOM);
+                        mTitleBar.setShowProgressOnly(false);
+                        setTitleGravity(Gravity.BOTTOM);
                     }
                 }
             } else {
-                if (mUseQuickControls && !mFakeTitleBar.isEditingUrl()) {
-                    mFakeTitleBar.setShowProgressOnly(true);
-                    if (!isFakeTitleBarShowing()) {
-                        setFakeTitleBarGravity(Gravity.TOP);
+                if (!isTitleBarShowing()) {
+                    if (mUseQuickControls && !mTitleBar.isEditingUrl()) {
+                        mTitleBar.setShowProgressOnly(true);
+                        setTitleGravity(Gravity.TOP);
                     }
+                    showTitleBar();
                 }
-                showFakeTitleBar();
             }
         }
     }
@@ -274,55 +264,48 @@
         if (mUiController.isInCustomActionMode()) {
             mUiController.endActionMode();
         }
-        showFakeTitleBar();
-        mFakeTitleBar.onEditUrl(clearInput);
+        showTitleBar();
+        mTitleBar.onEditUrl(clearInput);
     }
 
-    void setFakeTitleBarGravity(int gravity) {
-        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)
-                mFakeTitleBar.getLayoutParams();
-        if (lp == null) {
-            lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                    LayoutParams.WRAP_CONTENT);
+    void showTitleBarAndEdit() {
+        mTitleBar.setShowProgressOnly(false);
+        showTitleBar();
+        mTitleBar.onEditUrl(false);
+    }
+
+    void stopEditingUrl() {
+        mTitleBar.stopEditingUrl();
+    }
+
+    @Override
+    protected void showTitleBar() {
+        if (canShowTitleBar()) {
+            if (mUseQuickControls) {
+                setTitleGravity(Gravity.BOTTOM);
+                mContentView.addView(mTitleBar);
+            } else {
+                setTitleGravity(Gravity.TOP);
+            }
+            super.showTitleBar();
+            mTabBar.onShowTitleBar();
         }
-        lp.gravity = gravity;
-        mFakeTitleBar.setLayoutParams(lp);
-    }
-
-    void showFakeTitleBarAndEdit() {
-        mFakeTitleBar.setShowProgressOnly(false);
-        setFakeTitleBarGravity(Gravity.BOTTOM);
-        showFakeTitleBar();
-        mFakeTitleBar.onEditUrl(false);
     }
 
     @Override
-    protected void attachFakeTitleBar(WebView mainView) {
-        mContentView.addView(mFakeTitleBar);
-        mTabBar.onShowTitleBar();
-    }
-
-    @Override
-    protected void hideFakeTitleBar() {
-        if (isFakeTitleBarShowing()) {
-            mFakeTitleBar.setEditMode(false);
+    protected void hideTitleBar() {
+        if (isTitleBarShowing()) {
             mTabBar.onHideTitleBar();
-            mContentView.removeView(mFakeTitleBar);
+            setTitleGravity(Gravity.NO_GRAVITY);
+            if (mUseQuickControls) {
+                mContentView.removeView(mTitleBar);
+            }
+            super.hideTitleBar();
         }
     }
 
     @Override
-    protected boolean isFakeTitleBarShowing() {
-        return (mFakeTitleBar.getParent() != null);
-    }
-
-    @Override
-    protected TitleBarBase getFakeTitleBar() {
-        return mFakeTitleBar;
-    }
-
-    @Override
-    protected TitleBarBase getEmbeddedTitleBar() {
+    protected TitleBarBase getTitleBar() {
         return mTitleBar;
     }
 
@@ -330,9 +313,9 @@
 
     @Override
     public void onActionModeStarted(ActionMode mode) {
-        if (!mFakeTitleBar.isEditingUrl()) {
+        if (!mTitleBar.isEditingUrl()) {
             // hide the fake title bar when CAB is shown
-            hideFakeTitleBar();
+            hideTitleBar();
         }
     }
 
@@ -342,18 +325,17 @@
         if (inLoad) {
             // the titlebar was removed when the CAB was shown
             // if the page is loading, show it again
-            mFakeTitleBar.setShowProgressOnly(true);
-            if (!isFakeTitleBarShowing()) {
-                setFakeTitleBarGravity(Gravity.TOP);
+            mTitleBar.setShowProgressOnly(true);
+            if (!isTitleBarShowing()) {
+                setTitleGravity(Gravity.TOP);
             }
-            showFakeTitleBar();
+            showTitleBar();
         }
     }
 
     @Override
     protected void updateNavigationState(Tab tab) {
         mTitleBar.updateNavigationState(tab);
-        mFakeTitleBar.updateNavigationState(tab);
     }
 
     @Override
@@ -377,8 +359,6 @@
         }
         mTitleBar.setInVoiceMode(true, null);
         mTitleBar.setDisplayTitle(title);
-        mFakeTitleBar.setInVoiceMode(true, vsresults);
-        mFakeTitleBar.setDisplayTitle(title);
     }
 
     @Override
@@ -386,8 +366,6 @@
         mTitleBar.setInVoiceMode(false, null);
         String url = tab.getUrl();
         mTitleBar.setDisplayTitle(url);
-        mFakeTitleBar.setInVoiceMode(false, null);
-        mFakeTitleBar.setDisplayTitle(url);
     }
 
     @Override
@@ -419,7 +397,7 @@
                 }
         }
         boolean ctrl = event.hasModifiers(KeyEvent.META_CTRL_ON);
-        if (!ctrl && event.isPrintingKey() && !mFakeTitleBar.isEditingUrl()) {
+        if (!ctrl && event.isPrintingKey() && !mTitleBar.isEditingUrl()) {
             editUrl(true);
             return mContentView.dispatchKeyEvent(event);
         }