Separate QSB and Voice buttons, aligned with QSB app.

Add EditText style underscores for the icons.
Get VoiceSearch icon from the activity that handles the RecognizerIntent.ACTION_WEB_SEARCH
diff --git a/res/drawable-xlarge-hdpi/home_press.9.png b/res/drawable-xlarge-hdpi/home_press.9.png
new file mode 100644
index 0000000..4beec62
--- /dev/null
+++ b/res/drawable-xlarge-hdpi/home_press.9.png
Binary files differ
diff --git a/res/drawable-xlarge-hdpi/ic_voice_search.png b/res/drawable-xlarge-hdpi/ic_voice_search.png
new file mode 100644
index 0000000..66d14ae
--- /dev/null
+++ b/res/drawable-xlarge-hdpi/ic_voice_search.png
Binary files differ
diff --git a/res/drawable-xlarge-hdpi/textfield_end.9.png b/res/drawable-xlarge-hdpi/textfield_end.9.png
new file mode 100644
index 0000000..be1b2b6
--- /dev/null
+++ b/res/drawable-xlarge-hdpi/textfield_end.9.png
Binary files differ
diff --git a/res/drawable-xlarge-hdpi/textfield_start.9.png b/res/drawable-xlarge-hdpi/textfield_start.9.png
new file mode 100644
index 0000000..6b5ebe2
--- /dev/null
+++ b/res/drawable-xlarge-hdpi/textfield_start.9.png
Binary files differ
diff --git a/res/drawable-xlarge-mdpi/home_press.9.png b/res/drawable-xlarge-mdpi/home_press.9.png
new file mode 100644
index 0000000..ff841c3
--- /dev/null
+++ b/res/drawable-xlarge-mdpi/home_press.9.png
Binary files differ
diff --git a/res/drawable-xlarge-mdpi/ic_voice_search.png b/res/drawable-xlarge-mdpi/ic_voice_search.png
new file mode 100644
index 0000000..a2fe874
--- /dev/null
+++ b/res/drawable-xlarge-mdpi/ic_voice_search.png
Binary files differ
diff --git a/res/drawable-xlarge-mdpi/textfield_end.9.png b/res/drawable-xlarge-mdpi/textfield_end.9.png
new file mode 100644
index 0000000..94706b4
--- /dev/null
+++ b/res/drawable-xlarge-mdpi/textfield_end.9.png
Binary files differ
diff --git a/res/drawable-xlarge-mdpi/textfield_start.9.png b/res/drawable-xlarge-mdpi/textfield_start.9.png
new file mode 100644
index 0000000..8cddc34
--- /dev/null
+++ b/res/drawable-xlarge-mdpi/textfield_start.9.png
Binary files differ
diff --git a/res/drawable-xlarge/button_bg.xml b/res/drawable-xlarge/button_bg.xml
new file mode 100644
index 0000000..9e6e1ff
--- /dev/null
+++ b/res/drawable-xlarge/button_bg.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true" android:drawable="@drawable/home_press" />
+    <item android:drawable="@android:color/transparent" />
+</selector>
diff --git a/res/layout-xlarge-land/launcher.xml b/res/layout-xlarge-land/launcher.xml
index 8e6f1fe..7516796 100644
--- a/res/layout-xlarge-land/launcher.xml
+++ b/res/layout-xlarge-land/launcher.xml
@@ -54,16 +54,54 @@
         android:layout_height="?android:attr/actionBarSize"
         android:layout_gravity="top">
 
-        <ImageView
-            android:id="@+id/search_button"
+        <LinearLayout android:id="@+id/search_button_cluster"
             android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="left"
-            android:layout_marginLeft="@dimen/toolbar_button_spacing"
+            android:layout_height="48dp"
+            android:gravity="bottom"
+            >
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="16dp"
+                android:background="@drawable/textfield_start"
+                android:orientation="horizontal">
+                <!-- Global search icon -->
+                <ImageView
+                    android:id="@+id/search_button"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="bottom"
+                    android:paddingLeft="8dp"
+                    android:paddingRight="8dp"
+                    android:paddingTop="12dp"
+                    android:src="@drawable/search_button_generic"
+                    android:background="@drawable/button_bg"
+                    android:onClick="onClickSearchButton"
+                    android:focusable="true"
+                    android:clickable="true"/>
+            </LinearLayout>
 
-            android:onClick="onClickSearchButton"
-            android:focusable="true"
-            android:clickable="true"/>
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:background="@drawable/textfield_end"
+                android:orientation="horizontal">
+                <!-- Voice search icon -->
+                <ImageView
+                    android:id="@+id/voice_button"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="bottom"
+                    android:paddingLeft="8dp"
+                    android:paddingRight="8dp"
+                    android:paddingTop="12dp"
+                    android:src="@drawable/ic_voice_search"
+                    android:background="@drawable/button_bg"
+                    android:onClick="onClickVoiceButton"
+                    android:focusable="true"
+                    android:clickable="true"/>
+            </LinearLayout>
+        </LinearLayout>
 
         <ImageView
             android:id="@+id/configure_button"
diff --git a/res/layout-xlarge-port/launcher.xml b/res/layout-xlarge-port/launcher.xml
index a6fff4a..c2ca467 100644
--- a/res/layout-xlarge-port/launcher.xml
+++ b/res/layout-xlarge-port/launcher.xml
@@ -54,16 +54,54 @@
         android:layout_height="?android:attr/actionBarSize"
         android:layout_gravity="top">
 
