TitleBar refactor

Change-Id: I0a2df041529143c8e0ff17af341376a3f827be04
diff --git a/res/drawable-hdpi/ic_snapshot.png b/res/drawable-hdpi/ic_snapshot.png
deleted file mode 100644
index a621cb4..0000000
--- a/res/drawable-hdpi/ic_snapshot.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_snapshot.png b/res/drawable-mdpi/ic_snapshot.png
deleted file mode 100644
index 6054acb..0000000
--- a/res/drawable-mdpi/ic_snapshot.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-sw600dp/title_bar_autologin.xml b/res/layout-sw600dp/title_bar_autologin.xml
new file mode 100644
index 0000000..783b4c3
--- /dev/null
+++ b/res/layout-sw600dp/title_bar_autologin.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+   Copyright 2011, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<com.android.browser.AutologinBar
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:background="#FBF0A0"
+    android:gravity="center_vertical"
+    android:visibility="gone">
+    <TextView
+        android:text="@string/autologin_bar_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textColor="@android:color/primary_text_light"
+        android:paddingLeft="15dip"
+        android:paddingRight="15dip"
+        android:textAppearance="?android:attr/textAppearanceMedium"/>
+    <Spinner
+        android:id="@+id/autologin_account"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        style="@android:style/Widget.Holo.Light.Spinner" />
+    <Button
+        android:id="@+id/autologin_login"
+        android:text="@string/autologin_bar_login_text"
+        style="@android:style/Widget.Holo.Light.Button"
+        android:layout_marginRight="15dip"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content" />
+    <ProgressBar
+        android:id="@+id/autologin_progress"
+        android:indeterminateOnly="true"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:visibility="gone" />
+    <TextView
+        android:id="@+id/autologin_error"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:textColor="#dd6826"
+        android:text="@string/autologin_bar_error"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:visibility="gone" />
+    <View
+        android:layout_width="2dip"
+        android:layout_height="match_parent"
+        android:layout_weight="1"/>
+    <ImageButton
+        android:id="@+id/autologin_close"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingRight="15dip"
+        android:background="@null"
+        android:src="@*android:drawable/btn_close"/>
+</com.android.browser.AutologinBar>
diff --git a/res/layout-sw600dp/title_bar_nav.xml b/res/layout-sw600dp/title_bar_nav.xml
new file mode 100644
index 0000000..4ef94e8
--- /dev/null
+++ b/res/layout-sw600dp/title_bar_nav.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+   Copyright 2011, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<com.android.browser.NavigationBarTablet
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:background="@drawable/bg_urlbar">
+    <ImageButton
+        android:id="@+id/back"
+        android:src="@drawable/ic_back_holo_dark"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:paddingLeft="16dip"
+        style="@style/HoloButton" />
+    <ImageButton
+        android:id="@+id/forward"
+        android:src="@drawable/ic_forward_holo_dark"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        style="@style/HoloButton" />
+    <ImageButton
+        android:id="@+id/stop"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        style="@style/HoloButton"
+        android:gravity="center_vertical"
+        android:src="@drawable/ic_stop_holo_dark" />
+    <LinearLayout
+        android:id="@+id/urlbar_focused"
+        android:layout_width="0dip"
+        android:layout_height="match_parent"
+        android:layout_weight="1.0"
+        android:layout_marginLeft="8dip"
+        android:layout_marginRight="8dip"
+        android:orientation="horizontal"
+        android:background="@drawable/url_background">
+        <ImageView
+            android:id="@+id/url_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:src="@drawable/ic_web_holo_dark"
+            style="@style/HoloIcon" />
+        <ImageView
+            android:id="@+id/lock"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            style="@style/HoloIcon"
+            android:visibility="gone" />
+        <com.android.browser.UrlInputView
+            android:id="@+id/url"
+            android:layout_width="0dip"
+            android:layout_weight="1.0"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="16dip"
+            android:paddingLeft="0dip"
+            android:paddingRight="0dip"
+            android:background="@null"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:hint="@string/search_hint"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:lines="1"
+            android:scrollHorizontally="true"
+            android:inputType="textUri"
+            android:imeOptions="actionGo"
+            style="@style/Suggestions" />
+        <ImageButton
+            android:id="@+id/star"
+            android:src="@drawable/btn_imageview_star"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            style="@style/HoloButton" />
+        <ImageButton
+            android:id="@+id/clear"
+            android:src="@drawable/ic_stop_holo_dark"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            style="@style/HoloButton" />
+    </LinearLayout>
+    <ImageButton
+        android:id="@+id/go"
+        android:src="@drawable/ic_go_holo_dark"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:visibility="gone"
+        android:gravity="center_vertical"
+        style="@style/HoloButton" />
+    <ImageButton
+        android:id="@+id/voicesearch"
+        android:src="@drawable/ic_voice_search_holo_dark"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        style="@style/HoloButton" />
+    <ImageButton
+        android:id="@+id/search"
+        android:src="@drawable/ic_search_holo_dark"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:gravity="center_vertical"
+        style="@style/HoloButton" />
+    <ImageButton
+        android:id="@+id/all_btn"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:scaleType="center"
+        android:paddingRight="16dip"
+        style="@style/HoloButton"
+        android:src="@drawable/ic_bookmarks_history_holo_dark" />
+</com.android.browser.NavigationBarTablet>
diff --git a/res/layout/tab_title.xml b/res/layout/tab_title.xml
index 7ac2ba0..589debc 100644
--- a/res/layout/tab_title.xml
+++ b/res/layout/tab_title.xml
@@ -28,7 +28,7 @@
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:gravity="center_vertical"
-        android:src="@drawable/ic_snapshot"
+        android:src="@drawable/ic_search_category_history"
         android:visibility="gone" />
     <ImageView
         android:id="@+id/favicon"
diff --git a/res/layout/title_bar.xml b/res/layout/title_bar.xml
index 7789bfc..21b5b2e 100644
--- a/res/layout/title_bar.xml
+++ b/res/layout/title_bar.xml
@@ -19,156 +19,25 @@
     android:id="@+id/titlebar"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
-    <LinearLayout
+    <include
+        layout="@layout/title_bar_nav"
         android:id="@+id/taburlbar"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/toolbar_height"
-        android:orientation="horizontal"
-        android:background="@drawable/bg_urlbar">
-        <LinearLayout
-            android:id="@+id/title_bg"
-            android:layout_width="0dip"
-            android:layout_weight="1.0"
-            android:layout_height="match_parent"
-            android:gravity="center_vertical"
-            android:orientation="horizontal">
-            <FrameLayout
-                android:id="@+id/iconcombo"
-                android:layout_width="52dip"
-                android:layout_height="match_parent"
-                style="@style/HoloButton">
-                <ImageView
-                    android:id="@+id/favicon"
-                    android:layout_width="36dip"
-                    android:layout_height="36dip"
-                    android:paddingLeft="8dip"
-                    android:paddingRight="8dip"
-                    android:layout_gravity="center_vertical" />
-                <ImageView
-                    android:id="@+id/lock"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_gravity="bottom|right"
-                    android:visibility="gone" />
-            </FrameLayout>
-            <ImageView
-                android:id="@+id/stop"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_vertical"
-                android:src="@drawable/ic_stop_holo_dark"
-                style="@style/HoloButton" />
-            <com.android.browser.UrlInputView
-                android:id="@+id/url"
-                android:focusable="true"
-                android:layout_width="0dip"
-                android:layout_weight="1.0"
-                android:layout_height="match_parent"
-                android:fadingEdge="horizontal"
-                android:fadingEdgeLength="24dip"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:hint="@string/search_hint"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:lines="1"
-                android:scrollHorizontally="true"
-                android:inputType="text"
-                android:imeOptions="actionGo"
-                style="@style/Suggestions"
-                android:background="@null" />
-            <ImageView
-                android:id="@+id/voice"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:src="@drawable/ic_voice_search_holo_dark"
-                style="@style/HoloButton"
-                android:visibility="gone" />
-        </LinearLayout>
-        <ImageButton
-            android:id="@+id/tab_switcher"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:src="@drawable/ic_windows_holo_dark"
-            style="@style/HoloButton" />
-        <ImageButton
-            android:id="@+id/more"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            style="@style/HoloButton"
-            android:gravity="center_vertical"
-            android:src="@*android:drawable/ic_menu_moreoverflow_normal_holo_dark" />
-    </LinearLayout>
-    <LinearLayout
+        android:layout_height="@dimen/toolbar_height" />
+    <include
+        layout="@layout/title_bar_autologin"
         android:id="@+id/autologin"
-        android:background="#FBF0A0"
-        android:gravity="center_vertical"
         android:paddingTop="3dip"
-        android:visibility="gone"
-        android:layout_below="@+id/taburlbar"
+        android:layout_below="@id/taburlbar"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical">
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingLeft="8dip"
-            android:paddingRight="8dip">
-            <TextView
-                android:text="@string/autologin_bar_text"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textColor="@android:color/primary_text_light"
-                android:textAppearance="?android:attr/textAppearanceMedium" />
-            <Spinner
-                android:id="@+id/autologin_account"
-                android:layout_height="wrap_content"
-                android:layout_width="match_parent"
-                android:paddingLeft="8dp"
-                android:paddingRight="24dp"
-                style="@android:style/Widget.Holo.Light.Spinner" />
-        </LinearLayout>
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingLeft="8dip"
-            android:paddingRight="8dip">
-            <Button
-                android:id="@+id/autologin_close"
-                android:layout_width="0dip"
-                android:layout_weight="1"
-                android:layout_height="wrap_content"
-                android:text="@string/autologin_bar_hide_text"
-                style="@android:style/Widget.Holo.Light.Button" />
-            <ProgressBar
-                android:id="@+id/autologin_progress"
-                android:indeterminateOnly="true"
-                android:layout_height="wrap_content"
-                android:layout_width="wrap_content"
-                android:visibility="invisible" />
-            <Button
-                android:id="@+id/autologin_login"
-                android:text="@string/autologin_bar_login_text"
-                style="@android:style/Widget.Holo.Light.Button"
-                android:layout_height="wrap_content"
-                android:layout_width="0dip"
-                android:layout_weight="1" />
-        </LinearLayout>
-        <TextView
-            android:id="@+id/autologin_error"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:textColor="#dd6826"
-            android:text="@string/autologin_bar_error"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:visibility="gone" />
-    </LinearLayout>
+        android:layout_height="wrap_content" />
     <com.android.browser.PageProgressView
         android:id="@+id/progress"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:background="@null"
-        android:layout_below="@+id/taburlbar"
+        android:layout_below="@id/taburlbar"
         android:src="@drawable/progress"
-        android:layout_marginTop="-8dip"
+        android:layout_marginTop="@dimen/progress_bar_margin"
         android:visibility="gone" />
 </RelativeLayout>