-        <ImageView
-            android:id="@+id/search_button"
+        <LinearLayout android:id="@+id/search_button_cluster"
             android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="left"
-            android:layout_marginLeft="@dimen/toolbar_button_spacing"
+            android:layout_height="48dp"
+            android:gravity="bottom"
+            >
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="16dp"
+                android:background="@drawable/textfield_start"
+                android:orientation="horizontal">
+                <!-- Global search icon -->
+                <ImageView
+                    android:id="@+id/search_button"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="bottom"
+                    android:paddingLeft="8dp"
+                    android:paddingRight="8dp"
+                    android:paddingTop="12dp"
+                    android:src="@drawable/search_button_generic"
+                    android:background="@drawable/button_bg"
+                    android:onClick="onClickSearchButton"
+                    android:focusable="true"
+                    android:clickable="true"/>
+            </LinearLayout>
 
-            android:onClick="onClickSearchButton"
-            android:focusable="true"
-            android:clickable="true"/>
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:background="@drawable/textfield_end"
+                android:orientation="horizontal">
+                <!-- Voice search icon -->
+                <ImageView
+                    android:id="@+id/voice_button"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="bottom"
+                    android:paddingLeft="8dp"
+                    android:paddingRight="8dp"
+                    android:paddingTop="12dp"
+                    android:src="@drawable/ic_voice_search"
+                    android:background="@drawable/button_bg"
+                    android:onClick="onClickVoiceButton"
+                    android:focusable="true"
+                    android:clickable="true"/>
+            </LinearLayout>
+        </LinearLayout>
 
         <ImageView
             android:id="@+id/configure_button"
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 9954f39..55a6176 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -73,6 +73,7 @@
 import android.os.SystemProperties;
 import android.provider.LiveFolders;
 import android.provider.Settings;
+import android.speech.RecognizerIntent;
 import android.text.Selection;
 import android.text.SpannableStringBuilder;
 import android.text.TextUtils;
@@ -1925,6 +1926,21 @@
     }
 
     /**
+     * Event handler for the voice button
+     *
+     * @param v The view that was clicked.
+     */
+    public void onClickVoiceButton(View v) {
+        startVoiceSearch();
+    }
+
+    private void startVoiceSearch() {
+        Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
+    }
+
+    /**
      * Event handler for the "gear" button that appears on the home screen, which
      * enters home screen customization mode.
      *
@@ -2477,7 +2493,7 @@
      * @param hideSeq AnimatorSet in which to put "hide" animations, or null.
      */
     private void hideAndShowToolbarButtons(State newState, AnimatorSet showSeq, AnimatorSet hideSeq) {
-        final View searchButton = findViewById(R.id.search_button);
+        final View searchButton = findViewById(R.id.search_button_cluster);
         final View allAppsButton = findViewById(R.id.all_apps_button);
         final View configureButton = findViewById(R.id.configure_button);
 
@@ -2898,6 +2914,21 @@
             if (activityName != null) {
                 updateButtonWithIconFromExternalActivity(
                         R.id.search_button, activityName, R.drawable.search_button_generic);
+            } else {
+                findViewById(R.id.search_button).setVisibility(View.GONE);
+            }
+        }
+    }
+
+    private void updateVoiceSearchIcon() {
+        if (LauncherApplication.isScreenXLarge()) {
+            Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
+            ComponentName activityName = intent.resolveActivity(getPackageManager());
+            if (activityName != null) {
+                updateButtonWithIconFromExternalActivity(
+                        R.id.voice_button, activityName, R.drawable.ic_voice_search);
+            } else {
+                findViewById(R.id.voice_button).setVisibility(View.GONE);
             }
         }
     }
@@ -3249,6 +3280,16 @@
     }
 
     /**
+     * Updates the icons on the launcher that are affected by changes to the package list
+     * on the device.
+     */
+    private void updateIconsAffectedByPackageManagerChanges() {
+        updateAppMarketIcon();
+        updateGlobalSearchIcon();
+        updateVoiceSearchIcon();
+    }
+
+    /**
      * Add the icons for all apps.
      *
      * Implementation of the method from LauncherModel.Callbacks.
@@ -3258,8 +3299,7 @@
         if (mCustomizePagedView != null) {
             mCustomizePagedView.setApps(apps);
         }
-        updateAppMarketIcon();
-        updateGlobalSearchIcon();
+        updateIconsAffectedByPackageManagerChanges();
     }
 
     /**
@@ -3274,8 +3314,7 @@
         if (mCustomizePagedView != null) {
             mCustomizePagedView.addApps(apps);
         }
-        updateAppMarketIcon();
-        updateGlobalSearchIcon();
+        updateIconsAffectedByPackageManagerChanges();
     }
 
     /**
@@ -3291,8 +3330,7 @@
         if (mCustomizePagedView != null) {
             mCustomizePagedView.updateApps(apps);
         }
-        updateAppMarketIcon();
-        updateGlobalSearchIcon();
+        updateIconsAffectedByPackageManagerChanges();
     }
 
     /**
@@ -3309,8 +3347,7 @@
         if (mCustomizePagedView != null) {
             mCustomizePagedView.removeApps(apps);
         }
-        updateAppMarketIcon();
-        updateGlobalSearchIcon();
+        updateIconsAffectedByPackageManagerChanges();
     }
 
     /**