diff --git a/res/layout/title_bar_autologin.xml b/res/layout/title_bar_autologin.xml
new file mode 100644
index 0000000..839f875
--- /dev/null
+++ b/res/layout/title_bar_autologin.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+   Copyright 2011, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<com.android.browser.AutologinBar
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:background="#FBF0A0"
+    android:gravity="center_vertical"
+    android:visibility="gone"
+    android:orientation="vertical">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingLeft="8dip"
+        android:paddingRight="8dip">
+        <TextView
+            android:text="@string/autologin_bar_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@android:color/primary_text_light"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
+        <Spinner
+            android:id="@+id/autologin_account"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:paddingLeft="8dp"
+            android:paddingRight="24dp"
+            style="@android:style/Widget.Holo.Light.Spinner" />
+    </LinearLayout>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingLeft="8dip"
+        android:paddingRight="8dip">
+        <Button
+            android:id="@+id/autologin_close"
+            android:layout_width="0dip"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            android:text="@string/autologin_bar_hide_text"
+            style="@android:style/Widget.Holo.Light.Button" />
+        <ProgressBar
+            android:id="@+id/autologin_progress"
+            android:indeterminateOnly="true"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:visibility="invisible" />
+        <Button
+            android:id="@+id/autologin_login"
+            android:text="@string/autologin_bar_login_text"
+            style="@android:style/Widget.Holo.Light.Button"
+            android:layout_height="wrap_content"
+            android:layout_width="0dip"
+            android:layout_weight="1" />
+    </LinearLayout>
+    <TextView
+        android:id="@+id/autologin_error"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:textColor="#dd6826"
+        android:text="@string/autologin_bar_error"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:visibility="gone" />
+</com.android.browser.AutologinBar>
diff --git a/res/layout/title_bar_nav.xml b/res/layout/title_bar_nav.xml
new file mode 100644
index 0000000..5a3c10e
--- /dev/null
+++ b/res/layout/title_bar_nav.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+   Copyright 2011, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<com.android.browser.NavigationBarPhone
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:background="@drawable/bg_urlbar">
+    <LinearLayout
+        android:id="@+id/title_bg"
+        android:layout_width="0dip"
+        android:layout_weight="1.0"
+        android:layout_height="match_parent"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+        <FrameLayout
+            android:id="@+id/iconcombo"
+            android:layout_width="52dip"
+            android:layout_height="match_parent"
+            style="@style/HoloButton">
+            <ImageView
+                android:id="@+id/favicon"
+                android:layout_width="36dip"
+                android:layout_height="36dip"
+                android:paddingLeft="8dip"
+                android:paddingRight="8dip"
+                android:layout_gravity="center_vertical" />
+            <ImageView
+                android:id="@+id/lock"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="bottom|right"
+                android:visibility="gone" />
+        </FrameLayout>
+        <ImageView
+            android:id="@+id/stop"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:src="@drawable/ic_stop_holo_dark"
+            style="@style/HoloButton" />
+        <com.android.browser.UrlInputView
+            android:id="@+id/url"
+            android:focusable="true"
+            android:layout_width="0dip"
+            android:layout_weight="1.0"
+            android:layout_height="match_parent"
+            android:fadingEdge="horizontal"
+            android:fadingEdgeLength="24dip"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:hint="@string/search_hint"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:lines="1"
+            android:scrollHorizontally="true"
+            android:inputType="text"
+            android:imeOptions="actionGo"
+            style="@style/Suggestions"
+            android:background="@null" />
+        <ImageView
+            android:id="@+id/voice"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:src="@drawable/ic_voice_search_holo_dark"
+            style="@style/HoloButton"
+            android:visibility="gone" />
+    </LinearLayout>
+    <ImageButton
+        android:id="@+id/tab_switcher"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:src="@drawable/ic_windows_holo_dark"
+        style="@style/HoloButton" />
+    <ImageButton
+        android:id="@+id/more"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        style="@style/HoloButton"
+        android:gravity="center_vertical"
+        android:src="@*android:drawable/ic_menu_moreoverflow_normal_holo_dark" />
+</com.android.browser.NavigationBarPhone>
diff --git a/res/layout/url_bar.xml b/res/layout/url_bar.xml
deleted file mode 100644
index 3864b7d..0000000
--- a/res/layout/url_bar.xml
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-    <!--
-        Copyright 2010, The Android Open Source Project Licensed under the
-        Apache License, Version 2.0 (the "License"); you may not use this file
-        except in compliance with the License. You may obtain a copy of the
-        License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by
-        applicable law or agreed to in writing, software distributed under the
-        License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-        CONDITIONS OF ANY KIND, either express or implied. See the License for
-        the specific language governing permissions and limitations under the
-        License.
-    -->
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    >
-    <LinearLayout
-        android:id="@+id/autologin"
-        android:background="#FBF0A0"
-        android:gravity="center_vertical"
-        android:paddingTop="3dip"
-        android:visibility="gone"
-        android:layout_below="@+id/taburlbar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-        <TextView
-            android:text="@string/autologin_bar_text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textColor="@android:color/primary_text_light"
-            android:paddingLeft="15dip"
-            android:paddingRight="15dip"
-            android:textAppearance="?android:attr/textAppearanceMedium"/>
-        <Spinner
-            android:id="@+id/autologin_account"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            style="@android:style/Widget.Holo.Light.Spinner" />
-        <Button
-            android:id="@+id/autologin_login"
-            android:text="@string/autologin_bar_login_text"
-            style="@android:style/Widget.Holo.Light.Button"
-            android:layout_marginRight="15dip"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content" />
-        <ProgressBar
-            android:id="@+id/autologin_progress"
-            android:indeterminateOnly="true"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:visibility="gone" />
-        <TextView
-            android:id="@+id/autologin_error"
-            android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:textColor="#dd6826"
-            android:text="@string/autologin_bar_error"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:visibility="gone" />
-        <View
-            android:layout_width="2dip"
-            android:layout_height="match_parent"
-            android:layout_weight="1"/>
-        <ImageButton
-            android:id="@+id/autologin_close"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:paddingRight="15dip"
-            android:background="@null"
-            android:src="@*android:drawable/btn_close"/>
-    </LinearLayout>
-    <LinearLayout
-        android:id="@+id/taburlbar"
-        android:layout_width="match_parent"
-        android:layout_height="48dip"
-        android:orientation="horizontal"
-        android:background="@drawable/bg_urlbar">
-        <ImageButton
-            android:id="@+id/back"
-            android:src="@drawable/ic_back_holo_dark"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:paddingLeft="16dip"
-            style="@style/HoloButton" />
-        <ImageButton
-            android:id="@+id/forward"
-            android:src="@drawable/ic_forward_holo_dark"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            style="@style/HoloButton" />
-        <ImageButton
-            android:id="@+id/stop"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            style="@style/HoloButton"
-            android:gravity="center_vertical"
-            android:src="@drawable/ic_stop_holo_dark" />
-        <LinearLayout
-            android:id="@+id/urlbar_focused"
-            android:layout_width="0dip"
-            android:layout_height="match_parent"
-            android:layout_weight="1.0"
-            android:layout_marginLeft="8dip"
-            android:layout_marginRight="8dip"
-            android:orientation="horizontal"
-            android:background="@drawable/url_background">
-            <ImageView
-                android:id="@+id/url_icon"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                android:src="@drawable/ic_web_holo_dark"
-                style="@style/HoloIcon" />
-            <ImageView
-                android:id="@+id/lock"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                style="@style/HoloIcon"
-                android:visibility="gone" />
-            <com.android.browser.UrlInputView
-                android:id="@+id/url"
-                android:layout_width="0dip"
-                android:layout_weight="1.0"
-                android:layout_height="match_parent"
-                android:layout_marginLeft="16dip"
-                android:paddingLeft="0dip"
-                android:paddingRight="0dip"
-                android:background="@null"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:hint="@string/search_hint"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:lines="1"
-                android:scrollHorizontally="true"
-                android:inputType="textUri"
-                android:imeOptions="actionGo"
-                style="@style/Suggestions" />
-            <ImageButton
-                android:id="@+id/star"
-                android:src="@drawable/btn_imageview_star"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                style="@style/HoloButton" />
-            <ImageButton
-                android:id="@+id/clear"
-                android:src="@drawable/ic_stop_holo_dark"
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent"
-                style="@style/HoloButton" />
-        </LinearLayout>
-        <ImageButton
-            android:id="@+id/go"
-            android:src="@drawable/ic_go_holo_dark"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:visibility="gone"
-            android:gravity="center_vertical"
-            style="@style/HoloButton" />
-        <ImageButton
-            android:id="@+id/voicesearch"
-            android:src="@drawable/ic_voice_search_holo_dark"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            style="@style/HoloButton" />
-        <ImageButton
-            android:id="@+id/search"
-            android:src="@drawable/ic_search_holo_dark"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:gravity="center_vertical"
-            style="@style/HoloButton" />
-        <ImageButton
-            android:id="@+id/all_btn"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:scaleType="center"
-            android:paddingRight="16dip"
-            style="@style/HoloButton"
-            android:src="@drawable/ic_bookmarks_history_holo_dark" />
-    </LinearLayout>
-    <com.android.browser.PageProgressView
-        android:id="@+id/progress"
-        android:layout_width="match_parent"
-        android:layout_height="22dip"
-        android:background="@null"
-        android:layout_below="@+id/taburlbar"
-        android:src="@drawable/progress"
-        android:layout_marginTop="-11dip"
-        android:visibility="gone" />
-</RelativeLayout>
diff --git a/res/values-sw600dp/dimensions.xml b/res/values-sw600dp/dimensions.xml
index e1ed19e..2c4aaae 100644
--- a/res/values-sw600dp/dimensions.xml
+++ b/res/values-sw600dp/dimensions.xml
@@ -35,4 +35,6 @@
     <dimen name="qc_thumb_height">160dip</dimen>
     <dimen name="qc_item_size">48dip</dimen>
     <dimen name="suggest_item_padding">16dp</dimen>
+    <dimen name="toolbar_height">48dip</dimen>
+    <dimen name="progress_bar_margin">-11dip</dimen>
 </resources>
diff --git a/res/values/dimensions.xml b/res/values/dimensions.xml
index 62deb06..3b57f19 100644
--- a/res/values/dimensions.xml
+++ b/res/values/dimensions.xml
@@ -73,4 +73,5 @@
     <dimen name="nav_tab_text_normal">18sp</dimen>
     <dimen name="nav_tab_text_small">14sp</dimen>
     <dimen name="suggest_item_padding">8dp</dimen>
+    <dimen name="progress_bar_margin">-8dip</dimen>
 </resources>
diff --git a/src/com/android/browser/AutologinBar.java b/src/com/android/browser/AutologinBar.java
new file mode 100644
index 0000000..e57d614
--- /dev/null
+++ b/src/com/android/browser/AutologinBar.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.browser;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.ContextThemeWrapper;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import com.android.browser.DeviceAccountLogin.AutoLoginCallback;
+
+public class AutologinBar extends LinearLayout implements OnClickListener,
+        AutoLoginCallback {
+
+    protected Spinner mAutoLoginAccount;
+    protected Button mAutoLoginLogin;
+    protected ProgressBar mAutoLoginProgress;
+    protected TextView mAutoLoginError;
+    protected View mAutoLoginCancel;
+    protected DeviceAccountLogin mAutoLoginHandler;
+    protected ArrayAdapter<String> mAccountsAdapter;
+    protected TitleBar mTitleBar;
+
+    public AutologinBar(Context context) {
+        super(context);
+    }
+
+    public AutologinBar(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public AutologinBar(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mAutoLoginAccount = (Spinner) findViewById(R.id.autologin_account);
+        mAutoLoginLogin = (Button) findViewById(R.id.autologin_login);
+        mAutoLoginLogin.setOnClickListener(this);
+        mAutoLoginProgress = (ProgressBar) findViewById(R.id.autologin_progress);
+        mAutoLoginError = (TextView) findViewById(R.id.autologin_error);
+        mAutoLoginCancel = findViewById(R.id.autologin_close);
+        mAutoLoginCancel.setOnClickListener(this);
+    }
+
+    public void setTitleBar(TitleBar titleBar) {
+        mTitleBar = titleBar;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (mAutoLoginCancel == v) {
+            if (mAutoLoginHandler != null) {
+                mAutoLoginHandler.cancel();
+                mAutoLoginHandler = null;
+            }
+            hideAutoLogin(true);
+        } else if (mAutoLoginLogin == v) {
+            if (mAutoLoginHandler != null) {
+                mAutoLoginAccount.setEnabled(false);
+                mAutoLoginLogin.setEnabled(false);
+                mAutoLoginProgress.setVisibility(View.VISIBLE);
+                mAutoLoginError.setVisibility(View.GONE);
+                mAutoLoginHandler.login(
+                        mAutoLoginAccount.getSelectedItemPosition(), this);
+            }
+        }
+    }
+
+    public void updateAutoLogin(Tab tab, boolean animate) {
+        DeviceAccountLogin login = tab.getDeviceAccountLogin();
+        if (login != null) {
+            mAutoLoginHandler = login;
+            ContextThemeWrapper wrapper = new ContextThemeWrapper(mContext,
+                    android.R.style.Theme_Holo_Light);
+            mAccountsAdapter = new ArrayAdapter<String>(wrapper,
+                    android.R.layout.simple_spinner_item, login.getAccountNames());
+            mAccountsAdapter.setDropDownViewResource(
+                    android.R.layout.simple_spinner_dropdown_item);
+            mAutoLoginAccount.setAdapter(mAccountsAdapter);
+            mAutoLoginAccount.setSelection(0);
+            mAutoLoginAccount.setEnabled(true);
+            mAutoLoginLogin.setEnabled(true);
+            mAutoLoginProgress.setVisibility(View.INVISIBLE);
+            mAutoLoginError.setVisibility(View.GONE);
+            switch (login.getState()) {
+                case DeviceAccountLogin.PROCESSING:
+                    mAutoLoginAccount.setEnabled(false);
+                    mAutoLoginLogin.setEnabled(false);
+                    mAutoLoginProgress.setVisibility(View.VISIBLE);
+                    break;
+                case DeviceAccountLogin.FAILED:
+                    mAutoLoginProgress.setVisibility(View.INVISIBLE);
+                    mAutoLoginError.setVisibility(View.VISIBLE);
+                    break;
+                case DeviceAccountLogin.INITIAL:
+                    break;
+                default:
+                    throw new IllegalStateException();
+            }
+            showAutoLogin(animate);
+        } else {
+            hideAutoLogin(animate);
+        }
+    }
+
+    void showAutoLogin(boolean animate) {
+        mTitleBar.showAutoLogin(animate);
+    }
+
+    void hideAutoLogin(boolean animate) {
+        mTitleBar.hideAutoLogin(animate);
+    }
+
+    @Override
+    public void loginFailed() {
+        mAutoLoginAccount.setEnabled(true);
+        mAutoLoginLogin.setEnabled(true);
+        mAutoLoginProgress.setVisibility(View.INVISIBLE);
+        mAutoLoginError.setVisibility(View.VISIBLE);
+    }
+
+}
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 9de2c57..5551eca 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -17,7 +17,6 @@
 package com.android.browser;
 
 import android.app.Activity;
-import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -110,6 +109,8 @@
 
     private boolean mActivityPaused;
     protected boolean mUseQuickControls;
+    protected TitleBar mTitleBar;
+    private NavigationBarBase mNavigationBar;
 
     public BaseUi(Activity browser, UiController controller) {
         mActivity = browser;
@@ -140,6 +141,10 @@
                 config.getScaledOverscrollDistance());
         mTitlebarScrollTriggerSlop = Math.max(mTitlebarScrollTriggerSlop,
                 config.getScaledTouchSlop());
+        mTitleBar = new TitleBar(mActivity, mUiController, this,
+                mContentView);
+        mTitleBar.setProgress(100);
+        mNavigationBar = mTitleBar.getNavigationBar();
     }
 
     private void cancelStopToast() {
@@ -170,6 +175,10 @@
     public void onConfigurationChanged(Configuration config) {
     }
 
+    public Activity getActivity() {
+        return mActivity;
+    }
+
     // key handling
 
     @Override
@@ -205,7 +214,7 @@
     public void bookmarkedStatusHasChanged(Tab tab) {
         if (tab.inForeground()) {
             boolean isBookmark = tab.isBookmarkedSite();
-            getTitleBar().setCurrentUrlIsBookmark(isBookmark);
+            mNavigationBar.setCurrentUrlIsBookmark(isBookmark);
         }
     }
 
@@ -248,10 +257,10 @@
         onTabDataChanged(tab);
         onProgressChanged(tab);
         boolean incognito = mActiveTab.getWebView().isPrivateBrowsingEnabled();
-        getTitleBar().setIncognitoMode(incognito);
+        mNavigationBar.setIncognitoMode(incognito);
         updateAutoLogin(tab, false);
         if (web != null && web.getVisibleTitleHeight()
-                != getTitleBar().getEmbeddedHeight()
+                != mTitleBar.getEmbeddedHeight()
                 && !mUseQuickControls) {
             showTitleBarForDuration();
         }
@@ -422,7 +431,7 @@
             mUiController.endActionMode();
         }
         showTitleBar();
-        getTitleBar().startEditingUrl(clearInput);
+        mNavigationBar.startEditingUrl(clearInput);
     }
 
     boolean canShowTitleBar() {
@@ -433,27 +442,29 @@
                 && !mUiController.isInCustomActionMode();
     }
 
-    void showTitleBar() {
+    protected void showTitleBar() {
         if (canShowTitleBar()) {
-            getTitleBar().show();
+            mTitleBar.show();
         }
     }
 
     protected void hideTitleBar() {
-        if (getTitleBar().isShowing()) {
-            getTitleBar().hide();
+        if (mTitleBar.isShowing()) {
+            mTitleBar.hide();
         }
     }
 
     protected boolean isTitleBarShowing() {
-        return getTitleBar().isShowing();
+        return mTitleBar.isShowing();
     }
 
     public boolean isEditingUrl() {
-        return getTitleBar().isEditingUrl();
+        return mTitleBar.isEditingUrl();
     }
 
-    protected abstract TitleBarBase getTitleBar();
+    public TitleBar getTitleBar() {
+        return mTitleBar;
+    }
 
     protected void setTitleGravity(int gravity) {
         WebView web = getWebView();
@@ -464,20 +475,20 @@
 
     @Override
     public void showVoiceTitleBar(String title, List<String> results) {
-        getTitleBar().setInVoiceMode(true, results);
-        getTitleBar().setDisplayTitle(title);
+        mNavigationBar.setInVoiceMode(true, results);
+        mNavigationBar.setDisplayTitle(title);
     }
 
     @Override
     public void revertVoiceTitleBar(Tab tab) {
-        getTitleBar().setInVoiceMode(false, null);
+        mNavigationBar.setInVoiceMode(false, null);
         String url = tab.getUrl();
-        getTitleBar().setDisplayTitle(url);
+        mNavigationBar.setDisplayTitle(url);
     }
 
     @Override
     public void registerDropdownChangeListener(DropdownChangeListener d) {
-        getTitleBar().registerDropdownChangeListener(d);
+        mNavigationBar.registerDropdownChangeListener(d);
     }
 
     @Override
@@ -492,7 +503,7 @@
         FrameLayout wrapper =
             (FrameLayout) mContentView.findViewById(R.id.webview_wrapper);
         wrapper.setVisibility(View.GONE);
-        getTitleBar().stopEditingUrl();
+        mNavigationBar.stopEditingUrl();
         dismissIME();
         hideTitleBar();
         if (mActiveTab != null) {
@@ -599,7 +610,7 @@
     }
 
     protected void updateAutoLogin(Tab tab, boolean animate) {
-        getTitleBar().updateAutoLogin(tab, animate);
+        mTitleBar.updateAutoLogin(tab, animate);
     }
 
     /**
@@ -621,7 +632,7 @@
         } else if (lockIconType == LockIcon.LOCK_ICON_MIXED) {
             d = mMixLockIcon;
         }
-        getTitleBar().setLock(d);
+        mNavigationBar.setLock(d);
     }
 
     protected void setUrlTitle(Tab tab) {
@@ -632,7 +643,7 @@
         }
         if (tab.isInVoiceSearchMode()) return;
         if (tab.inForeground()) {
-            getTitleBar().setDisplayTitle(url);
+            mNavigationBar.setDisplayTitle(url);
         }
     }
 
@@ -640,7 +651,7 @@
     protected void setFavicon(Tab tab) {
         if (tab.inForeground()) {
             Bitmap icon = tab.getFavicon();
-            getTitleBar().setFavicon(icon);
+            mNavigationBar.setFavicon(icon);
         }
     }
 
@@ -793,7 +804,7 @@
         }
     }
 
-    protected Drawable getFaviconDrawable(Bitmap icon) {
+    public Drawable getFaviconDrawable(Bitmap icon) {
         Drawable[] array = new Drawable[3];
         array[0] = new PaintDrawable(Color.BLACK);
         PaintDrawable p = new PaintDrawable(Color.WHITE);
@@ -819,7 +830,7 @@
      * as if the user is editing the URL bar or if the page is loading
      */
     public void suggestHideTitleBar() {
-        if (!isLoading() && !isEditingUrl()) {
+        if (!isLoading() && !isEditingUrl() && !mTitleBar.inAutoLogin()) {
             hideTitleBar();
         }
     }
diff --git a/src/com/android/browser/BrowserWebView.java b/src/com/android/browser/BrowserWebView.java
index 80f4a53..cd29135 100644
--- a/src/com/android/browser/BrowserWebView.java
+++ b/src/com/android/browser/BrowserWebView.java
@@ -33,7 +33,7 @@
 public class BrowserWebView extends WebView {
 
     private boolean mBackgroundRemoved = false;
-    private TitleBarBase mTitleBar;
+    private TitleBar mTitleBar;
     private int mCaptureSize;
     private Bitmap mCapture;
     private WebProxyView mProxyView;
@@ -107,7 +107,7 @@
     @Override
     public void setEmbeddedTitleBar(final View title) {
         super.setEmbeddedTitleBar(title);
-        mTitleBar = (TitleBarBase) title;
+        mTitleBar = (TitleBar) title;
     }
 
     public boolean hasTitleBar() {
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index f4563bd..116f0e0 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -1287,7 +1287,7 @@
 
     protected void onCreateContextMenu(ContextMenu menu, View v,
             ContextMenuInfo menuInfo) {
-        if (v instanceof TitleBarBase) {
+        if (v instanceof TitleBar) {
             return;
         }
         if (!(v instanceof WebView)) {
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
new file mode 100644
index 0000000..a059352
--- /dev/null
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.browser;
+
+import android.app.SearchManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.speech.RecognizerResultsIntent;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnFocusChangeListener;
+import android.webkit.WebView;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnMenuItemClickListener;
+
+import com.android.browser.UI.DropdownChangeListener;
+import com.android.browser.UrlInputView.UrlInputListener;
+import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
+
+import java.util.List;
+
+public class NavigationBarBase extends LinearLayout implements OnClickListener,
+        OnMenuItemClickListener, UrlInputListener, OnFocusChangeListener,
+        TextChangeWatcher {
+
+    protected BaseUi mBaseUi;
+    protected TitleBar mTitleBar;
+    protected UiController mUiController;
+    protected UrlInputView mUrlInput;
+    protected boolean mInVoiceMode = false;
+
+    private ImageView mFavicon;
+    private ImageView mLockIcon;
+    private View mUaSwitcher;
+
+    public NavigationBarBase(Context context) {
+        super(context);
+    }
+
+    public NavigationBarBase(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public NavigationBarBase(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mLockIcon = (ImageView) findViewById(R.id.lock);
+        mFavicon = (ImageView) findViewById(R.id.favicon);
+        mUrlInput = (UrlInputView) findViewById(R.id.url);
+        mUrlInput.setUrlInputListener(this);
+        mUrlInput.setController(mUiController);
+        mUrlInput.setOnFocusChangeListener(this);
+        mUrlInput.setSelectAllOnFocus(true);
+        mUrlInput.addQueryTextWatcher(this);
+    }
+
+    public void setTitleBar(TitleBar titleBar) {
+        mTitleBar = titleBar;
+        mBaseUi = mTitleBar.getUi();
+        mUiController = mTitleBar.getUiController();
+    }
+
+    public void setLock(Drawable d) {
+        if (mLockIcon == null) return;
+        if (d == null) {
+            mLockIcon.setVisibility(View.GONE);
+        } else {
+            mLockIcon.setImageDrawable(d);
+            mLockIcon.setVisibility(View.VISIBLE);
+        }
+    }
+
+    public void setFavicon(Bitmap icon) {
+        if (mFavicon == null) return;
+        mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon));
+    }
+
+    public void setUaSwitcher(View v) {
+        if (mUaSwitcher != null) {
+            mUaSwitcher.setOnClickListener(null);
+        }
+        mUaSwitcher = v;
+        mUaSwitcher.setOnClickListener(this);
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (mUaSwitcher == v) {
+            BrowserSettings settings = BrowserSettings.getInstance();
+            WebView web = mTitleBar.getCurrentWebView();
+            if (web == null) return;
+            boolean desktop = settings.hasDesktopUseragent(web);
+            PopupMenu popup = new PopupMenu(mContext, mUaSwitcher);
+            Menu menu = popup.getMenu();
+            popup.getMenuInflater().inflate(R.menu.ua_switcher, menu);
+            menu.findItem(R.id.ua_mobile_menu_id).setChecked(!desktop);
+            menu.findItem(R.id.ua_desktop_menu_id).setChecked(desktop);
+            popup.setOnMenuItemClickListener(this);
+            popup.show();
+        }
+    }
+
+    @Override
+    public boolean onMenuItemClick(MenuItem item) {
+        BrowserSettings settings = BrowserSettings.getInstance();
+        WebView web = mTitleBar.getCurrentWebView();
+        if (web == null) return false;
+        boolean desktop = settings.hasDesktopUseragent(web);
+        switch (item.getItemId()) {
+        case R.id.ua_mobile_menu_id:
+            if (desktop) {
+                settings.toggleDesktopUseragent(web);
+                web.loadUrl(web.getOriginalUrl());
+            }
+            return true;
+        case R.id.ua_desktop_menu_id:
+            if (!desktop) {
+                settings.toggleDesktopUseragent(web);
+                web.loadUrl(web.getOriginalUrl());
+            }
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void onFocusChange(View view, boolean hasFocus) {
+        // if losing focus and not in touch mode, leave as is
+        if (hasFocus || view.isInTouchMode() || mUrlInput.needsUpdate()) {
+            setFocusState(hasFocus);
+        }
+        if (hasFocus) {
+            mBaseUi.showTitleBar();
+            mUrlInput.forceIme();
+            if (mInVoiceMode) {
+                mUrlInput.forceFilter();
+            }
+        } else if (!mUrlInput.needsUpdate()) {
+            mUrlInput.dismissDropDown();
+            mUrlInput.hideIME();
+            if (mUrlInput.getText().length() == 0) {
+                Tab currentTab = mUiController.getTabControl().getCurrentTab();
+                if (currentTab != null) {
+                    mUrlInput.setText(currentTab.getUrl(), false);
+                }
+            }
+            mBaseUi.suggestHideTitleBar();
+        }
+        mUrlInput.clearNeedsUpdate();
+    }
+
+    protected void setFocusState(boolean focus) {
+    }
+
+    protected void setSearchMode(boolean voiceSearchEnabled) {}
+
+    public boolean isEditingUrl() {
+        return mUrlInput.hasFocus();
+    }
+
+    void stopEditingUrl() {
+        mUrlInput.clearFocus();
+    }
+
+    void setDisplayTitle(String title) {
+        if (!isEditingUrl()) {
+            mUrlInput.setText(title, false);
+        }
+    }
+
+    // UrlInput text watcher
+
+    @Override
+    public void onTextChanged(String newText) {
+        if (mUrlInput.hasFocus()) {
+            // clear voice mode when user types
+            setInVoiceMode(false, null);
+        }
+    }
+
+    // voicesearch
+
+    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
+        mInVoiceMode = voicemode;
+        mUrlInput.setVoiceResults(voiceResults);
+    }
+
+    void setIncognitoMode(boolean incognito) {
+        mUrlInput.setIncognitoMode(incognito);
+    }
+
+    void clearCompletions() {
+        mUrlInput.setSuggestedText(null);
+    }
+
+ // UrlInputListener implementation
+
+    /**
+     * callback from suggestion dropdown
+     * user selected a suggestion
+     */
+    @Override
+    public void onAction(String text, String extra, String source) {
+        mUiController.getCurrentTopWebView().requestFocus();
+        if (UrlInputView.TYPED.equals(source)) {
+            String url = UrlUtils.smartUrlFilter(text, false);
+            Tab t = mBaseUi.getActiveTab();
+            // Only shortcut javascript URIs for now, as there is special
+            // logic in UrlHandler for other schemas
+            if (url != null && t != null && url.startsWith("javascript:")) {
+                mUiController.loadUrl(t, url);
+                setDisplayTitle(text);
+                return;
+            }
+        }
+        Intent i = new Intent();
+        String action = null;
+        if (UrlInputView.VOICE.equals(source)) {
+            action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS;
+            source = null;
+        } else {
+            action = Intent.ACTION_SEARCH;
+        }
+        i.setAction(action);
+        i.putExtra(SearchManager.QUERY, text);
+        if (extra != null) {
+            i.putExtra(SearchManager.EXTRA_DATA_KEY, extra);
+        }
+        if (source != null) {
+            Bundle appData = new Bundle();
+            appData.putString(com.android.common.Search.SOURCE, source);
+            i.putExtra(SearchManager.APP_DATA, appData);
+        }
+        mUiController.handleNewIntent(i);
+        setDisplayTitle(text);
+    }
+
+    @Override
+    public void onDismiss() {
+        final Tab currentTab = mBaseUi.getActiveTab();
+        mBaseUi.hideTitleBar();
+        post(new Runnable() {
+            public void run() {
+                clearFocus();
+                if ((currentTab != null) && !mInVoiceMode) {
+                    setDisplayTitle(currentTab.getUrl());
+                }
+            }
+        });
+    }
+
+    /**
+     * callback from the suggestion dropdown
+     * copy text to input field and stay in edit mode
+     */
+    @Override
+    public void onCopySuggestion(String text) {
+        mUrlInput.setText(text, true);
+        if (text != null) {
+            mUrlInput.setSelection(text.length());
+        }
+    }
+
+    public void setCurrentUrlIsBookmark(boolean isBookmark) {
+    }
+
+    @Override
+    public boolean dispatchKeyEventPreIme(KeyEvent evt) {
+        if (evt.getKeyCode() == KeyEvent.KEYCODE_BACK) {
+            // catch back key in order to do slightly more cleanup than usual
+            mUrlInput.clearFocus();
+            return true;
+        }
+        return super.dispatchKeyEventPreIme(evt);
+    }
+
+    void registerDropdownChangeListener(DropdownChangeListener d) {
+        mUrlInput.registerDropdownChangeListener(d);
+    }
+
+    /**
+     * called from the Ui when the user wants to edit
+     * @param clearInput clear the input field
+     */
+    void startEditingUrl(boolean clearInput) {
+        // editing takes preference of progress
+        setVisibility(View.VISIBLE);
+        if (mTitleBar.useQuickControls()) {
+            mTitleBar.getProgressView().setVisibility(View.GONE);
+        }
+        if (!mUrlInput.hasFocus()) {
+            mUrlInput.requestFocus();
+        }
+        if (clearInput) {
+            mUrlInput.setText("");
+        } else if (mInVoiceMode) {
+            mUrlInput.showDropDown();
+        }
+    }
+
+    public void onProgressStarted() {
+    }
+
+    public void onProgressStopped() {
+    }
+
+}
diff --git a/src/com/android/browser/TitleBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
similarity index 72%
rename from src/com/android/browser/TitleBarPhone.java
rename to src/com/android/browser/NavigationBarPhone.java
index 66b4648..c0ce428 100644
--- a/src/com/android/browser/TitleBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2011 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,40 +13,29 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package com.android.browser;
 
 import android.app.Activity;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
 import android.view.ContextMenu;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
 import android.view.ViewConfiguration;
 import android.webkit.WebView;
-import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.PopupMenu;
 import android.widget.PopupMenu.OnDismissListener;
 
 import com.android.browser.UrlInputView.StateListener;
-import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
 
-import java.util.List;
+public class NavigationBarPhone extends NavigationBarBase implements
+        StateListener, OnDismissListener {
 
-/**
- * This class represents a title bar for a particular "tab" or "window" in the
- * browser.
- */
-public class TitleBarPhone extends TitleBarBase implements OnFocusChangeListener,
-        OnClickListener, TextChangeWatcher, StateListener, OnDismissListener {
-
-    private Activity mActivity;
     private ImageView mStopButton;
     private ImageView mVoiceButton;
     private Drawable mStopDrawable;
@@ -59,19 +48,21 @@
     private boolean mMenuShowing;
     private boolean mNeedsMenu;
 
-    public TitleBarPhone(Activity activity, UiController controller, PhoneUi ui,
-            FrameLayout parent) {
-        super(activity, controller, ui, parent);
-        mNeedsMenu = !ViewConfiguration.get(activity).hasPermanentMenuKey();
-        mActivity = activity;
-        initLayout(activity, R.layout.title_bar);
+    public NavigationBarPhone(Context context) {
+        super(context);
+    }
+
+    public NavigationBarPhone(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public NavigationBarPhone(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
     }
 
     @Override
-    protected void initLayout(Context context, int layoutId) {
-        super.initLayout(context, layoutId);
-        mLockIcon = (ImageView) findViewById(R.id.lock);
-        mFavicon = (ImageView) findViewById(R.id.favicon);
+    protected void onFinishInflate() {
+        super.onFinishInflate();
         mStopButton = (ImageView) findViewById(R.id.stop);
         mStopButton.setOnClickListener(this);
         mVoiceButton = (ImageView) findViewById(R.id.voice);
@@ -83,25 +74,22 @@
         mComboIcon = findViewById(R.id.iconcombo);
         mTitleContainer = findViewById(R.id.title_bg);
         setFocusState(false);
-        Resources res = context.getResources();
+        Resources res = getContext().getResources();
         mStopDrawable = res.getDrawable(R.drawable.ic_stop_holo_dark);
         mRefreshDrawable = res.getDrawable(R.drawable.ic_refresh_holo_dark);
         mTextfieldBgDrawable = res.getDrawable(R.drawable.textfield_active_holo_dark);
         setUaSwitcher(mComboIcon);
         mUrlInput.setContainer(this);
         mUrlInput.setStateListener(this);
+        mNeedsMenu = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
     }
 
     @Override
     public void createContextMenu(ContextMenu menu) {
-        MenuInflater inflater = mActivity.getMenuInflater();
+        Activity activity = mBaseUi.getActivity();
+        MenuInflater inflater = activity.getMenuInflater();
         inflater.inflate(R.menu.title_context, menu);
-        mActivity.onCreateContextMenu(menu, this, null);
-    }
-
-    @Override
-    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
-        super.setInVoiceMode(voicemode, voiceResults);
+        activity.onCreateContextMenu(menu, this, null);
     }
 
     @Override
@@ -113,22 +101,24 @@
     }
 
     @Override
-    void setProgress(int progress) {
-        super.setProgress(progress);
-        if (progress == 100) {
-            mStopButton.setVisibility(View.GONE);
-            mStopButton.setImageDrawable(mRefreshDrawable);
-            if (!isEditingUrl()) {
-                mComboIcon.setVisibility(View.VISIBLE);
+    public void onProgressStarted() {
+        super.onProgressStarted();
+        if (mStopButton.getDrawable() != mStopDrawable) {
+            mStopButton.setImageDrawable(mStopDrawable);
+            if (mStopButton.getVisibility() != View.VISIBLE) {
+                mComboIcon.setVisibility(View.GONE);
+                mStopButton.setVisibility(View.VISIBLE);
             }
-        } else {
-            if (mStopButton.getDrawable() != mStopDrawable) {
-                mStopButton.setImageDrawable(mStopDrawable);
-                if (mStopButton.getVisibility() != View.VISIBLE) {
-                    mComboIcon.setVisibility(View.GONE);
-                    mStopButton.setVisibility(View.VISIBLE);
-                }
-            }
+        }
+    }
+
+    @Override
+    public void onProgressStopped() {
+        super.onProgressStopped();
+        mStopButton.setVisibility(View.GONE);
+        mStopButton.setImageDrawable(mRefreshDrawable);
+        if (!isEditingUrl()) {
+            mComboIcon.setVisibility(View.VISIBLE);
         }
     }
 
@@ -150,19 +140,9 @@
     }
 
     @Override
-    public void onFocusChange(View v, boolean hasFocus) {
-        if (v == mUrlInput) {
-            if (hasFocus) {
-                mActivity.closeOptionsMenu();
-            }
-        }
-        super.onFocusChange(v, hasFocus);
-    }
-
-    @Override
     public void onClick(View v) {
         if (v == mStopButton) {
-            if (mInLoad) {
+            if (mTitleBar.isInLoad()) {
                 mUiController.stopLoading();
             } else {
                 WebView web = mBaseUi.getWebView();
@@ -246,5 +226,4 @@
             break;
         }
     }
-
 }
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/NavigationBarTablet.java
similarity index 81%
rename from src/com/android/browser/TitleBarXLarge.java
rename to src/com/android/browser/NavigationBarTablet.java
index 6aed86c..b7b3ed9 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2011 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,38 +13,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package com.android.browser;
 
-import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
-
-import android.app.Activity;
 import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
-import android.preference.PreferenceManager;
 import android.text.TextUtils;
+import android.util.AttributeSet;
 import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
 import android.webkit.WebView;
-import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 
 import java.util.List;
 
-/**
- * tabbed title bar for xlarge screen browser
- */
-public class TitleBarXLarge extends TitleBarBase
-        implements OnClickListener, OnFocusChangeListener, TextChangeWatcher,
-        DeviceAccountLogin.AutoLoginCallback {
-
-    private XLargeUi mUi;
+public class NavigationBarTablet extends NavigationBarBase {
 
     private Drawable mStopDrawable;
     private Drawable mReloadDrawable;
@@ -63,24 +46,34 @@
     private Drawable mFocusDrawable;
     private Drawable mUnfocusDrawable;
 
-    public TitleBarXLarge(Activity activity, UiController controller,
-            XLargeUi ui, FrameLayout parent) {
-        super(activity, controller, ui, parent);
-        mUi = ui;
-        Resources resources = activity.getResources();
+    public NavigationBarTablet(Context context) {
+        super(context);
+        init(context);
+    }
+
+    public NavigationBarTablet(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    public NavigationBarTablet(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(context);
+    }
+
+    private void init(Context context) {
+        Resources resources = context.getResources();
         mStopDrawable = resources.getDrawable(R.drawable.ic_stop_holo_dark);
         mReloadDrawable = resources.getDrawable(R.drawable.ic_refresh_holo_dark);
         mFocusDrawable = resources.getDrawable(
                 R.drawable.textfield_active_holo_dark);
         mUnfocusDrawable = resources.getDrawable(
                 R.drawable.textfield_default_holo_dark);
-        mInVoiceMode = false;
-        initLayout(activity, R.layout.url_bar);
     }
 
     @Override
-    protected void initLayout(Context context, int layoutId) {
-        super.initLayout(context, layoutId);
+    protected void onFinishInflate() {
+        super.onFinishInflate();
         mAllButton = findViewById(R.id.all_btn);
         // TODO: Change enabled states based on whether you can go
         // back/forward.  Probably should be done inside onPageStarted.
@@ -90,7 +83,6 @@
         mStar = (ImageView) findViewById(R.id.star);
         mStopButton = (ImageView) findViewById(R.id.stop);
         mSearchButton = (ImageView) findViewById(R.id.search);
-        mLockIcon = (ImageView) findViewById(R.id.lock);
         mGoButton = findViewById(R.id.go);
         mClearButton = findViewById(R.id.clear);
         mVoiceSearch = (ImageView) findViewById(R.id.voicesearch);
@@ -106,6 +98,11 @@
         mVoiceSearch.setOnClickListener(this);
         setUaSwitcher(mUrlIcon);
         mUrlInput.setContainer(mUrlContainer);
+    }
+
+    @Override
+    public void setTitleBar(TitleBar titleBar) {
+        super.setTitleBar(titleBar);
         setFocusState(false);
     }
 
@@ -127,7 +124,6 @@
         mStar.setActivated(isBookmark);
     }
 
-
     @Override
     public void onClick(View v) {
         if (mBackButton == v) {
@@ -139,7 +135,7 @@
         } else if (mAllButton == v) {
             mUiController.bookmarksOrHistoryPicker(false);
         } else if (mSearchButton == v) {
-            mUi.editUrl(true);
+            mBaseUi.editUrl(true);
         } else if (mStopButton == v) {
             stopOrRefresh();
         } else if (mGoButton == v) {
@@ -156,9 +152,6 @@
         }
     }
 
-    @Override
-    void setFavicon(Bitmap icon) { }
-
     private void clearOrClose() {
         if (TextUtils.isEmpty(mUrlInput.getUserText())) {
             // close
@@ -189,7 +182,7 @@
             mVoiceSearch.setVisibility(View.GONE);
             mStar.setVisibility(View.VISIBLE);
             mClearButton.setVisibility(View.GONE);
-            if (mUseQuickControls) {
+            if (mTitleBar.useQuickControls()) {
                 mSearchButton.setVisibility(View.GONE);
             } else {
                 mSearchButton.setVisibility(View.VISIBLE);
@@ -201,7 +194,7 @@
     }
 
     private void stopOrRefresh() {
-        if (mInLoad) {
+        if (mTitleBar.isInLoad()) {
             mUiController.stopLoading();
         } else {
             mUiController.getCurrentTopWebView().reload();
@@ -209,12 +202,12 @@
     }
 
     @Override
-    protected void onProgressStarted() {
+    public void onProgressStarted() {
         mStopButton.setImageDrawable(mStopDrawable);
     }
 
     @Override
-    protected void onProgressStopped() {
+    public void onProgressStopped() {
         mStopButton.setImageDrawable(mReloadDrawable);
     }
 
@@ -240,12 +233,4 @@
         }
     }
 
-    @Override
-    public View focusSearch(View focused, int dir) {
-        if (FOCUS_DOWN == dir && hasFocus()) {
-            return getCurrentWebView();
-        }
-        return super.focusSearch(focused, dir);
-    }
-
 }
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index d1db578..8b0c146 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -34,10 +34,10 @@
 
     private static final String LOGTAG = "PhoneUi";
 
-    private TitleBarPhone mTitleBar;
     private ActiveTabsPage mActiveTabsPage;
     private PieControlPhone mPieControl;
     private NavScreen mNavScreen;
+    private NavigationBarPhone mNavigationBar;
 
     boolean mExtendedMenuOpen;
     boolean mOptionsMenuOpen;
@@ -49,13 +49,9 @@
      */
     public PhoneUi(Activity browser, UiController controller) {
         super(browser, controller);
-        mTitleBar = new TitleBarPhone(mActivity, mUiController, this,
-                mContentView);
-        // mTitleBar will be always be shown in the fully loaded mode on
-        // phone
-        mTitleBar.setProgress(100);
         mActivity.getActionBar().hide();
         setUseQuickControls(BrowserSettings.getInstance().useQuickControls());
+        mNavigationBar = (NavigationBarPhone) mTitleBar.getNavigationBar();
     }
 
     @Override
@@ -86,7 +82,7 @@
     @Override
     public void editUrl(boolean clearInput) {
         if (mUseQuickControls) {
-            getTitleBar().setShowProgressOnly(false);
+            mTitleBar.setShowProgressOnly(false);
         }
         super.editUrl(clearInput);
     }
@@ -178,11 +174,6 @@
         tab.getTopWindow().requestFocus();
     }
 
-    @Override
-    protected TitleBarBase getTitleBar() {
-        return mTitleBar;
-    }
-
     /**
      * 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
@@ -190,8 +181,8 @@
      */
     @Override
     public void suggestHideTitleBar() {
-        if (!isLoading() && !isEditingUrl() && !mTitleBar.isMenuShowing()) {
-            hideTitleBar();
+        if (!mNavigationBar.isMenuShowing()) {
+            super.suggestHideTitleBar();
         }
     }
 
@@ -266,9 +257,9 @@
     protected void setTitleGravity(int gravity) {
         if (mUseQuickControls) {
             FrameLayout.LayoutParams lp =
-                    (FrameLayout.LayoutParams) getTitleBar().getLayoutParams();
+                    (FrameLayout.LayoutParams) mTitleBar.getLayoutParams();
             lp.gravity = gravity;
-            getTitleBar().setLayoutParams(lp);
+            mTitleBar.setLayoutParams(lp);
         } else {
             super.setTitleGravity(gravity);
         }
@@ -277,7 +268,7 @@
     @Override
     public void setUseQuickControls(boolean useQuickControls) {
         mUseQuickControls = useQuickControls;
-        getTitleBar().setUseQuickControls(mUseQuickControls);
+        mTitleBar.setUseQuickControls(mUseQuickControls);
         if (useQuickControls) {
             mPieControl = new PieControlPhone(mActivity, mUiController, this);
             mPieControl.attachToContainer(mContentView);
diff --git a/src/com/android/browser/TitleBar.java b/src/com/android/browser/TitleBar.java
new file mode 100644
index 0000000..4e93124
--- /dev/null
+++ b/src/com/android/browser/TitleBar.java
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.AnimationUtils;
+import android.view.animation.DecelerateInterpolator;
+import android.webkit.WebView;
+import android.widget.AbsoluteLayout;
+import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
+
+
+/**
+ * Base class for a title bar used by the browser.
+ */
+public class TitleBar extends RelativeLayout {
+
+    private static final int PROGRESS_MAX = 100;
+    private static final float ANIM_TITLEBAR_DECELERATE = 2.5f;
+
+    private UiController mUiController;
+    private BaseUi mBaseUi;
+    private FrameLayout mParent;
+    private PageProgressView mProgress;
+
+    private AutologinBar mAutoLogin;
+    private NavigationBarBase mNavBar;
+    private boolean mUseQuickControls;
+
+    //state
+    private boolean mShowing;
+    private boolean mInLoad;
+    private boolean mSkipTitleBarAnimations;
+    private Animator mTitleBarAnimator;
+
+    public TitleBar(Context context, UiController controller, BaseUi ui,
+            FrameLayout parent) {
+        super(context, null);
+        mUiController = controller;
+        mBaseUi = ui;
+        mParent = parent;
+        initLayout(context);
+    }
+
+    private void initLayout(Context context) {
+        LayoutInflater factory = LayoutInflater.from(context);
+        factory.inflate(R.layout.title_bar, this);
+        mProgress = (PageProgressView) findViewById(R.id.progress);
+        mAutoLogin = (AutologinBar) findViewById(R.id.autologin);
+        mAutoLogin.setTitleBar(this);
+        mNavBar = (NavigationBarBase) findViewById(R.id.taburlbar);
+        mNavBar.setTitleBar(this);
+    }
+
+    public BaseUi getUi() {
+        return mBaseUi;
+    }
+
+    public UiController getUiController() {
+        return mUiController;
+    }
+
+    public void setUseQuickControls(boolean use) {
+        mUseQuickControls = use;
+        setLayoutParams(makeLayoutParams());
+    }
+
+    void setShowProgressOnly(boolean progress) {
+        if (progress && !inAutoLogin()) {
+            mNavBar.setVisibility(View.GONE);
+        } else {
+            mNavBar.setVisibility(View.VISIBLE);
+        }
+    }
+
+    void setSkipTitleBarAnimations(boolean skip) {
+        mSkipTitleBarAnimations = skip;
+    }
+
+    void setupTitleBarAnimator(Animator animator) {
+        Resources res = mContext.getResources();
+        int duration = res.getInteger(R.integer.titlebar_animation_duration);
+        animator.setInterpolator(new DecelerateInterpolator(
+                ANIM_TITLEBAR_DECELERATE));
+        animator.setDuration(duration);
+    }
+
+    void show() {
+        if (mUseQuickControls) {
+            mParent.addView(this);
+        } else {
+            if (!mSkipTitleBarAnimations) {
+                cancelTitleBarAnimation(false);
+                int visibleHeight = getVisibleTitleHeight();
+                float startPos = (-getEmbeddedHeight() + visibleHeight);
+                if (getTranslationY() != 0) {
+                    startPos = Math.max(startPos, getTranslationY());
+                }
+                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
+                        "translationY",
+                        startPos, 0);
+                setupTitleBarAnimator(mTitleBarAnimator);
+                mTitleBarAnimator.start();
+            }
+            mBaseUi.setTitleGravity(Gravity.TOP);
+        }
+        mShowing = true;
+    }
+
+    void hide() {
+        if (mUseQuickControls) {
+            mParent.removeView(this);
+        } else {
+            if (!mSkipTitleBarAnimations) {
+                cancelTitleBarAnimation(false);
+                int visibleHeight = getVisibleTitleHeight();
+                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
+                        "translationY", getTranslationY(),
+                        (-getEmbeddedHeight() + visibleHeight));
+                mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
+                setupTitleBarAnimator(mTitleBarAnimator);
+                mTitleBarAnimator.start();
+            } else {
+                mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
+            }
+        }
+        mShowing = false;
+    }
+
+    boolean isShowing() {
+        return mShowing;
+    }
+
+    void cancelTitleBarAnimation(boolean reset) {
+        if (mTitleBarAnimator != null) {
+            mTitleBarAnimator.cancel();
+            mTitleBarAnimator = null;
+        }
+        if (reset) {
+            setTranslationY(0);
+        }
+    }
+
+    private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
+
+        boolean mWasCanceled;
+        @Override
+        public void onAnimationStart(Animator animation) {
+            mWasCanceled = false;
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animator animation) {
+            if (!mWasCanceled) {
+                setTranslationY(0);
+            }
+            mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
+        }
+
+        @Override
+        public void onAnimationCancel(Animator animation) {
+            mWasCanceled = true;
+        }
+    };
+
+    private int getVisibleTitleHeight() {
+        Tab tab = mBaseUi.getActiveTab();
+        WebView webview = tab != null ? tab.getWebView() : null;
+        return webview != null ? webview.getVisibleTitleHeight() : 0;
+    }
+
+    /**
+     * Update the progress, from 0 to 100.
+     */
+    public void setProgress(int newProgress) {
+        if (newProgress >= PROGRESS_MAX) {
+            mProgress.setProgress(PageProgressView.MAX_PROGRESS);
+            mProgress.setVisibility(View.GONE);
+            mInLoad = false;
+            mNavBar.onProgressStopped();
+            // check if needs to be hidden
+            if (!isEditingUrl() && !inAutoLogin()) {
+                hide();
+                if (mUseQuickControls) {
+                    setShowProgressOnly(false);
+                }
+            }
+        } else {
+            if (!mInLoad) {
+                mProgress.setVisibility(View.VISIBLE);
+                mInLoad = true;
+                mNavBar.onProgressStarted();
+            }
+            mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
+                    / PROGRESS_MAX);
+            if (!mShowing) {
+                if (mUseQuickControls && !isEditingUrl()) {
+                    setShowProgressOnly(true);
+                }
+                show();
+            }
+        }
+    }
+
+    public int getEmbeddedHeight() {
+        int height = mNavBar.getHeight();
+        if (mAutoLogin.getVisibility() == View.VISIBLE) {
+            height += mAutoLogin.getHeight();
+        }
+        return height;
+    }
+
+    public void updateAutoLogin(Tab tab, boolean animate) {
+        mAutoLogin.updateAutoLogin(tab, animate);
+    }
+
+    public void showAutoLogin(boolean animate) {
+        if (mUseQuickControls) {
+            mBaseUi.showTitleBar();
+        }
+        mAutoLogin.setVisibility(View.VISIBLE);
+        if (animate) {
+            mAutoLogin.startAnimation(AnimationUtils.loadAnimation(
+                    getContext(), R.anim.autologin_enter));
+        }
+    }
+
+    public void hideAutoLogin(boolean animate) {
+        if (mUseQuickControls) {
+            mBaseUi.hideTitleBar();
+            mAutoLogin.setVisibility(View.GONE);
+            mBaseUi.refreshWebView();
+        } else {
+            if (animate) {
+                Animation anim = AnimationUtils.loadAnimation(getContext(),
+                        R.anim.autologin_exit);
+                anim.setAnimationListener(new AnimationListener() {
+                    @Override
+                    public void onAnimationEnd(Animation a) {
+                        mAutoLogin.setVisibility(View.GONE);
+                        mBaseUi.refreshWebView();
+                    }
+
+                    @Override
+                    public void onAnimationStart(Animation a) {
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animation a) {
+                    }
+                });
+                mAutoLogin.startAnimation(anim);
+            } else if (mAutoLogin.getAnimation() == null) {
+                mAutoLogin.setVisibility(View.GONE);
+                mBaseUi.refreshWebView();
+            }
+        }
+    }
+
+    public boolean inAutoLogin() {
+        return mAutoLogin.getVisibility() == View.VISIBLE;
+    }
+
+    public boolean isEditingUrl() {
+        return mNavBar.isEditingUrl();
+    }
+
+    public WebView getCurrentWebView() {
+        Tab t = mBaseUi.getActiveTab();
+        if (t != null) {
+            return t.getWebView();
+        } else {
+            return null;
+        }
+    }
+
+    public PageProgressView getProgressView() {
+        return mProgress;
+    }
+
+    public NavigationBarBase getNavigationBar() {
+        return mNavBar;
+    }
+
+    public boolean useQuickControls() {
+        return mUseQuickControls;
+    }
+
+    public boolean isInLoad() {
+        return mInLoad;
+    }
+
+    private ViewGroup.LayoutParams makeLayoutParams() {
+        if (mUseQuickControls) {
+            return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+                    LayoutParams.WRAP_CONTENT);
+        } else {
+            return new AbsoluteLayout.LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
+                    0, 0);
+        }
+    }
+
+    @Override
+    public View focusSearch(View focused, int dir) {
+        if (FOCUS_DOWN == dir && hasFocus()) {
+            return getCurrentWebView();
+        }
+        return super.focusSearch(focused, dir);
+    }
+
+}
diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java
deleted file mode 100644
index 17b9e19..0000000
--- a/src/com/android/browser/TitleBarBase.java
+++ /dev/null
@@ -1,664 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.ObjectAnimator;
-import android.app.SearchManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.speech.RecognizerResultsIntent;
-import android.text.TextUtils;
-import android.view.ContextThemeWrapper;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.view.ViewGroup;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
-import android.view.animation.AnimationUtils;
-import android.view.animation.DecelerateInterpolator;
-import android.webkit.WebView;
-import android.widget.AbsoluteLayout;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.PopupMenu;
-import android.widget.PopupMenu.OnMenuItemClickListener;
-import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.android.browser.UI.DropdownChangeListener;
-import com.android.browser.UrlInputView.UrlInputListener;
-import com.android.browser.autocomplete.SuggestedTextController.TextChangeWatcher;
-
-import java.util.List;
-
-/**
- * Base class for a title bar used by the browser.
- */
-public class TitleBarBase extends RelativeLayout
-        implements OnClickListener, OnFocusChangeListener, UrlInputListener,
-        TextChangeWatcher, DeviceAccountLogin.AutoLoginCallback,
-        OnMenuItemClickListener {
-
-    protected static final int PROGRESS_MAX = 100;
-    private static final float ANIM_TITLEBAR_DECELERATE = 2.5f;
-
-    // These need to be set by the subclass.
-    protected ImageView mFavicon;
-    protected ImageView mLockIcon;
-
-    protected UiController mUiController;
-    protected BaseUi mBaseUi;
-    protected FrameLayout mParent;
-    protected PageProgressView mProgress;
-    protected UrlInputView mUrlInput;
-    protected boolean mInVoiceMode;
-    protected View mContainer;
-    private View mUaSwitcher;
-
-    // Auto-login UI
-    protected View mAutoLogin;
-    protected Spinner mAutoLoginAccount;
-    protected Button mAutoLoginLogin;
-    protected ProgressBar mAutoLoginProgress;
-    protected TextView mAutoLoginError;
-    protected View mAutoLoginCancel;
-    protected DeviceAccountLogin mAutoLoginHandler;
-    protected ArrayAdapter<String> mAccountsAdapter;
-    protected boolean mUseQuickControls;
-
-    //state
-    protected boolean mShowing;
-    protected boolean mInLoad;
-    protected boolean mSkipTitleBarAnimations;
-    private Animator mTitleBarAnimator;
-
-    public TitleBarBase(Context context, UiController controller, BaseUi ui,
-            FrameLayout parent) {
-        super(context, null);
-        mUiController = controller;
-        mBaseUi = ui;
-        mParent = parent;
-    }
-
-    protected void initLayout(Context context, int layoutId) {
-        LayoutInflater factory = LayoutInflater.from(context);
-        factory.inflate(layoutId, this);
-        mContainer = findViewById(R.id.taburlbar);
-        mProgress = (PageProgressView) findViewById(R.id.progress);
-        mUrlInput = (UrlInputView) findViewById(R.id.url);
-        mLockIcon = (ImageView) findViewById(R.id.lock);
-        mUrlInput.setUrlInputListener(this);
-        mUrlInput.setController(mUiController);
-        mUrlInput.setOnFocusChangeListener(this);
-        mUrlInput.setSelectAllOnFocus(true);
-        mUrlInput.addQueryTextWatcher(this);
-        mAutoLogin = findViewById(R.id.autologin);
-        mAutoLoginAccount = (Spinner) findViewById(R.id.autologin_account);
-        mAutoLoginLogin = (Button) findViewById(R.id.autologin_login);
-        mAutoLoginLogin.setOnClickListener(this);
-        mAutoLoginProgress = (ProgressBar) findViewById(R.id.autologin_progress);
-        mAutoLoginError = (TextView) findViewById(R.id.autologin_error);
-        mAutoLoginCancel = mAutoLogin.findViewById(R.id.autologin_close);
-        mAutoLoginCancel.setOnClickListener(this);
-    }
-
-    protected void setupUrlInput() {
-    }
-
-    protected void setUseQuickControls(boolean use) {
-        mUseQuickControls = use;
-        setLayoutParams(makeLayoutParams());
-    }
-
-    void setShowProgressOnly(boolean progress) {
-        if (progress && !inAutoLogin()) {
-            mContainer.setVisibility(View.GONE);
-        } else {
-            mContainer.setVisibility(View.VISIBLE);
-        }
-    }
-
-    void setSkipTitleBarAnimations(boolean skip) {
-        mSkipTitleBarAnimations = skip;
-    }
-
-    void setupTitleBarAnimator(Animator animator) {
-        Resources res = mContext.getResources();
-        int duration = res.getInteger(R.integer.titlebar_animation_duration);
-        animator.setInterpolator(new DecelerateInterpolator(
-                ANIM_TITLEBAR_DECELERATE));
-        animator.setDuration(duration);
-    }
-
-    void show() {
-        if (mUseQuickControls) {
-            mParent.addView(this);
-        } else {
-            if (!mSkipTitleBarAnimations) {
-                cancelTitleBarAnimation(false);
-                int visibleHeight = getVisibleTitleHeight();
-                float startPos = (-getEmbeddedHeight() + visibleHeight);
-                if (getTranslationY() != 0) {
-                    startPos = Math.max(startPos, getTranslationY());
-                }
-                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
-                        "translationY",
-                        startPos, 0);
-                setupTitleBarAnimator(mTitleBarAnimator);
-                mTitleBarAnimator.start();
-            }
-            mBaseUi.setTitleGravity(Gravity.TOP);
-        }
-        mShowing = true;
-    }
-
-    void hide() {
-        if (mUseQuickControls) {
-            mParent.removeView(this);
-        } else {
-            if (!mSkipTitleBarAnimations) {
-                cancelTitleBarAnimation(false);
-                int visibleHeight = getVisibleTitleHeight();
-                mTitleBarAnimator = ObjectAnimator.ofFloat(this,
-                        "translationY", getTranslationY(),
-                        (-getEmbeddedHeight() + visibleHeight));
-                mTitleBarAnimator.addListener(mHideTileBarAnimatorListener);
-                setupTitleBarAnimator(mTitleBarAnimator);
-                mTitleBarAnimator.start();
-            } else {
-                mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
-            }
-        }
-        mShowing = false;
-    }
-
-    boolean isShowing() {
-        return mShowing;
-    }
-
-    void cancelTitleBarAnimation(boolean reset) {
-        if (mTitleBarAnimator != null) {
-            mTitleBarAnimator.cancel();
-            mTitleBarAnimator = null;
-        }
-        if (reset) {
-            setTranslationY(0);
-        }
-    }
-
-    private AnimatorListener mHideTileBarAnimatorListener = new AnimatorListener() {
-
-        boolean mWasCanceled;
-        @Override
-        public void onAnimationStart(Animator animation) {
-            mWasCanceled = false;
-        }
-
-        @Override
-        public void onAnimationRepeat(Animator animation) {
-        }
-
-        @Override
-        public void onAnimationEnd(Animator animation) {
-            if (!mWasCanceled) {
-                setTranslationY(0);
-            }
-            mBaseUi.setTitleGravity(Gravity.NO_GRAVITY);
-        }
-
-        @Override
-        public void onAnimationCancel(Animator animation) {
-            mWasCanceled = true;
-        }
-    };
-
-    private int getVisibleTitleHeight() {
-        Tab tab = mBaseUi.getActiveTab();
-        WebView webview = tab != null ? tab.getWebView() : null;
-        return webview != null ? webview.getVisibleTitleHeight() : 0;
-    }
-
-    /**
-     * Update the progress, from 0 to 100.
-     */
-    void setProgress(int newProgress) {
-        if (newProgress >= PROGRESS_MAX) {
-            mProgress.setProgress(PageProgressView.MAX_PROGRESS);
-            mProgress.setVisibility(View.GONE);
-            mInLoad = false;
-            onProgressStopped();
-            // check if needs to be hidden
-            if (!isEditingUrl() && !inAutoLogin()) {
-                hide();
-                if (mUseQuickControls) {
-                    setShowProgressOnly(false);
-                }
-            }
-        } else {
-            if (!mInLoad) {
-                mProgress.setVisibility(View.VISIBLE);
-                mInLoad = true;
-                onProgressStarted();
-            }
-            mProgress.setProgress(newProgress * PageProgressView.MAX_PROGRESS
-                    / PROGRESS_MAX);
-            if (!mShowing) {
-                if (mUseQuickControls && !isEditingUrl()) {
-                    setShowProgressOnly(true);
-                }
-                show();
-            }
-        }
-    }
-
-    protected void onProgressStarted() {
-    }
-
-    protected void onProgressStopped() {
-    }
-
-    /* package */ void setLock(Drawable d) {
-        assert mLockIcon != null;
-        if (null == d) {
-            mLockIcon.setVisibility(View.GONE);
-        } else {
-            mLockIcon.setImageDrawable(d);
-            mLockIcon.setVisibility(View.VISIBLE);
-        }
-    }
-
-    /* package */ void setFavicon(Bitmap icon) {
-        mFavicon.setImageDrawable(mBaseUi.getFaviconDrawable(icon));
-    }
-
-    public int getEmbeddedHeight() {
-        int height = mContainer.getHeight();
-        if (mAutoLogin.getVisibility() == View.VISIBLE) {
-            height += mAutoLogin.getHeight();
-        }
-        return height;
-    }
-
-    protected void updateAutoLogin(Tab tab, boolean animate) {
-        DeviceAccountLogin login = tab.getDeviceAccountLogin();
-        if (login != null) {
-            mAutoLoginHandler = login;
-            ContextThemeWrapper wrapper = new ContextThemeWrapper(mContext,
-                    android.R.style.Theme_Holo_Light);
-            mAccountsAdapter = new ArrayAdapter<String>(wrapper,
-                    android.R.layout.simple_spinner_item, login.getAccountNames());
-            mAccountsAdapter.setDropDownViewResource(
-                    android.R.layout.simple_spinner_dropdown_item);
-            mAutoLoginAccount.setAdapter(mAccountsAdapter);
-            mAutoLoginAccount.setSelection(0);
-            mAutoLoginAccount.setEnabled(true);
-            mAutoLoginLogin.setEnabled(true);
-            mAutoLoginProgress.setVisibility(View.INVISIBLE);
-            mAutoLoginError.setVisibility(View.GONE);
-            switch (login.getState()) {
-                case DeviceAccountLogin.PROCESSING:
-                    mAutoLoginAccount.setEnabled(false);
-                    mAutoLoginLogin.setEnabled(false);
-                    mAutoLoginProgress.setVisibility(View.VISIBLE);
-                    break;
-                case DeviceAccountLogin.FAILED:
-                    mAutoLoginProgress.setVisibility(View.INVISIBLE);
-                    mAutoLoginError.setVisibility(View.VISIBLE);
-                    break;
-                case DeviceAccountLogin.INITIAL:
-                    break;
-                default:
-                    throw new IllegalStateException();
-            }
-            showAutoLogin(animate);
-        } else {
-            hideAutoLogin(animate);
-        }
-    }
-
-    protected void showAutoLogin(boolean animate) {
-        if (mUseQuickControls) {
-            mBaseUi.showTitleBar();
-        }
-        mAutoLogin.setVisibility(View.VISIBLE);
-        if (animate) {
-            mAutoLogin.startAnimation(AnimationUtils.loadAnimation(
-                    getContext(), R.anim.autologin_enter));
-        }
-    }
-
-    protected void hideAutoLogin(boolean animate) {
-        mAutoLoginHandler = null;
-        if (mUseQuickControls) {
-            mBaseUi.hideTitleBar();
-            mAutoLogin.setVisibility(View.GONE);
-            mBaseUi.refreshWebView();
-        } else {
-            if (animate) {
-                Animation anim = AnimationUtils.loadAnimation(getContext(),
-                        R.anim.autologin_exit);
-                anim.setAnimationListener(new AnimationListener() {
-                    @Override
-                    public void onAnimationEnd(Animation a) {
-                        mAutoLogin.setVisibility(View.GONE);
-                        mBaseUi.refreshWebView();
-                    }
-
-                    @Override
-                    public void onAnimationStart(Animation a) {
-                    }
-
-                    @Override
-                    public void onAnimationRepeat(Animation a) {
-                    }
-                });
-                mAutoLogin.startAnimation(anim);
-            } else if (mAutoLogin.getAnimation() == null) {
-                mAutoLogin.setVisibility(View.GONE);
-                mBaseUi.refreshWebView();
-            }
-        }
-    }
-
-    @Override
-    public void loginFailed() {
-        mAutoLoginAccount.setEnabled(true);
-        mAutoLoginLogin.setEnabled(true);
-        mAutoLoginProgress.setVisibility(View.INVISIBLE);
-        mAutoLoginError.setVisibility(View.VISIBLE);
-    }
-
-
-    protected boolean inAutoLogin() {
-        return mAutoLoginHandler != null;
-    }
-
-    public void setUaSwitcher(View v) {
-        if (mUaSwitcher != null) {
-            mUaSwitcher.setOnClickListener(null);
-        }
-        mUaSwitcher = v;
-        mUaSwitcher.setOnClickListener(this);
-    }
-
-    @Override
-    public void onClick(View v) {
-        if (mAutoLoginCancel == v) {
-            if (mAutoLoginHandler != null) {
-                mAutoLoginHandler.cancel();
-                mAutoLoginHandler = null;
-            }
-            hideAutoLogin(true);
-        } else if (mAutoLoginLogin == v) {
-            if (mAutoLoginHandler != null) {
-                mAutoLoginAccount.setEnabled(false);
-                mAutoLoginLogin.setEnabled(false);
-                mAutoLoginProgress.setVisibility(View.VISIBLE);
-                mAutoLoginError.setVisibility(View.GONE);
-                mAutoLoginHandler.login(
-                        mAutoLoginAccount.getSelectedItemPosition(), this);
-            }
-        } else if (mUaSwitcher == v) {
-            BrowserSettings settings = BrowserSettings.getInstance();
-            WebView web = getCurrentWebView();
-            if (web == null) return;
-            boolean desktop = settings.hasDesktopUseragent(web);
-            PopupMenu popup = new PopupMenu(mContext, mUaSwitcher);
-            Menu menu = popup.getMenu();
-            popup.getMenuInflater().inflate(R.menu.ua_switcher, menu);
-            menu.findItem(R.id.ua_mobile_menu_id).setChecked(!desktop);
-            menu.findItem(R.id.ua_desktop_menu_id).setChecked(desktop);
-            popup.setOnMenuItemClickListener(this);
-            popup.show();
-        }
-    }
-
-    @Override
-    public boolean onMenuItemClick(MenuItem item) {
-        BrowserSettings settings = BrowserSettings.getInstance();
-        WebView web = getCurrentWebView();
-        if (web == null) return false;
-        boolean desktop = settings.hasDesktopUseragent(web);
-        switch (item.getItemId()) {
-        case R.id.ua_mobile_menu_id:
-            if (desktop) {
-                settings.toggleDesktopUseragent(web);
-                web.loadUrl(web.getOriginalUrl());
-            }
-            return true;
-        case R.id.ua_desktop_menu_id:
-            if (!desktop) {
-                settings.toggleDesktopUseragent(web);
-                web.loadUrl(web.getOriginalUrl());
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void onFocusChange(View view, boolean hasFocus) {
-        // if losing focus and not in touch mode, leave as is
-        if (hasFocus || view.isInTouchMode() || mUrlInput.needsUpdate()) {
-            setFocusState(hasFocus);
-        }
-        if (hasFocus) {
-            mBaseUi.showTitleBar();
-            mUrlInput.forceIme();
-            if (mInVoiceMode) {
-                mUrlInput.forceFilter();
-            }
-        } else if (!mUrlInput.needsUpdate()) {
-            mUrlInput.dismissDropDown();
-            mUrlInput.hideIME();
-            if (mUrlInput.getText().length() == 0) {
-                Tab currentTab = mUiController.getTabControl().getCurrentTab();
-                if (currentTab != null) {
-                    mUrlInput.setText(currentTab.getUrl(), false);
-                }
-            }
-            mBaseUi.suggestHideTitleBar();
-        }
-        mUrlInput.clearNeedsUpdate();
-    }
-
-    protected void setFocusState(boolean focus) {
-    }
-
-    protected void setSearchMode(boolean voiceSearchEnabled) {}
-
-    boolean isEditingUrl() {
-        return mUrlInput.hasFocus();
-    }
-
-    void stopEditingUrl() {
-        mUrlInput.clearFocus();
-    }
-
-    void setDisplayTitle(String title) {
-        if (!isEditingUrl()) {
-            mUrlInput.setText(title, false);
-        }
-    }
-
-    // UrlInput text watcher
-
-    @Override
-    public void onTextChanged(String newText) {
-        if (mUrlInput.hasFocus()) {
-            // clear voice mode when user types
-            setInVoiceMode(false, null);
-        }
-    }
-
-    // voicesearch
-
-    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
-        mInVoiceMode = voicemode;
-        mUrlInput.setVoiceResults(voiceResults);
-    }
-
-    void setIncognitoMode(boolean incognito) {
-        mUrlInput.setIncognitoMode(incognito);
-    }
-
-    void clearCompletions() {
-        mUrlInput.setSuggestedText(null);
-    }
-
-    // UrlInputListener implementation
-
-    /**
-     * callback from suggestion dropdown
-     * user selected a suggestion
-     */
-    @Override
-    public void onAction(String text, String extra, String source) {
-        mUiController.getCurrentTopWebView().requestFocus();
-        if (UrlInputView.TYPED.equals(source)) {
-            String url = UrlUtils.smartUrlFilter(text, false);
-            Tab t = mBaseUi.getActiveTab();
-            // Only shortcut javascript URIs for now, as there is special
-            // logic in UrlHandler for other schemas
-            if (url != null && t != null && url.startsWith("javascript:")) {
-                mUiController.loadUrl(t, url);
-                setDisplayTitle(text);
-                return;
-            }
-        }
-        Intent i = new Intent();
-        String action = null;
-        if (UrlInputView.VOICE.equals(source)) {
-            action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS;
-            source = null;
-        } else {
-            action = Intent.ACTION_SEARCH;
-        }
-        i.setAction(action);
-        i.putExtra(SearchManager.QUERY, text);
-        if (extra != null) {
-            i.putExtra(SearchManager.EXTRA_DATA_KEY, extra);
-        }
-        if (source != null) {
-            Bundle appData = new Bundle();
-            appData.putString(com.android.common.Search.SOURCE, source);
-            i.putExtra(SearchManager.APP_DATA, appData);
-        }
-        mUiController.handleNewIntent(i);
-        setDisplayTitle(text);
-    }
-
-    @Override
-    public void onDismiss() {
-        final Tab currentTab = mBaseUi.getActiveTab();
-        mBaseUi.hideTitleBar();
-        post(new Runnable() {
-            public void run() {
-                clearFocus();
-                if ((currentTab != null) && !mInVoiceMode) {
-                    setDisplayTitle(currentTab.getUrl());
-                }
-            }
-        });
-    }
-
-    /**
-     * callback from the suggestion dropdown
-     * copy text to input field and stay in edit mode
-     */
-    @Override
-    public void onCopySuggestion(String text) {
-        mUrlInput.setText(text, true);
-        if (text != null) {
-            mUrlInput.setSelection(text.length());
-        }
-    }
-
-    public void setCurrentUrlIsBookmark(boolean isBookmark) {
-    }
-
-    @Override
-    public boolean dispatchKeyEventPreIme(KeyEvent evt) {
-        if (evt.getKeyCode() == KeyEvent.KEYCODE_BACK) {
-            // catch back key in order to do slightly more cleanup than usual
-            mUrlInput.clearFocus();
-            return true;
-        }
-        return super.dispatchKeyEventPreIme(evt);
-    }
-
-    protected WebView getCurrentWebView() {
-        Tab t = mBaseUi.getActiveTab();
-        if (t != null) {
-            return t.getWebView();
-        } else {
-            return null;
-        }
-    }
-
-    void registerDropdownChangeListener(DropdownChangeListener d) {
-        mUrlInput.registerDropdownChangeListener(d);
-    }
-
-    /**
-     * called from the Ui when the user wants to edit
-     * @param clearInput clear the input field
-     */
-    void startEditingUrl(boolean clearInput) {
-        // editing takes preference of progress
-        mContainer.setVisibility(View.VISIBLE);
-        if (mUseQuickControls) {
-            mProgress.setVisibility(View.GONE);
-        }
-        if (!mUrlInput.hasFocus()) {
-            mUrlInput.requestFocus();
-        }
-        if (clearInput) {
-            mUrlInput.setText("");
-        } else if (mInVoiceMode) {
-            mUrlInput.showDropDown();
-        }
-    }
-
-    private ViewGroup.LayoutParams makeLayoutParams() {
-        if (mUseQuickControls) {
-            return new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
-                    LayoutParams.WRAP_CONTENT);
-        } else {
-            return new AbsoluteLayout.LayoutParams(
-                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,
-                    0, 0);
-        }
-    }
-
-}
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 290bbf7..a868331 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -40,7 +40,7 @@
     private ActionBar mActionBar;
     private TabBar mTabBar;
 
-    private TitleBarXLarge mTitleBar;
+    private NavigationBarTablet mNavBar;
 
     private PieControlXLarge mPieControl;
     private Handler mHandler;
@@ -52,9 +52,7 @@
     public XLargeUi(Activity browser, UiController controller) {
         super(browser, controller);
         mHandler = new Handler();
-        mTitleBar = new TitleBarXLarge(mActivity, mUiController, this,
-                mContentView);
-        mTitleBar.setProgress(100);
+        mNavBar = (NavigationBarTablet) mTitleBar.getNavigationBar();
         mTabBar = new TabBar(mActivity, mUiController, this);
         mActionBar = mActivity.getActionBar();
         setupActionBar();
@@ -129,7 +127,7 @@
     public void onResume() {
         super.onResume();
         if (!BrowserSettings.getInstance().useInstantSearch()) {
-            mTitleBar.clearCompletions();
+            mNavBar.clearCompletions();
         }
     }
 
@@ -187,7 +185,7 @@
             mPieControl.forceToTop(mContentView);
         } else {
             // check if title bar is already attached by animation
-            if (mTitleBar.getParent() == null && !tab.isSnapshot()) {
+            if (mTitleBar.getParent() == null) {
                 view.setEmbeddedTitleBar(mTitleBar);
             }
         }
@@ -231,13 +229,13 @@
     @Override
     public void editUrl(boolean clearInput) {
         if (mUseQuickControls) {
-            getTitleBar().setShowProgressOnly(false);
+            mTitleBar.setShowProgressOnly(false);
         }
         super.editUrl(clearInput);
     }
 
     void stopEditingUrl() {
-        mTitleBar.stopEditingUrl();
+        mTitleBar.getNavigationBar().stopEditingUrl();
     }
 
     @Override
@@ -255,11 +253,6 @@
     }
 
     @Override
-    protected TitleBarBase getTitleBar() {
-        return mTitleBar;
-    }
-
-    @Override
     protected void setTitleGravity(int gravity) {
         if (!mUseQuickControls) {
             super.setTitleGravity(gravity);
@@ -291,7 +284,7 @@
 
     @Override
     protected void updateNavigationState(Tab tab) {
-        mTitleBar.updateNavigationState(tab);
+        mNavBar.updateNavigationState(tab);
     }
 
     @Override
@@ -308,19 +301,6 @@
     }
 
     @Override
-    public void showVoiceTitleBar(String title, List<String> vsresults) {
-        mTitleBar.setInVoiceMode(true, vsresults);
-        mTitleBar.setDisplayTitle(title);
-    }
-
-    @Override
-    public void revertVoiceTitleBar(Tab tab) {
-        mTitleBar.setInVoiceMode(false, null);
-        String url = tab.getUrl();
-        mTitleBar.setDisplayTitle(url);
-    }
-
-    @Override
     public void showCustomView(View view, int requestedOrientation,
             CustomViewCallback callback) {
         super.showCustomView(view, requestedOrientation, callback);