merge in ub-now-queens-release history after reset to 0e974b4d4480242c768cbd886d02ea66c0c8643d
diff --git a/res/drawable-hdpi/ic_home_search_normal_holo.png b/res/drawable-hdpi/ic_home_search_normal_holo.png
deleted file mode 100644
index 3f64d68..0000000
--- a/res/drawable-hdpi/ic_home_search_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_home_voice_search_holo.png b/res/drawable-hdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index dae5446..0000000
--- a/res/drawable-hdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/search_frame.9.png b/res/drawable-hdpi/search_frame.9.png
deleted file mode 100644
index 15ca1f4..0000000
--- a/res/drawable-hdpi/search_frame.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-land-hdpi/ic_home_voice_search_holo.png b/res/drawable-land-hdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index 5a7fc99..0000000
--- a/res/drawable-land-hdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-land-mdpi/ic_home_voice_search_holo.png b/res/drawable-land-mdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index ee7dde5..0000000
--- a/res/drawable-land-mdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-land-xhdpi/ic_home_voice_search_holo.png b/res/drawable-land-xhdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index 56bbbbb..0000000
--- a/res/drawable-land-xhdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-land-xxhdpi/ic_home_voice_search_holo.png b/res/drawable-land-xxhdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index 6ea7368..0000000
--- a/res/drawable-land-xxhdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_search_normal_holo.png b/res/drawable-mdpi/ic_home_search_normal_holo.png
deleted file mode 100644
index 7367c38..0000000
--- a/res/drawable-mdpi/ic_home_search_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_home_voice_search_holo.png b/res/drawable-mdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index f211a7b..0000000
--- a/res/drawable-mdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/search_frame.9.png b/res/drawable-mdpi/search_frame.9.png
deleted file mode 100644
index 058905b..0000000
--- a/res/drawable-mdpi/search_frame.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_home_search_normal_holo.png b/res/drawable-xhdpi/ic_home_search_normal_holo.png
deleted file mode 100644
index 0fe1cd1..0000000
--- a/res/drawable-xhdpi/ic_home_search_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_home_voice_search_holo.png b/res/drawable-xhdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index 1fc5cc8..0000000
--- a/res/drawable-xhdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/search_frame.9.png b/res/drawable-xhdpi/search_frame.9.png
deleted file mode 100644
index 32a0714..0000000
--- a/res/drawable-xhdpi/search_frame.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_home_search_normal_holo.png b/res/drawable-xxhdpi/ic_home_search_normal_holo.png
deleted file mode 100644
index a9523d3..0000000
--- a/res/drawable-xxhdpi/ic_home_search_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_home_voice_search_holo.png b/res/drawable-xxhdpi/ic_home_voice_search_holo.png
deleted file mode 100644
index c9c0b50..0000000
--- a/res/drawable-xxhdpi/ic_home_voice_search_holo.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/search_bg_panel.9.png b/res/drawable-xxhdpi/search_bg_panel.9.png
deleted file mode 100644
index 85cae17..0000000
--- a/res/drawable-xxhdpi/search_bg_panel.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/search_frame.9.png b/res/drawable-xxhdpi/search_frame.9.png
deleted file mode 100644
index f297bf1..0000000
--- a/res/drawable-xxhdpi/search_frame.9.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-land/qsb.xml b/res/layout-land/qsb.xml
deleted file mode 100644
index d56e380..0000000
--- a/res/layout-land/qsb.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
-   <!-- Global search icon -->
-   <com.android.launcher3.HolographicImageView
-        style="@style/SearchButton"
-        android:id="@+id/search_button"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:scaleType="center"
-        android:src="@drawable/ic_home_search_normal_holo"
-        android:adjustViewBounds="true"
-        android:onClick="onClickSearchButton"
-        android:focusable="true"
-        android:clickable="true"
-        android:contentDescription="@string/accessibility_search_button" />
-
-    <!-- Voice search icon -->
-    <com.android.launcher3.HolographicImageView
-        style="@style/SearchButton"
-        android:id="@+id/voice_button"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:scaleType="center"
-        android:src="@drawable/ic_home_voice_search_holo"
-        android:adjustViewBounds="true"
-        android:onClick="onClickVoiceButton"
-        android:focusable="true"
-        android:clickable="true"
-        android:contentDescription="@string/accessibility_voice_search_button" />
-</LinearLayout>
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index 9e4c245..af30a32 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -66,18 +66,6 @@
             android:id="@+id/search_drop_target_bar"
             layout="@layout/search_drop_target_bar" />
 
-        <!-- This is the search bar voice button proxy view.  It allows us to have a larger
-             touch target than the microphone constrained by the search bar bounds. -->
-        <com.android.launcher3.DrawableStateProxyView
-            android:id="@+id/voice_button_proxy"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_gravity="top|end"
-            android:clickable="true"
-            android:onClick="onClickVoiceButton"
-            android:importantForAccessibility="no"
-            launcher:sourceViewId="@+id/voice_button" />
-
         <include layout="@layout/apps_customize_pane"
             android:id="@+id/apps_customize_pane"
             android:layout_width="match_parent"
diff --git a/res/layout-port/qsb.xml b/res/layout-port/qsb.xml
deleted file mode 100644
index 0afc2d2..0000000
--- a/res/layout-port/qsb.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/search_frame">
-   <!-- Global search icon -->
-   <com.android.launcher3.HolographicLinearLayout
-        style="@style/SearchButton.WithPaddingStart"
-        launcher:sourceImageViewId="@+id/search_button"
-        android:id="@+id/search_button_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_gravity="center_vertical"
-        android:layout_centerVertical="true"
-        android:layout_alignParentStart="true"
-        android:layout_toStartOf="@+id/voice_button_container"
-        android:onClick="onClickSearchButton"
-        android:focusable="true"
-        android:clickable="true"
-        android:contentDescription="@string/accessibility_search_button">
-       <ImageView
-            android:id="@+id/search_button"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="start"
-            android:scaleType="fitCenter"
-            android:src="@drawable/ic_home_search_normal_holo"
-            android:adjustViewBounds="true" />
-    </com.android.launcher3.HolographicLinearLayout>
-
-    <!-- Voice search icon -->
-    <com.android.launcher3.HolographicLinearLayout
-        style="@style/SearchButton"
-        launcher:sourceImageViewId="@+id/voice_button"
-        android:id="@+id/voice_button_container"
-        android:layout_width="@dimen/app_icon_size"
-        android:layout_height="match_parent"
-        android:layout_gravity="center_vertical"
-        android:layout_centerVertical="true"
-        android:layout_alignParentEnd="true"
-        android:paddingEnd="8dp"
-        android:paddingRight="8dp"
-        android:onClick="onClickVoiceButton"
-        android:focusable="true"
-        android:clickable="true"
-        android:contentDescription="@string/accessibility_voice_search_button">
-        <ImageView
-            android:id="@+id/voice_button"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_gravity="end"
-            android:scaleType="fitCenter"
-            android:src="@drawable/ic_home_voice_search_holo"
-            android:adjustViewBounds="true" />
-    </com.android.launcher3.HolographicLinearLayout>
-</RelativeLayout>
diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml
index 1ef7df5..960ccf3 100644
--- a/res/layout-sw720dp/launcher.xml
+++ b/res/layout-sw720dp/launcher.xml
@@ -66,16 +66,6 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_horizontal" />
 
-        <com.android.launcher3.DrawableStateProxyView
-            android:id="@+id/voice_button_proxy"
-            android:layout_width="0dp"
-            android:layout_height="0dp"
-            android:layout_gravity="top|end"
-            android:clickable="true"
-            android:onClick="onClickVoiceButton"
-            android:importantForAccessibility="no"
-            launcher:sourceViewId="@+id/voice_button" />
-
         <include layout="@layout/apps_customize_pane"
             android:id="@+id/apps_customize_pane"
             android:layout_width="match_parent"
diff --git a/res/layout-sw720dp/qsb.xml b/res/layout-sw720dp/qsb.xml
deleted file mode 100644
index 0afc2d2..0000000
--- a/res/layout-sw720dp/qsb.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/search_frame">
-   <!-- Global search icon -->
-   <com.android.launcher3.HolographicLinearLayout
-        style="@style/SearchButton.WithPaddingStart"
-        launcher:sourceImageViewId="@+id/search_button"
-        android:id="@+id/search_button_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_gravity="center_vertical"
-        android:layout_centerVertical="true"
-        android:layout_alignParentStart="true"
-        android:layout_toStartOf="@+id/voice_button_container"
-        android:onClick="onClickSearchButton"
-        android:focusable="true"
-        android:clickable="true"
-        android:contentDescription="@string/accessibility_search_button">
-       <ImageView
-            android:id="@+id/search_button"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="start"
-            android:scaleType="fitCenter"
-            android:src="@drawable/ic_home_search_normal_holo"
-            android:adjustViewBounds="true" />
-    </com.android.launcher3.HolographicLinearLayout>
-
-    <!-- Voice search icon -->
-    <com.android.launcher3.HolographicLinearLayout
-        style="@style/SearchButton"
-        launcher:sourceImageViewId="@+id/voice_button"
-        android:id="@+id/voice_button_container"
-        android:layout_width="@dimen/app_icon_size"
-        android:layout_height="match_parent"
-        android:layout_gravity="center_vertical"
-        android:layout_centerVertical="true"
-        android:layout_alignParentEnd="true"
-        android:paddingEnd="8dp"
-        android:paddingRight="8dp"
-        android:onClick="onClickVoiceButton"
-        android:focusable="true"
-        android:clickable="true"
-        android:contentDescription="@string/accessibility_voice_search_button">
-        <ImageView
-            android:id="@+id/voice_button"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_gravity="end"
-            android:scaleType="fitCenter"
-            android:src="@drawable/ic_home_voice_search_holo"
-            android:adjustViewBounds="true" />
-    </com.android.launcher3.HolographicLinearLayout>
-</RelativeLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 5d01f36..f37f08f 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Verwyder"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Deïnstalleer"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Programinligting"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Soek"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Stemsoektog"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Programme"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Verwyder"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Deïnstalleer opdatering"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 0326109..1a25f66 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"አስወግድ"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"አራግፍ"</string>
     <string name="info_target_label" msgid="8053346143994679532">"የመተግበሪያ መረጃ"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"ፍለጋ"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"የድምፅ ፍለጋ"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"መተግበሪያዎች"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"አስወግድ"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"ዝማኔ አራግፍ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 919f0d0..592be58 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"إزالة"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"إزالة"</string>
     <string name="info_target_label" msgid="8053346143994679532">"معلومات عن التطبيق"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"بحث"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"البحث الصوتي"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"التطبيقات"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"إزالة"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"إزالة التحديث"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 6654f1d..3f710db 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Премахване"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Деинсталиране"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Информация за приложението"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Търсене"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Гласово търсене"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Приложения"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Премахване"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Деинст. на актуализацията"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 019e82f..89e582a 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Suprimeix"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Desinstal·la"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informació de l\'aplicació"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Cerca"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Cerca per veu"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplicacions"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Suprimeix"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Desinstal·la l\'actualització"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 95125bc..69ec22c 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Odstranit"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Odinstalovat"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informace o aplikaci"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Hledat"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Hlasové vyhledávání"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplikace"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Odstranit"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Odinstalovat aktualizaci"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index c3bb088..5fa6aa6 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Fjern"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Afinstaller"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Oplysninger om appen"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Søg"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Talesøgning"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Fjern"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Afinstaller opdatering"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 7e4ae47..059983e 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Entfernen"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Deinstallieren"</string>
     <string name="info_target_label" msgid="8053346143994679532">"App-Info"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Suchen"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Sprachsuche"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Entfernen"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Update deinstallieren"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 5a36332..12f0dfe 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Κατάργηση"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Κατάργηση εγκατάστασης"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Πληροφορίες εφαρμογής"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Αναζήτηση"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Φωνητική αναζήτηση"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Εφαρμογές"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Κατάργηση"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Κατάργηση εγκατάστασης ενημέρωσης"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 7e21222..0d004fe 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Remove"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Uninstall"</string>
     <string name="info_target_label" msgid="8053346143994679532">"App info"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Search"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Voice Search"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Remove"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Uninstall update"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 7e21222..0d004fe 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Remove"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Uninstall"</string>
     <string name="info_target_label" msgid="8053346143994679532">"App info"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Search"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Voice Search"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Remove"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Uninstall update"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 847faac..4408080 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Eliminar"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Desinstalar"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Información de la aplicación"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Buscar"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Búsqueda por voz"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplicaciones"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Eliminar"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Desinstalar actualización"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 67c283a..898d0ea 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Eliminar"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Desinstalar"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Información de la aplicación"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Buscar"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Búsqueda por voz"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplicaciones"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Eliminar"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Desinstalar actualización"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 1b9f1b7..76b20ab 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Eemalda"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Desinstalli"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Rakenduse teave"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Otsing"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Häälotsing"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Rakendused"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Eemalda"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Desinstalli värskendus"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index ce10c2d..924cccf 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"حذف"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"حذف نصب"</string>
     <string name="info_target_label" msgid="8053346143994679532">"اطلاعات برنامه"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"جستجو"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"جستجوی شفاهی"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"برنامه‌ها"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"حذف"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"حذف نصب به‌روزرسانی"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 0004501..a5da03f 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Poista"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Poista"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Sovelluksen tiedot"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Haku"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Puhehaku"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Sovellukset"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Poista"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Poista päivitys"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index a94f571..62a2b89 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Supprimer"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Désinstaller"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Détails de l\'application"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Rechercher"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Recherche vocale"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Applications"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Supprimer"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Désinstaller la mise à jour"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 0f1aac4..d23b6a4 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Supprimer"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Désinstaller"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informations sur l\'application"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Rechercher"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Recherche vocale"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Applications"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Supprimer"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Désinstaller la mise à jour"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index f14eff7..9372489 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"निकालें"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"अनइंस्टॉल करें"</string>
     <string name="info_target_label" msgid="8053346143994679532">"ऐप्लिकेशन की जानकारी"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"खोजें"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"बोलकर खोजें"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"ऐप्लिकेशन"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"निकालें"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"अपडेट अनइंस्‍टॉल करें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index aa01648..702b474 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Ukloni"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Deinstaliraj"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informacije o aplikaciji"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Pretraži"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Glasovno pretraživanje"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplikacije"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Ukloni"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Deinstalacija ažuriranja"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 4416ab0..513548a 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Eltávolítás"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Eltávolítás"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Alkalmazásinformáció"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Keresés"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Hangalapú keresés"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Alkalmazások"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Eltávolítás"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Eltávolítja a frissítést"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index dcff15c..940c14b 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Հեռացնել"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Ապատեղադրել"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Ծրագրի տեղեկություններ"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Որոնել"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Ձայնային որոնում"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Ծրագրեր"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Հեռացնել"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Ապատեղադրել թարմացումը"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 2eb88c7..b0c5d13 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Hapus"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Copot pemasangan"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Info aplikasi"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Telusuri"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Penelusuran Suara"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplikasi"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Hapus"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Copot pemasangan pembaruan"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index aaddcfc..d78d032 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Rimuovi"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Disinstalla"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informazioni app"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Cerca"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Ricerca vocale"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"App"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Rimuovi"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Disinstalla aggiornamento"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index fc059e0..61fb53e 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"הסר"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"הסר התקנה"</string>
     <string name="info_target_label" msgid="8053346143994679532">"פרטי אפליקציה"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"חפש"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"חיפוש קולי"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"אפליקציות"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"הסר"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"הסר את התקנת העדכון"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index d8ee943..ec872b8 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"削除"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"アンインストール"</string>
     <string name="info_target_label" msgid="8053346143994679532">"アプリ情報"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"検索"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"音声検索"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"アプリ"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"削除"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"更新をアンインストール"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 823d36a..b96d3d2 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"წაშლა"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"დეინსტალაცია"</string>
     <string name="info_target_label" msgid="8053346143994679532">"აპის შესახებ"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"ძიება"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ხმოვანი ძიება"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"აპები"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"წაშლა"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"განახლების დეინსტალაცია"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 390f0ee..670ac70 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"លុប​ចេញ"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"លុប"</string>
     <string name="info_target_label" msgid="8053346143994679532">"ព័ត៌មាន​កម្មវិធី"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"ស្វែងរក"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ស្វែងរក​តាម​សំឡេង"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"កម្មវិធី"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"លុប​ចេញ"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"លុប​បច្ចុប្បន្នភាព"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index d470283..c73b431 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"삭제"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"제거"</string>
     <string name="info_target_label" msgid="8053346143994679532">"앱 정보"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"검색"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"음성 검색"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"앱"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"삭제"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"업데이트 제거"</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index ac47503..1beb049 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"ລຶບ"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"ຖອນ​ການ​ຕິດ​ຕັ້ງ"</string>
     <string name="info_target_label" msgid="8053346143994679532">"ຂໍ້ມູນແອັບຯ"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"ຊອກຫາ"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ຊອກຫາດ້ວຍສຽງ"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"ແອັບຯ"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"ລຶບ"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"ຖອນອັບເດດ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 6e47f67..897c2fd 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Pašalinti"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Pašalinti"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Programos informacija"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Ieškoti"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Paieška balsu"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Programos"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Pašalinti"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Pašalinti naujinį"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 4079331..13a4760 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Noņemt"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Atinstalēt"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Lietotnes informācija"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Meklēt"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Meklēšana ar balsi"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Lietotnes"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Noņemt"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Atinstalēt atjauninājumu"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index a22b8fc..f258b4c 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Устгах"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Устгах"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Апп мэдээлэл"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Хайх"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Дуун хайлт"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Апп"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Устгах"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Шинэчлэлийг устгах"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 5f96ead..532b6ad 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Alih keluar"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Nyahpasang"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Maklumat apl"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Cari"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Carian Suara"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apl"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Alih keluar"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Nyahpasang kemas kini"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index a7faeaf..a9bbe08 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Fjern"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Avinstaller"</string>
     <string name="info_target_label" msgid="8053346143994679532">"App-info"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Søk"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Talesøk"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apper"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Fjern"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Avinstaller oppdateringen"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 3e0f640..8a32fd1 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Verwijderen"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Verwijderen"</string>
     <string name="info_target_label" msgid="8053346143994679532">"App-info"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Zoeken"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Gesproken zoekopdracht"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Verwijderen"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Update verwijderen"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index ee48b24..4eabae9 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Usuń"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Odinstaluj"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informacje o aplikacji"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Szukaj"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Wyszukiwanie głosowe"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplikacje"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Usuń"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Odinstaluj aktualizację"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index e19fcea..4397ebf 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Remover"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Desinstalar"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informações da aplicação"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Pesquisar"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Pesquisa por Voz"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplicações"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Remover"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Desinstalar atualização"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 6c9a0d9..07c8214 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Remover"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Desinstalar"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informações do app"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Pesquisar"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Pesquisa por voz"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Remover"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Desinstalar atualização"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index a509399..54cb46c 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Eliminați"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Dezinstalați"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informații despre aplicație"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Căutați"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Căutare vocală"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplicații"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Eliminați"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Dezinstalați actualizarea"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 8b9d706..70ef0f5 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Удалить"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Удалить"</string>
     <string name="info_target_label" msgid="8053346143994679532">"О приложении"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Поиск"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Голосовой поиск"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Приложения"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Удалить"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Удалить обновление"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 2ffa4b4..9cd0fbe 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Odstrániť"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Odinštalovať"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Informácie o aplikácii"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Vyhľadať"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Hlasové vyhľadávanie"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplikácie"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Odstrániť"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Odinštalovať aktualizáciu"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index f02ea27..d5a34d5 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Odstrani"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Odstrani"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Podatki o aplikaciji"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Iskanje"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Glasovno iskanje"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Aplikacije"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Odstrani"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Odstrani posodobitev"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 3509252..9f40890 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Уклони"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Деинсталирај"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Информације о апликацији"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Претражи"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Гласовна претрага"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Апликације"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Уклони"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Деинсталирај ажурирање"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 572309d..25f4d26 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Ta bort"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Avinstallera"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Info om appen"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Sök"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Röstsökning"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Appar"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Ta bort"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Avinstallera uppdatering"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 05df3c4..fa81061 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Ondoa"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Ondoa"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Maelezo ya programu"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Tafuta"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Kutafuta kwa Kutamka"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Programu"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Ondoa"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Ondoa sasisho"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index bc9ddfb..0fc20d2 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"ลบ"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"ถอนการติดตั้ง"</string>
     <string name="info_target_label" msgid="8053346143994679532">"ข้อมูลแอป"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"ค้นหา"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ค้นหาด้วยเสียง"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"แอป"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"ลบ"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"ถอนการติดตั้งการอัปเดต"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 9078d15..4d2f1d4 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Alisin"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"I-uninstall"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Impormasyon ng app"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Hanapin"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Paghahanap Gamit ang Boses"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Alisin"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"I-uninstall ang update"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 341def7..6c78f6f 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Kaldır"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Yüklemeyi kaldır"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Uygulama bilgileri"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Ara"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Sesli Arama"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Uygulamalar"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Kaldır"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Güncellemeyi kaldır"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 78cda53..71e1816 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Вилучити"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Видалити"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Про програму"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Пошук"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Голосовий пошук"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Додатки"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Вилучити"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Видалити оновлення"</string>
diff --git a/res/values-v17/styles.xml b/res/values-v17/styles.xml
index 71c4bfa..11d2a1f 100644
--- a/res/values-v17/styles.xml
+++ b/res/values-v17/styles.xml
@@ -3,7 +3,4 @@
     <style name="PagedViewWidgetImageView">
         <item name="android:paddingStart">@dimen/app_widget_preview_padding_left</item>
     </style>
-    <style name="SearchButton.WithPaddingStart">
-        <item name="android:paddingStart">8dp</item>
-    </style>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 61715c8..5bc1627 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Xóa"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Gỡ cài đặt"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Thông tin ứng dụng"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Tìm kiếm"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Tìm kiếm bằng giọng nói"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Ứng dụng"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Xóa"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Gỡ cài đặt cập nhật"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index e716fde..b7c42fe 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"删除"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"卸载"</string>
     <string name="info_target_label" msgid="8053346143994679532">"应用信息"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"搜索"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"语音搜索"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"应用"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"删除"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"卸载更新内容"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 02c90f2..2eb7008 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"移除"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"解除安裝"</string>
     <string name="info_target_label" msgid="8053346143994679532">"應用程式資料"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"搜尋"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"語音搜尋"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"應用程式"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"移除"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"解除安裝更新"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index f9fdaa4..52e7583 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"移除"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"解除安裝"</string>
     <string name="info_target_label" msgid="8053346143994679532">"應用程式資訊"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"搜尋"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"語音搜尋"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"應用程式"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"移除"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"解除安裝更新"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 79f8b54..aea09e8 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -58,8 +58,6 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Susa"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Khipha"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Ulwazi lohlelo lokusebenza"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Sesha"</string>
-    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Ukusesha ngezwi"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Izinhlelo zokusebenza"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Susa"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Khipha isibuyekezo"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index a52bbe2..3331cde 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -18,13 +18,6 @@
 
 <resources>
 
-    <!-- DrawableStateProxyView specific attributes. These attributes are used to customize
-         a DrawableStateProxyView view in XML files. -->
-    <declare-styleable name="DrawableStateProxyView">
-        <!-- The source view to delegate touch presses events to. -->
-        <attr name="sourceViewId" format="integer" />
-    </declare-styleable>
-
     <!-- Page Indicator specific attributes. -->
     <declare-styleable name="PageIndicator">
         <attr name="windowSize" format="integer"  />
@@ -76,13 +69,6 @@
         <attr name="strokeWidth" format="float" />
     </declare-styleable>
 
-    <!-- HolographicLinearLayout specific attributes. -->
-    <declare-styleable name="HolographicLinearLayout">
-        <!-- The source view to generate and apply the drawable states to/from -->
-        <attr name="sourceImageViewId" format="integer" />
-        <attr name="stateHotwordOn" format="boolean" />
-    </declare-styleable>
-
     <!-- PagedView specific attributes. These attributes are used to customize
          a PagedView view in XML files. -->
     <declare-styleable name="PagedView">
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 493f29c..f12cb57 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -43,9 +43,6 @@
 <!-- QSB -->
     <dimen name="toolbar_button_vertical_padding">4dip</dimen>
     <dimen name="toolbar_button_horizontal_padding">12dip</dimen>
-    <!-- External toolbar icon size (for bounds) -->
-    <dimen name="toolbar_external_icon_width">36dp</dimen>
-    <dimen name="toolbar_external_icon_height">36dp</dimen>
 
 <!-- AllApps/Customize/AppsCustomize -->
     <!-- The height of the tab bar - if this changes, we should update the
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b3abe8f..b6f4237 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -132,10 +132,6 @@
     <!-- Label for the info icon. [CHAR_LIMIT=20] -->
     <string name="info_target_label">App info</string>
 
-    <!-- Accessibility: Search button -->
-    <string name="accessibility_search_button">Search</string>
-    <!-- Accessibility: Voice Search button -->
-    <string name="accessibility_voice_search_button">Voice Search</string>
     <!-- Accessibility: AllApps button -->
     <string name="accessibility_all_apps_button">Apps</string>
     <!-- Accessibility: Delete button -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 15415c7..77798f1 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -51,8 +51,6 @@
         <item name="customShadows">false</item>
     </style>
 
-    <style name="SearchDropTargetBar"></style>
-
     <style name="SearchButton"></style>
 
     <style name="DropTargetButtonContainer">
@@ -97,8 +95,4 @@
         <item name="android:paddingLeft">@dimen/app_widget_preview_padding_left</item>
     </style>
 
-    <style name="SearchButton.WithPaddingStart">
-        <item name="android:paddingLeft">8dp</item>
-    </style>
-
 </resources>
diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java
index bfcad84..a66bac0 100644
--- a/src/com/android/launcher3/AppInfo.java
+++ b/src/com/android/launcher3/AppInfo.java
@@ -84,16 +84,11 @@
         flags = initFlags(info);
         firstInstallTime = info.getFirstInstallTime();
         iconCache.getTitleAndIcon(this, info, labelCache);
-        intent = new Intent(Intent.ACTION_MAIN);
-        intent.addCategory(Intent.CATEGORY_LAUNCHER);
-        intent.setComponent(info.getComponentName());
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-        long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user);
-        intent.putExtra(EXTRA_PROFILE, serialNumber);
+        intent = makeLaunchIntent(context, info, user);
         this.user = user;
     }
 
-    private static int initFlags(LauncherActivityInfoCompat info) {
+    public static int initFlags(LauncherActivityInfoCompat info) {
         int appFlags = info.getApplicationInfo().flags;
         int flags = 0;
         if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
@@ -137,4 +132,14 @@
     public ShortcutInfo makeShortcut() {
         return new ShortcutInfo(this);
     }
+
+    public static Intent makeLaunchIntent(Context context, LauncherActivityInfoCompat info,
+            UserHandleCompat user) {
+        long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user);
+        return new Intent(Intent.ACTION_MAIN)
+            .addCategory(Intent.CATEGORY_LAUNCHER)
+            .setComponent(info.getComponentName())
+            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+            .putExtra(EXTRA_PROFILE, serialNumber);
+    }
 }
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index bd7a772..d6aadce 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -122,9 +122,7 @@
     int allAppsNumRows;
     int allAppsNumCols;
     int searchBarSpaceWidthPx;
-    int searchBarSpaceMaxWidthPx;
     int searchBarSpaceHeightPx;
-    int searchBarHeightPx;
     int pageIndicatorHeightPx;
     int allAppsButtonVisualSize;
 
@@ -372,10 +370,10 @@
         hotseatIconSizePx = (int) (DynamicGrid.pxFromDp(hotseatIconSize, dm) * scale);
 
         // Search Bar
-        searchBarSpaceMaxWidthPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_max_width);
-        searchBarHeightPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_height);
-        searchBarSpaceWidthPx = Math.min(searchBarSpaceMaxWidthPx, widthPx);
-        searchBarSpaceHeightPx = searchBarHeightPx + getSearchBarTopOffset();
+        searchBarSpaceWidthPx = Math.min(widthPx,
+                resources.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_max_width));
+        searchBarSpaceHeightPx = getSearchBarTopOffset()
+                + resources.getDimensionPixelSize(R.dimen.dynamic_grid_search_bar_height);
 
         // Calculate the actual text height
         Paint textPaint = new Paint();
@@ -398,10 +396,6 @@
         folderIconSizePx = iconSizePx + 2 * -folderBackgroundOffset;
 
         // All Apps
-        Rect padding = getWorkspacePadding(isLandscape ?
-                CellLayout.LANDSCAPE : CellLayout.PORTRAIT);
-        int pageIndicatorOffset =
-                resources.getDimensionPixelSize(R.dimen.apps_customize_page_indicator_offset);
         allAppsCellWidthPx = allAppsIconSizePx;
         allAppsCellHeightPx = allAppsIconSizePx + drawablePadding + iconTextSizePx;
         int maxLongEdgeCellCount =
@@ -717,9 +711,6 @@
             lp.gravity = Gravity.TOP | Gravity.LEFT;
             lp.width = searchBarSpaceHeightPx;
             lp.height = LayoutParams.WRAP_CONTENT;
-            searchBar.setPadding(
-                    0, 2 * edgeMarginPx, 0,
-                    2 * edgeMarginPx);
 
             LinearLayout targets = (LinearLayout) searchBar.findViewById(R.id.drag_target_bar);
             targets.setOrientation(LinearLayout.VERTICAL);
@@ -728,27 +719,9 @@
             lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
             lp.width = searchBarSpaceWidthPx;
             lp.height = searchBarSpaceHeightPx;
-            searchBar.setPadding(
-                    2 * edgeMarginPx,
-                    getSearchBarTopOffset(),
-                    2 * edgeMarginPx, 0);
         }
         searchBar.setLayoutParams(lp);
 
-        // Layout the voice proxy
-        View voiceButtonProxy = launcher.findViewById(R.id.voice_button_proxy);
-        if (voiceButtonProxy != null) {
-            if (hasVerticalBarLayout) {
-                // TODO: MOVE THIS INTO SEARCH BAR MEASURE
-            } else {
-                lp = (FrameLayout.LayoutParams) voiceButtonProxy.getLayoutParams();
-                lp.gravity = Gravity.TOP | Gravity.END;
-                lp.width = (widthPx - searchBarSpaceWidthPx) / 2 +
-                        2 * iconSizePx;
-                lp.height = searchBarSpaceHeightPx;
-            }
-        }
-
         // Layout the workspace
         PagedView workspace = (PagedView) launcher.findViewById(R.id.workspace);
         lp = (FrameLayout.LayoutParams) workspace.getLayoutParams();
diff --git a/src/com/android/launcher3/DrawableStateProxyView.java b/src/com/android/launcher3/DrawableStateProxyView.java
deleted file mode 100644
index c83659a..0000000
--- a/src/com/android/launcher3/DrawableStateProxyView.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2012 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.launcher3;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.LinearLayout;
-
-public class DrawableStateProxyView extends LinearLayout {
-
-    private View mView;
-    private int mViewId;
-
-    public DrawableStateProxyView(Context context) {
-        this(context, null);
-    }
-
-    public DrawableStateProxyView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-
-    public DrawableStateProxyView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DrawableStateProxyView,
-                defStyle, 0);
-        mViewId = a.getResourceId(R.styleable.DrawableStateProxyView_sourceViewId, -1);
-        a.recycle();
-
-        setFocusable(false);
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        super.drawableStateChanged();
-
-        if (mView == null) {
-            View parent = (View) getParent();
-            mView = parent.findViewById(mViewId);
-        }
-        if (mView != null) {
-            mView.setPressed(isPressed());
-            mView.setHovered(isHovered());
-        }
-    }
-
-    @Override
-    public boolean onHoverEvent(MotionEvent event) {
-        return false;
-    }
-}
diff --git a/src/com/android/launcher3/HolographicImageView.java b/src/com/android/launcher3/HolographicImageView.java
deleted file mode 100644
index 18ac092..0000000
--- a/src/com/android/launcher3/HolographicImageView.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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.launcher3;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.StateListDrawable;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.ImageView;
-
-public class HolographicImageView extends ImageView {
-
-    private final HolographicViewHelper mHolographicHelper;
-    private boolean mHotwordOn;
-    private boolean mIsPressed;
-    private boolean mIsFocused;
-
-    public HolographicImageView(Context context) {
-        this(context, null);
-    }
-
-    public HolographicImageView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public HolographicImageView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        mHolographicHelper = new HolographicViewHelper(context);
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HolographicLinearLayout,
-                defStyle, 0);
-        mHotwordOn = a.getBoolean(R.styleable.HolographicLinearLayout_stateHotwordOn, false);
-        a.recycle();
-
-        setOnTouchListener(new OnTouchListener() {
-            @Override
-            public boolean onTouch(View v, MotionEvent event) {
-                if (isPressed() != mIsPressed) {
-                    mIsPressed = isPressed();
-                    refreshDrawableState();
-                }
-                return false;
-            }
-        });
-
-        setOnFocusChangeListener(new OnFocusChangeListener() {
-            @Override
-            public void onFocusChange(View v, boolean hasFocus) {
-                if (isFocused() != mIsFocused) {
-                    mIsFocused = isFocused();
-                    refreshDrawableState();
-                }
-            }
-        });
-    }
-
-    void invalidatePressedFocusedStates() {
-        mHolographicHelper.invalidatePressedFocusedStates(this);
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        super.drawableStateChanged();
-
-        mHolographicHelper.generatePressedFocusedStates(this);
-        Drawable d = getDrawable();
-        if (d instanceof StateListDrawable) {
-            StateListDrawable sld = (StateListDrawable) d;
-            sld.setState(getDrawableState());
-            sld.invalidateSelf();
-        }
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        // One time call to generate the pressed/focused state -- must be called after
-        // measure/layout
-        mHolographicHelper.generatePressedFocusedStates(this);
-    }
-
-    private boolean isHotwordOn() {
-        return mHotwordOn;
-    }
-
-    public void setHotwordState(boolean on) {
-        if (on == mHotwordOn) {
-            return;
-        }
-        mHotwordOn = on;
-        refreshDrawableState();
-    }
-
-    @Override
-    public int[] onCreateDrawableState(int extraSpace) {
-        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
-        if (isHotwordOn()) {
-            mergeDrawableStates(drawableState, new int[] {R.attr.stateHotwordOn});
-        }
-        return drawableState;
-    }
-}
diff --git a/src/com/android/launcher3/HolographicLinearLayout.java b/src/com/android/launcher3/HolographicLinearLayout.java
deleted file mode 100644
index 5344a7e..0000000
--- a/src/com/android/launcher3/HolographicLinearLayout.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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.launcher3;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.StateListDrawable;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-public class HolographicLinearLayout extends LinearLayout {
-    private final HolographicViewHelper mHolographicHelper;
-    private ImageView mImageView;
-    private int mImageViewId;
-
-    private boolean mHotwordOn;
-    private boolean mIsPressed;
-    private boolean mIsFocused;
-
-    public HolographicLinearLayout(Context context) {
-        this(context, null);
-    }
-
-    public HolographicLinearLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public HolographicLinearLayout(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HolographicLinearLayout,
-                defStyle, 0);
-        mImageViewId = a.getResourceId(R.styleable.HolographicLinearLayout_sourceImageViewId, -1);
-        mHotwordOn = a.getBoolean(R.styleable.HolographicLinearLayout_stateHotwordOn, false);
-        a.recycle();
-
-
-        setWillNotDraw(false);
-        mHolographicHelper = new HolographicViewHelper(context);
-
-        setOnTouchListener(new OnTouchListener() {
-            @Override
-            public boolean onTouch(View v, MotionEvent event) {
-                if (isPressed() != mIsPressed) {
-                    mIsPressed = isPressed();
-                    refreshDrawableState();
-                }
-                return false;
-            }
-        });
-
-        setOnFocusChangeListener(new OnFocusChangeListener() {
-            @Override
-            public void onFocusChange(View v, boolean hasFocus) {
-                if (isFocused() != mIsFocused) {
-                    mIsFocused = isFocused();
-                    refreshDrawableState();
-                }
-            }
-        });
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        super.drawableStateChanged();
-
-        if (mImageView != null) {
-            mHolographicHelper.generatePressedFocusedStates(mImageView);
-            Drawable d = mImageView.getDrawable();
-            if (d instanceof StateListDrawable) {
-                StateListDrawable sld = (StateListDrawable) d;
-                sld.setState(getDrawableState());
-                sld.invalidateSelf();
-            }
-        }
-    }
-
-    void invalidatePressedFocusedStates() {
-        mHolographicHelper.invalidatePressedFocusedStates(mImageView);
-        invalidate();
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        // One time call to generate the pressed/focused state -- must be called after
-        // measure/layout
-        if (mImageView == null) {
-            mImageView = (ImageView) findViewById(mImageViewId);
-        }
-        mHolographicHelper.generatePressedFocusedStates(mImageView);
-    }
-
-    private boolean isHotwordOn() {
-        return mHotwordOn;
-    }
-
-    public void setHotwordState(boolean on) {
-        if (on == mHotwordOn) {
-            return;
-        }
-        mHotwordOn = on;
-        refreshDrawableState();
-    }
-
-    @Override
-    public int[] onCreateDrawableState(int extraSpace) {
-        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
-        if (isHotwordOn()) {
-            mergeDrawableStates(drawableState, new int[] {R.attr.stateHotwordOn});
-        }
-        return drawableState;
-    }
-}
diff --git a/src/com/android/launcher3/HolographicViewHelper.java b/src/com/android/launcher3/HolographicViewHelper.java
deleted file mode 100644
index 7ef0355..0000000
--- a/src/com/android/launcher3/HolographicViewHelper.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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.launcher3;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.StateListDrawable;
-import android.widget.ImageView;
-
-public class HolographicViewHelper {
-
-    private final Canvas mTempCanvas = new Canvas();
-
-    private boolean mStatesUpdated;
-    private int mHighlightColor, mHotwordColor;
-
-    public HolographicViewHelper(Context context) {
-        Resources res = context.getResources();
-        mHighlightColor = res.getColor(android.R.color.holo_blue_light);
-        mHotwordColor = res.getColor(android.R.color.holo_green_light);
-    }
-
-    /**
-     * Generate the pressed/focused states if necessary.
-     */
-    void generatePressedFocusedStates(ImageView v) {
-        if (!mStatesUpdated && v != null) {
-            mStatesUpdated = true;
-            Bitmap original = createOriginalImage(v, mTempCanvas);
-            Bitmap outline = createImageWithOverlay(v, mTempCanvas, mHighlightColor);
-            Bitmap hotword = createImageWithOverlay(v, mTempCanvas, mHotwordColor);
-            FastBitmapDrawable originalD = new FastBitmapDrawable(original);
-            FastBitmapDrawable outlineD = new FastBitmapDrawable(outline);
-            FastBitmapDrawable hotwordD = new FastBitmapDrawable(hotword);
-
-            StateListDrawable states = new StateListDrawable();
-
-            states.addState(new int[] {android.R.attr.state_pressed}, outlineD);
-            states.addState(new int[] {android.R.attr.state_focused}, outlineD);
-            states.addState(new int[] {R.attr.stateHotwordOn}, hotwordD);
-            states.addState(new int[] {}, originalD);
-            v.setImageDrawable(states);
-        }
-    }
-
-    /**
-     * Invalidates the pressed/focused states.
-     */
-    void invalidatePressedFocusedStates(ImageView v) {
-        mStatesUpdated = false;
-        if (v != null) {
-            v.invalidate();
-        }
-    }
-
-    /**
-     * Creates a copy of the original image.
-     */
-    private Bitmap createOriginalImage(ImageView v, Canvas canvas) {
-        final Drawable d = v.getDrawable();
-        final Bitmap b = Bitmap.createBitmap(
-                d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
-
-        canvas.setBitmap(b);
-        canvas.save();
-        d.draw(canvas);
-        canvas.restore();
-        canvas.setBitmap(null);
-
-        return b;
-    }
-
-    /**
-     * Creates a new press state image which is the old image with a blue overlay.
-     * Responsibility for the bitmap is transferred to the caller.
-     */
-    private Bitmap createImageWithOverlay(ImageView v, Canvas canvas, int color) {
-        final Drawable d = v.getDrawable();
-        final Bitmap b = Bitmap.createBitmap(
-                d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
-
-        canvas.setBitmap(b);
-        canvas.save();
-        d.draw(canvas);
-        canvas.restore();
-        canvas.drawColor(color, PorterDuff.Mode.SRC_IN);
-        canvas.setBitmap(null);
-
-        return b;
-    }
-}
diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java
index e9fb499..395c341 100644
--- a/src/com/android/launcher3/InstallShortcutReceiver.java
+++ b/src/com/android/launcher3/InstallShortcutReceiver.java
@@ -27,14 +27,18 @@
 import android.text.TextUtils;
 import android.util.Base64;
 import android.util.Log;
-import android.widget.Toast;
 
+import com.android.launcher3.compat.LauncherActivityInfoCompat;
+import com.android.launcher3.compat.LauncherAppsCompat;
 import com.android.launcher3.compat.UserHandleCompat;
+import com.android.launcher3.compat.UserManagerCompat;
 
+import org.json.JSONException;
 import org.json.JSONObject;
 import org.json.JSONStringer;
 import org.json.JSONTokener;
 
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -47,73 +51,49 @@
     private static final String ACTION_INSTALL_SHORTCUT =
             "com.android.launcher.action.INSTALL_SHORTCUT";
 
-    private static final String DATA_INTENT_KEY = "intent.data";
     private static final String LAUNCH_INTENT_KEY = "intent.launch";
     private static final String NAME_KEY = "name";
     private static final String ICON_KEY = "icon";
     private static final String ICON_RESOURCE_NAME_KEY = "iconResource";
     private static final String ICON_RESOURCE_PACKAGE_NAME_KEY = "iconResourcePackage";
+
+    private static final String APP_SHORTCUT_TYPE_KEY = "isAppShortcut";
+    private static final String USER_HANDLE_KEY = "userHandle";
+
     // The set of shortcuts that are pending install
     private static final String APPS_PENDING_INSTALL = "apps_to_install";
 
     public static final int NEW_SHORTCUT_BOUNCE_DURATION = 450;
     public static final int NEW_SHORTCUT_STAGGER_DELAY = 85;
 
-    private static final int INSTALL_SHORTCUT_SUCCESSFUL = 0;
-    private static final int INSTALL_SHORTCUT_IS_DUPLICATE = -1;
-
-    private static Object sLock = new Object();
-
-    private static void addToStringSet(SharedPreferences sharedPrefs,
-            SharedPreferences.Editor editor, String key, String value) {
-        Set<String> strings = sharedPrefs.getStringSet(key, null);
-        if (strings == null) {
-            strings = new HashSet<String>(1);
-        } else {
-            strings = new HashSet<String>(strings);
-        }
-        strings.add(value);
-        editor.putStringSet(key, strings);
-    }
+    private static final Object sLock = new Object();
 
     private static void addToInstallQueue(
             SharedPreferences sharedPrefs, PendingInstallShortcutInfo info) {
         synchronized(sLock) {
-            try {
-                JSONStringer json = new JSONStringer()
-                    .object()
-                    .key(DATA_INTENT_KEY).value(info.data.toUri(0))
-                    .key(LAUNCH_INTENT_KEY).value(info.launchIntent.toUri(0))
-                    .key(NAME_KEY).value(info.name);
-                if (info.icon != null) {
-                    byte[] iconByteArray = ItemInfo.flattenBitmap(info.icon);
-                    json = json.key(ICON_KEY).value(
-                        Base64.encodeToString(
-                            iconByteArray, 0, iconByteArray.length, Base64.DEFAULT));
+            String encoded = info.encodeToString();
+            if (encoded != null) {
+                Set<String> strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null);
+                if (strings == null) {
+                    strings = new HashSet<String>(1);
+                } else {
+                    strings = new HashSet<String>(strings);
                 }
-                if (info.iconResource != null) {
-                    json = json.key(ICON_RESOURCE_NAME_KEY).value(info.iconResource.resourceName);
-                    json = json.key(ICON_RESOURCE_PACKAGE_NAME_KEY)
-                        .value(info.iconResource.packageName);
-                }
-                json = json.endObject();
-                SharedPreferences.Editor editor = sharedPrefs.edit();
-                if (DBG) Log.d(TAG, "Adding to APPS_PENDING_INSTALL: " + json);
-                addToStringSet(sharedPrefs, editor, APPS_PENDING_INSTALL, json.toString());
-                editor.commit();
-            } catch (org.json.JSONException e) {
-                Log.d(TAG, "Exception when adding shortcut: " + e);
+                strings.add(encoded);
+                sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL, strings).commit();
             }
         }
     }
 
-    public static void removeFromInstallQueue(SharedPreferences sharedPrefs,
-                                              ArrayList<String> packageNames) {
+    public static void removeFromInstallQueue(Context context, ArrayList<String> packageNames,
+            UserHandleCompat user) {
         if (packageNames.isEmpty()) {
             return;
         }
+        String spKey = LauncherAppState.getSharedPreferencesKey();
+        SharedPreferences sp = context.getSharedPreferences(spKey, Context.MODE_PRIVATE);
         synchronized(sLock) {
-            Set<String> strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null);
+            Set<String> strings = sp.getStringSet(APPS_PENDING_INSTALL, null);
             if (DBG) {
                 Log.d(TAG, "APPS_PENDING_INSTALL: " + strings
                         + ", removing packages: " + packageNames);
@@ -122,34 +102,20 @@
                 Set<String> newStrings = new HashSet<String>(strings);
                 Iterator<String> newStringsIter = newStrings.iterator();
                 while (newStringsIter.hasNext()) {
-                    String json = newStringsIter.next();
-                    try {
-                        JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
-                        Intent launchIntent = Intent.parseUri(object.getString(LAUNCH_INTENT_KEY), 0);
-                        String pn = launchIntent.getPackage();
-                        if (pn == null) {
-                            if (launchIntent.getComponent() == null) {
-                                continue;
-                            }
-                            pn = launchIntent.getComponent().getPackageName();
-                        }
-                        if (packageNames.contains(pn)) {
-                            newStringsIter.remove();
-                        }
-                    } catch (org.json.JSONException e) {
-                        Log.d(TAG, "Exception reading shortcut to remove: " + e);
-                    } catch (java.net.URISyntaxException e) {
-                        Log.d(TAG, "Exception reading shortcut to remove: " + e);
+                    String encoded = newStringsIter.next();
+                    PendingInstallShortcutInfo info = decode(encoded, context);
+                    if (info == null || (packageNames.contains(info.getTargetPackage())
+                            && user.equals(info.user))) {
+                        newStringsIter.remove();
                     }
                 }
-                sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL,
-                        new HashSet<String>(newStrings)).commit();
+                sp.edit().putStringSet(APPS_PENDING_INSTALL, newStrings).commit();
             }
         }
     }
 
     private static ArrayList<PendingInstallShortcutInfo> getAndClearInstallQueue(
-            SharedPreferences sharedPrefs) {
+            SharedPreferences sharedPrefs, Context context) {
         synchronized(sLock) {
             Set<String> strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null);
             if (DBG) Log.d(TAG, "Getting and clearing APPS_PENDING_INSTALL: " + strings);
@@ -158,36 +124,10 @@
             }
             ArrayList<PendingInstallShortcutInfo> infos =
                 new ArrayList<PendingInstallShortcutInfo>();
-            for (String json : strings) {
-                try {
-                    JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
-                    Intent data = Intent.parseUri(object.getString(DATA_INTENT_KEY), 0);
-                    Intent launchIntent =
-                            Intent.parseUri(object.getString(LAUNCH_INTENT_KEY), 0);
-                    String name = object.getString(NAME_KEY);
-                    String iconBase64 = object.optString(ICON_KEY);
-                    String iconResourceName = object.optString(ICON_RESOURCE_NAME_KEY);
-                    String iconResourcePackageName =
-                        object.optString(ICON_RESOURCE_PACKAGE_NAME_KEY);
-                    if (iconBase64 != null && !iconBase64.isEmpty()) {
-                        byte[] iconArray = Base64.decode(iconBase64, Base64.DEFAULT);
-                        Bitmap b = BitmapFactory.decodeByteArray(iconArray, 0, iconArray.length);
-                        data.putExtra(Intent.EXTRA_SHORTCUT_ICON, b);
-                    } else if (iconResourceName != null && !iconResourceName.isEmpty()) {
-                        Intent.ShortcutIconResource iconResource =
-                            new Intent.ShortcutIconResource();
-                        iconResource.resourceName = iconResourceName;
-                        iconResource.packageName = iconResourcePackageName;
-                        data.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
-                    }
-                    data.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);
-                    PendingInstallShortcutInfo info =
-                        new PendingInstallShortcutInfo(data, name, launchIntent);
+            for (String encoded : strings) {
+                PendingInstallShortcutInfo info = decode(encoded, context);
+                if (info != null) {
                     infos.add(info);
-                } catch (org.json.JSONException e) {
-                    Log.d(TAG, "Exception reading shortcut to add: " + e);
-                } catch (java.net.URISyntaxException e) {
-                    Log.d(TAG, "Exception reading shortcut to add: " + e);
                 }
             }
             sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL, new HashSet<String>()).commit();
@@ -199,49 +139,26 @@
     // processAllPendingInstalls() is called.
     private static boolean mUseInstallQueue = false;
 
-    private static class PendingInstallShortcutInfo {
-        Intent data;
-        Intent launchIntent;
-        String name;
-        Bitmap icon;
-        Intent.ShortcutIconResource iconResource;
-
-        public PendingInstallShortcutInfo(Intent rawData, String shortcutName,
-                Intent shortcutIntent) {
-            data = rawData;
-            name = shortcutName;
-            launchIntent = shortcutIntent;
-        }
-    }
-
     public void onReceive(Context context, Intent data) {
         if (!ACTION_INSTALL_SHORTCUT.equals(data.getAction())) {
             return;
         }
 
         if (DBG) Log.d(TAG, "Got INSTALL_SHORTCUT: " + data.toUri(0));
+        PendingInstallShortcutInfo info = new PendingInstallShortcutInfo(data, context);
 
-        Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
-        if (intent == null) {
-            return;
-        }
+        queuePendingShortcutInfo(info, context);
+    }
 
-        // This name is only used for comparisons and notifications, so fall back to activity name
-        // if not supplied
-        String name = ensureValidName(context, intent,
-                data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME)).toString();
-        Bitmap icon = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON);
-        Intent.ShortcutIconResource iconResource =
-            data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE);
+    static void queueInstallShortcut(LauncherActivityInfoCompat info, Context context) {
+        queuePendingShortcutInfo(new PendingInstallShortcutInfo(info, context), context);
+    }
 
+    private static void queuePendingShortcutInfo(PendingInstallShortcutInfo info, Context context) {
         // Queue the item up for adding if launcher has not loaded properly yet
         LauncherAppState.setApplicationContext(context.getApplicationContext());
         LauncherAppState app = LauncherAppState.getInstance();
-        boolean launcherNotLoaded = (app.getDynamicGrid() == null);
-
-        PendingInstallShortcutInfo info = new PendingInstallShortcutInfo(data, name, intent);
-        info.icon = icon;
-        info.iconResource = iconResource;
+        boolean launcherNotLoaded = app.getModel().getCallback() == null;
 
         String spKey = LauncherAppState.getSharedPreferencesKey();
         SharedPreferences sp = context.getSharedPreferences(spKey, Context.MODE_PRIVATE);
@@ -261,33 +178,22 @@
     static void flushInstallQueue(Context context) {
         String spKey = LauncherAppState.getSharedPreferencesKey();
         SharedPreferences sp = context.getSharedPreferences(spKey, Context.MODE_PRIVATE);
-        ArrayList<PendingInstallShortcutInfo> installQueue = getAndClearInstallQueue(sp);
+        ArrayList<PendingInstallShortcutInfo> installQueue = getAndClearInstallQueue(sp, context);
         if (!installQueue.isEmpty()) {
             Iterator<PendingInstallShortcutInfo> iter = installQueue.iterator();
             ArrayList<ItemInfo> addShortcuts = new ArrayList<ItemInfo>();
-            int result = INSTALL_SHORTCUT_SUCCESSFUL;
-            String duplicateName = "";
             while (iter.hasNext()) {
                 final PendingInstallShortcutInfo pendingInfo = iter.next();
-                //final Intent data = pendingInfo.data;
                 final Intent intent = pendingInfo.launchIntent;
-                final String name = pendingInfo.name;
 
                 if (LauncherAppState.isDisableAllApps() && !isValidShortcutLaunchIntent(intent)) {
                     if (DBG) Log.d(TAG, "Ignoring shortcut with launchIntent:" + intent);
                     continue;
                 }
 
-                final boolean exists = LauncherModel.shortcutExists(context, name, intent);
-                //final boolean allowDuplicate = data.getBooleanExtra(Launcher.EXTRA_SHORTCUT_DUPLICATE, true);
-
                 // If the intent specifies a package, make sure the package exists
-                String packageName = intent.getPackage();
-                if (packageName == null) {
-                    packageName = intent.getComponent() == null ? null :
-                        intent.getComponent().getPackageName();
-                }
-                if (packageName != null && !packageName.isEmpty()) {
+                String packageName = pendingInfo.getTargetPackage();
+                if (TextUtils.isEmpty(packageName)) {
                     UserHandleCompat myUserHandle = UserHandleCompat.myUserHandle();
                     if (!LauncherModel.isValidPackage(context, packageName, myUserHandle)) {
                         if (DBG) Log.d(TAG, "Ignoring shortcut for absent package:" + intent);
@@ -295,19 +201,12 @@
                     }
                 }
 
+                final boolean exists = LauncherModel.shortcutExists(context, pendingInfo.label,
+                        intent, pendingInfo.user);
                 if (!exists) {
                     // Generate a shortcut info to add into the model
-                    ShortcutInfo info = getShortcutInfo(context, pendingInfo.data,
-                            pendingInfo.launchIntent);
-                    addShortcuts.add(info);
+                    addShortcuts.add(pendingInfo.getShortcutInfo());
                 }
-
-            }
-
-            // Notify the user once if we weren't able to place any duplicates
-            if (result == INSTALL_SHORTCUT_IS_DUPLICATE) {
-                Toast.makeText(context, context.getString(R.string.shortcut_duplicate,
-                        duplicateName), Toast.LENGTH_SHORT).show();
             }
 
             // Add the new apps to the model and bind them
@@ -342,22 +241,6 @@
         return true;
     }
 
-    private static ShortcutInfo getShortcutInfo(Context context, Intent data,
-                                                Intent launchIntent) {
-        if (launchIntent.getAction() == null) {
-            launchIntent.setAction(Intent.ACTION_VIEW);
-        } else if (launchIntent.getAction().equals(Intent.ACTION_MAIN) &&
-                launchIntent.getCategories() != null &&
-                launchIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) {
-            launchIntent.addFlags(
-                    Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-        }
-        LauncherAppState app = LauncherAppState.getInstance();
-        ShortcutInfo info = app.getModel().infoFromShortcutIntent(context, data);
-        info.title = ensureValidName(context, launchIntent, info.title);
-        return info;
-    }
-
     /**
      * Ensures that we have a valid, non-null name.  If the provided name is null, we will return
      * the application name instead.
@@ -374,4 +257,171 @@
         }
         return name;
     }
+
+    private static class PendingInstallShortcutInfo {
+
+        final LauncherActivityInfoCompat activityInfo;
+
+        final Intent data;
+        final Context mContext;
+        final Intent launchIntent;
+        final String label;
+        final UserHandleCompat user;
+
+        /**
+         * Initializes a PendingInstallShortcutInfo received from a different app.
+         */
+        public PendingInstallShortcutInfo(Intent data, Context context) {
+            this.data = data;
+            mContext = context;
+
+            launchIntent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
+            label = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
+            user = UserHandleCompat.myUserHandle();
+            activityInfo = null;
+        }
+
+        /**
+         * Initializes a PendingInstallShortcutInfo to represent a launcher target.
+         */
+        public PendingInstallShortcutInfo(LauncherActivityInfoCompat info, Context context) {
+            this.data = null;
+            mContext = context;
+            activityInfo = info;
+            user = info.getUser();
+
+            launchIntent = AppInfo.makeLaunchIntent(context, info, user);
+            label = info.getLabel().toString();
+        }
+
+        public String encodeToString() {
+            if (activityInfo != null) {
+                try {
+                    // If it a launcher target, we only need component name, and user to
+                    // recreate this.
+                    return new JSONStringer()
+                        .object()
+                        .key(LAUNCH_INTENT_KEY).value(launchIntent.toUri(0))
+                        .key(APP_SHORTCUT_TYPE_KEY).value(true)
+                        .key(USER_HANDLE_KEY).value(UserManagerCompat.getInstance(mContext)
+                                .getSerialNumberForUser(user))
+                        .endObject().toString();
+                } catch (JSONException e) {
+                    Log.d(TAG, "Exception when adding shortcut: " + e);
+                    return null;
+                }
+            }
+
+            if (launchIntent.getAction() == null) {
+                launchIntent.setAction(Intent.ACTION_VIEW);
+            } else if (launchIntent.getAction().equals(Intent.ACTION_MAIN) &&
+                    launchIntent.getCategories() != null &&
+                    launchIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) {
+                launchIntent.addFlags(
+                        Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+            }
+
+            // This name is only used for comparisons and notifications, so fall back to activity
+            // name if not supplied
+            String name = ensureValidName(mContext, launchIntent, label).toString();
+            Bitmap icon = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON);
+            Intent.ShortcutIconResource iconResource =
+                data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE);
+
+            // Only encode the parameters which are supported by the API.
+            try {
+                JSONStringer json = new JSONStringer()
+                    .object()
+                    .key(LAUNCH_INTENT_KEY).value(launchIntent.toUri(0))
+                    .key(NAME_KEY).value(name);
+                if (icon != null) {
+                    byte[] iconByteArray = ItemInfo.flattenBitmap(icon);
+                    json = json.key(ICON_KEY).value(
+                            Base64.encodeToString(
+                                    iconByteArray, 0, iconByteArray.length, Base64.DEFAULT));
+                }
+                if (iconResource != null) {
+                    json = json.key(ICON_RESOURCE_NAME_KEY).value(iconResource.resourceName);
+                    json = json.key(ICON_RESOURCE_PACKAGE_NAME_KEY)
+                            .value(iconResource.packageName);
+                }
+                return json.endObject().toString();
+            } catch (JSONException e) {
+                Log.d(TAG, "Exception when adding shortcut: " + e);
+            }
+            return null;
+        }
+
+        public ShortcutInfo getShortcutInfo() {
+            if (activityInfo != null) {
+                final ShortcutInfo info = new ShortcutInfo();
+                info.user = user;
+                info.title = label;
+                info.contentDescription = label;
+                info.customIcon = false;
+                info.intent = launchIntent;
+                info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
+                info.flags = AppInfo.initFlags(activityInfo);
+                info.firstInstallTime = activityInfo.getFirstInstallTime();
+                return info;
+            } else {
+                return LauncherAppState.getInstance().getModel().infoFromShortcutIntent(mContext, data);
+            }
+        }
+
+        public String getTargetPackage() {
+            String packageName = launchIntent.getPackage();
+            if (packageName == null) {
+                packageName = launchIntent.getComponent() == null ? null :
+                    launchIntent.getComponent().getPackageName();
+            }
+            return packageName;
+        }
+    }
+
+    private static PendingInstallShortcutInfo decode(String encoded, Context context) {
+        try {
+            JSONObject object = (JSONObject) new JSONTokener(encoded).nextValue();
+            Intent launcherIntent = Intent.parseUri(object.getString(LAUNCH_INTENT_KEY), 0);
+
+            if (object.optBoolean(APP_SHORTCUT_TYPE_KEY)) {
+                // The is an internal launcher target shortcut.
+                UserHandleCompat user = UserManagerCompat.getInstance(context)
+                        .getUserForSerialNumber(object.getLong(USER_HANDLE_KEY));
+                if (user == null) {
+                    return null;
+                }
+
+                LauncherActivityInfoCompat info = LauncherAppsCompat.getInstance(context)
+                        .resolveActivity(launcherIntent, user);
+                return info == null ? null : new PendingInstallShortcutInfo(info, context);
+            }
+
+            Intent data = new Intent();
+            data.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);
+            data.putExtra(Intent.EXTRA_SHORTCUT_NAME, object.getString(NAME_KEY));
+
+            String iconBase64 = object.optString(ICON_KEY);
+            String iconResourceName = object.optString(ICON_RESOURCE_NAME_KEY);
+            String iconResourcePackageName = object.optString(ICON_RESOURCE_PACKAGE_NAME_KEY);
+            if (iconBase64 != null && !iconBase64.isEmpty()) {
+                byte[] iconArray = Base64.decode(iconBase64, Base64.DEFAULT);
+                Bitmap b = BitmapFactory.decodeByteArray(iconArray, 0, iconArray.length);
+                data.putExtra(Intent.EXTRA_SHORTCUT_ICON, b);
+            } else if (iconResourceName != null && !iconResourceName.isEmpty()) {
+                Intent.ShortcutIconResource iconResource =
+                    new Intent.ShortcutIconResource();
+                iconResource.resourceName = iconResourceName;
+                iconResource.packageName = iconResourcePackageName;
+                data.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
+            }
+
+            return new PendingInstallShortcutInfo(data, context);
+        } catch (JSONException e) {
+            Log.d(TAG, "Exception reading shortcut to add: " + e);
+        } catch (URISyntaxException e) {
+            Log.d(TAG, "Exception reading shortcut to add: " + e);
+        }
+        return null;
+    }
 }
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 8b3b2a1..22db3ac 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -66,7 +66,6 @@
 import android.os.Message;
 import android.os.StrictMode;
 import android.os.SystemClock;
-import android.speech.RecognizerIntent;
 import android.text.Selection;
 import android.text.SpannableStringBuilder;
 import android.text.TextUtils;
@@ -96,7 +95,6 @@
 import android.widget.Advanceable;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
-import android.widget.TextView;
 import android.widget.Toast;
 
 import com.android.launcher3.DropTarget.DragObject;
@@ -168,7 +166,6 @@
 
     // To turn on these properties, type
     // adb shell setprop log.tag.PROPERTY_NAME [VERBOSE | SUPPRESS]
-    static final String FORCE_ENABLE_ROTATION_PROPERTY = "launcher_force_rotate";
     static final String DUMP_STATE_PROPERTY = "launcher_dump_state";
     static final String DISABLE_ALL_APPS_PROPERTY = "launcher_noallapps";
 
@@ -210,15 +207,12 @@
     static final String ACTION_FIRST_LOAD_COMPLETE =
             "com.android.launcher3.action.FIRST_LOAD_COMPLETE";
 
-    private static final String TOOLBAR_ICON_METADATA_NAME = "com.android.launcher.toolbar_icon";
-    private static final String TOOLBAR_SEARCH_ICON_METADATA_NAME =
-            "com.android.launcher.toolbar_search_icon";
-    private static final String TOOLBAR_VOICE_SEARCH_ICON_METADATA_NAME =
-            "com.android.launcher.toolbar_voice_search_icon";
-
     public static final String SHOW_WEIGHT_WATCHER = "debug.show_mem";
     public static final boolean SHOW_WEIGHT_WATCHER_DEFAULT = false;
 
+    private static final String QSB_WIDGET_ID = "qsb_widget_id";
+    private static final String QSB_WIDGET_PROVIDER = "qsb_widget_provider";
+
     public static final String USER_HAS_MIGRATED = "launcher.user_migrated_from_old_data";
 
     /** The different states that Launcher can be in. */
@@ -282,7 +276,7 @@
     private AppsCustomizeTabHost mAppsCustomizeTabHost;
     private AppsCustomizePagedView mAppsCustomizeContent;
     private boolean mAutoAdvanceRunning = false;
-    private View mQsb;
+    private AppWidgetHostView mQsb;
 
     private Bundle mSavedState;
     // We set the state in both onCreate and then onNewIntent in some cases, which causes both
@@ -330,10 +324,6 @@
     // match the sensor state.
     private final int mRestoreScreenOrientationDelay = 500;
 
-    // External icons saved in case of resource changes, orientation, etc.
-    private static Drawable.ConstantState[] sGlobalSearchIcon = new Drawable.ConstantState[2];
-    private static Drawable.ConstantState[] sVoiceSearchIcon = new Drawable.ConstantState[2];
-
     private Drawable mWorkspaceBackgroundDrawable;
 
     private final ArrayList<Integer> mSynchronouslyBoundPages = new ArrayList<Integer>();
@@ -371,8 +361,6 @@
 
     private static PendingAddArguments sPendingAddItem;
 
-    public static boolean sForceEnableRotation = isPropertyEnabled(FORCE_ENABLE_ROTATION_PROPERTY);
-
     private static class PendingAddArguments {
         int requestCode;
         Intent intent;
@@ -387,10 +375,6 @@
 
     FocusIndicatorView mFocusHandler;
 
-    static boolean isPropertyEnabled(String propertyName) {
-        return Log.isLoggable(propertyName, Log.VERBOSE);
-    }
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         if (DEBUG_STRICT_MODE) {
@@ -484,8 +468,6 @@
         IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
         registerReceiver(mCloseSystemDialogsReceiver, filter);
 
-        updateGlobalIcons();
-
         // On large interfaces, we want the screen to auto-rotate based on the current orientation
         unlockScreenOrientation(true);
 
@@ -567,28 +549,6 @@
         }
     }
 
-    private void updateGlobalIcons() {
-        boolean searchVisible = false;
-        boolean voiceVisible = false;
-        // If we have a saved version of these external icons, we load them up immediately
-        int coi = getCurrentOrientationIndexForGlobalIcons();
-        if (sGlobalSearchIcon[coi] == null || sVoiceSearchIcon[coi] == null) {
-            searchVisible = updateGlobalSearchIcon();
-            voiceVisible = updateVoiceSearchIcon(searchVisible);
-        }
-        if (sGlobalSearchIcon[coi] != null) {
-             updateGlobalSearchIcon(sGlobalSearchIcon[coi]);
-             searchVisible = true;
-        }
-        if (sVoiceSearchIcon[coi] != null) {
-            updateVoiceSearchIcon(sVoiceSearchIcon[coi]);
-            voiceVisible = true;
-        }
-        if (mSearchDropTargetBar != null) {
-            mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible);
-        }
-    }
-
     private void checkForLocaleChange() {
         if (sLocaleConfiguration == null) {
             new AsyncTask<Void, Void, LocaleConfiguration>() {
@@ -1078,12 +1038,6 @@
         // Process any items that were added while Launcher was away.
         InstallShortcutReceiver.disableAndFlushInstallQueue(this);
 
-        // Update the voice search button proxy
-        updateVoiceButtonProxyVisible(false);
-
-        // Again, as with the above scenario, it's possible that one or more of the global icons
-        // were updated in the wrong orientation.
-        updateGlobalIcons();
         if (DEBUG_RESUME_TIME) {
             Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime));
         }
@@ -1473,6 +1427,7 @@
         dragController.addDropTarget(mWorkspace);
         if (mSearchDropTargetBar != null) {
             mSearchDropTargetBar.setup(this, dragController);
+            mSearchDropTargetBar.setQsbSearchBar(getQsbBar());
         }
 
         if (getResources().getBoolean(R.bool.debug_memory_enabled)) {
@@ -2494,7 +2449,7 @@
                 case KeyEvent.KEYCODE_HOME:
                     return true;
                 case KeyEvent.KEYCODE_VOLUME_DOWN:
-                    if (isPropertyEnabled(DUMP_STATE_PROPERTY)) {
+                    if (Utilities.isPropertyEnabled(DUMP_STATE_PROPERTY)) {
                         dumpState();
                         return true;
                     }
@@ -2645,51 +2600,6 @@
     }
 
     /**
-     * Event handler for the search button
-     *
-     * @param v The view that was clicked.
-     */
-    public void onClickSearchButton(View v) {
-        v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
-
-        onSearchRequested();
-    }
-
-    /**
-     * Event handler for the voice button
-     *
-     * @param v The view that was clicked.
-     */
-    public void onClickVoiceButton(View v) {
-        v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
-
-        startVoice();
-    }
-
-    public void startVoice() {
-        if (mLauncherCallbacks != null && mLauncherCallbacks.providesSearch()) {
-            mLauncherCallbacks.startVoice();
-            return;
-        }
-
-        try {
-            final SearchManager searchManager =
-                    (SearchManager) getSystemService(Context.SEARCH_SERVICE);
-            ComponentName activityName = searchManager.getGlobalSearchActivity();
-            Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
-            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            if (activityName != null) {
-                intent.setPackage(activityName.getPackageName());
-            }
-            startActivity(null, intent, "onClickVoiceButton");
-        } catch (ActivityNotFoundException e) {
-            Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
-            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            startActivitySafely(null, intent, "onClickVoiceButton");
-        }
-    }
-
-    /**
      * Event handler for the "grid" button that appears on the home screen, which
      * enters all apps mode.
      *
@@ -2967,10 +2877,8 @@
     }
 
     void startApplicationDetailsActivity(ComponentName componentName, UserHandleCompat user) {
-        String packageName = componentName.getPackageName();
         try {
             LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(this);
-            UserManagerCompat userManager = UserManagerCompat.getInstance(this);
             launcherApps.showAppDetailsForProfile(componentName, user);
         } catch (SecurityException e) {
             Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
@@ -3445,8 +3353,6 @@
             final View page = content.getPageAt(content.getCurrentPage());
             final View revealView = toView.findViewById(R.id.fake_page);
 
-            final float initialPanelAlpha = 1f;
-
             final boolean isWidgetTray = contentType == AppsCustomizePagedView.ContentType.Widgets;
             if (isWidgetTray) {
                 revealView.setBackground(res.getDrawable(R.drawable.quantum_panel_dark));
@@ -4032,137 +3938,8 @@
         // TODO
     }
 
-    /**
-     * Hides the hotseat area.
-     */
-    void hideHotseat(boolean animated) {
-        if (!LauncherAppState.getInstance().isScreenLarge()) {
-            if (animated) {
-                if (mHotseat.getAlpha() != 0f) {
-                    int duration = 0;
-                    if (mSearchDropTargetBar != null) {
-                        duration = mSearchDropTargetBar.getTransitionOutDuration();
-                    }
-                    mHotseat.animate().alpha(0f).setDuration(duration);
-                }
-            } else {
-                mHotseat.setAlpha(0f);
-            }
-        }
-    }
-
-    /**
-     * Add an item from all apps or customize onto the given workspace screen.
-     * If layout is null, add to the current screen.
-     */
-    void addExternalItemToScreen(ItemInfo itemInfo, final CellLayout layout) {
-        if (!mWorkspace.addExternalItemToScreen(itemInfo, layout)) {
-            showOutOfSpaceMessage(isHotseatLayout(layout));
-        }
-    }
-
-    /** Maps the current orientation to an index for referencing orientation correct global icons */
-    private int getCurrentOrientationIndexForGlobalIcons() {
-        // default - 0, landscape - 1
-        switch (getResources().getConfiguration().orientation) {
-        case Configuration.ORIENTATION_LANDSCAPE:
-            return 1;
-        default:
-            return 0;
-        }
-    }
-
-    private Drawable getExternalPackageToolbarIcon(ComponentName activityName, String resourceName) {
-        try {
-            PackageManager packageManager = getPackageManager();
-            // Look for the toolbar icon specified in the activity meta-data
-            Bundle metaData = packageManager.getActivityInfo(
-                    activityName, PackageManager.GET_META_DATA).metaData;
-            if (metaData != null) {
-                int iconResId = metaData.getInt(resourceName);
-                if (iconResId != 0) {
-                    Resources res = packageManager.getResourcesForActivity(activityName);
-                    return res.getDrawable(iconResId);
-                }
-            }
-        } catch (NameNotFoundException e) {
-            // This can happen if the activity defines an invalid drawable
-            Log.w(TAG, "Failed to load toolbar icon; " + activityName.flattenToShortString() +
-                    " not found", e);
-        } catch (Resources.NotFoundException nfe) {
-            // This can happen if the activity defines an invalid drawable
-            Log.w(TAG, "Failed to load toolbar icon from " + activityName.flattenToShortString(),
-                    nfe);
-        }
-        return null;
-    }
-
-    // if successful in getting icon, return it; otherwise, set button to use default drawable
-    private Drawable.ConstantState updateTextButtonWithIconFromExternalActivity(
-            int buttonId, ComponentName activityName, int fallbackDrawableId,
-            String toolbarResourceName) {
-        Drawable toolbarIcon = getExternalPackageToolbarIcon(activityName, toolbarResourceName);
-        Resources r = getResources();
-        int w = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_width);
-        int h = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_height);
-
-        TextView button = (TextView) findViewById(buttonId);
-        // If we were unable to find the icon via the meta-data, use a generic one
-        if (toolbarIcon == null) {
-            toolbarIcon = r.getDrawable(fallbackDrawableId);
-            toolbarIcon.setBounds(0, 0, w, h);
-            if (button != null) {
-                button.setCompoundDrawables(toolbarIcon, null, null, null);
-            }
-            return null;
-        } else {
-            toolbarIcon.setBounds(0, 0, w, h);
-            if (button != null) {
-                button.setCompoundDrawables(toolbarIcon, null, null, null);
-            }
-            return toolbarIcon.getConstantState();
-        }
-    }
-
-    // if successful in getting icon, return it; otherwise, set button to use default drawable
-    private Drawable.ConstantState updateButtonWithIconFromExternalActivity(
-            int buttonId, ComponentName activityName, int fallbackDrawableId,
-            String toolbarResourceName) {
-        ImageView button = (ImageView) findViewById(buttonId);
-        Drawable toolbarIcon = getExternalPackageToolbarIcon(activityName, toolbarResourceName);
-
-        if (button != null) {
-            // If we were unable to find the icon via the meta-data, use a
-            // generic one
-            if (toolbarIcon == null) {
-                button.setImageResource(fallbackDrawableId);
-            } else {
-                button.setImageDrawable(toolbarIcon);
-            }
-        }
-
-        return toolbarIcon != null ? toolbarIcon.getConstantState() : null;
-
-    }
-
-    private void updateTextButtonWithDrawable(int buttonId, Drawable d) {
-        TextView button = (TextView) findViewById(buttonId);
-        button.setCompoundDrawables(d, null, null, null);
-    }
-
-    private void updateButtonWithDrawable(int buttonId, Drawable.ConstantState d) {
-        ImageView button = (ImageView) findViewById(buttonId);
-        button.setImageDrawable(d.newDrawable(getResources()));
-    }
-
-    private void invalidatePressedFocusedStates(View container, View button) {
-        if (container instanceof HolographicLinearLayout) {
-            HolographicLinearLayout layout = (HolographicLinearLayout) container;
-            layout.invalidatePressedFocusedStates();
-        } else if (button instanceof HolographicImageView) {
-            HolographicImageView view = (HolographicImageView) button;
-            view.invalidatePressedFocusedStates();
-        }
+    protected void disableVoiceButtonProxy(boolean disable) {
+        // NO-OP
     }
 
     public View getQsbBar() {
@@ -4171,140 +3948,54 @@
         }
 
         if (mQsb == null) {
-            mQsb = mInflater.inflate(R.layout.qsb, mSearchDropTargetBar, false);
-            mSearchDropTargetBar.addView(mQsb);
+            AppWidgetProviderInfo searchProvider = Utilities.getSearchWidgetProvider(this);
+            if (searchProvider == null) {
+                return null;
+            }
+
+            Bundle opts = new Bundle();
+            opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
+                    AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
+
+            SharedPreferences sp = getSharedPreferences(
+                    LauncherAppState.getSharedPreferencesKey(), MODE_PRIVATE);
+            int widgetId = sp.getInt(QSB_WIDGET_ID, -1);
+            AppWidgetProviderInfo widgetInfo = mAppWidgetManager.getAppWidgetInfo(widgetId);
+            if (!searchProvider.provider.flattenToString().equals(
+                    sp.getString(QSB_WIDGET_PROVIDER, null))
+                    || (widgetInfo == null)
+                    || !widgetInfo.provider.equals(searchProvider.provider)) {
+                // A valid widget is not already bound.
+                if (widgetId > -1) {
+                    mAppWidgetHost.deleteAppWidgetId(widgetId);
+                    widgetId = -1;
+                }
+
+                // Try to bind a new widget
+                widgetId = mAppWidgetHost.allocateAppWidgetId();
+
+                if (!AppWidgetManagerCompat.getInstance(this)
+                        .bindAppWidgetIdIfAllowed(widgetId, searchProvider, opts)) {
+                    mAppWidgetHost.deleteAppWidgetId(widgetId);
+                    widgetId = -1;
+                }
+
+                sp.edit()
+                    .putInt(QSB_WIDGET_ID, widgetId)
+                    .putString(QSB_WIDGET_PROVIDER, searchProvider.provider.flattenToString())
+                    .commit();
+            }
+
+            if (widgetId != -1) {
+                mQsb = mAppWidgetHost.createView(this, widgetId, searchProvider);
+                mQsb.updateAppWidgetOptions(opts);
+                mQsb.setPadding(0, 0, 0, 0);
+                mSearchDropTargetBar.addView(mQsb);
+            }
         }
         return mQsb;
     }
 
-    protected boolean updateGlobalSearchIcon() {
-        if (mLauncherCallbacks != null && mLauncherCallbacks.providesSearch()) {
-            return true;
-        }
-
-        final View searchButtonContainer = findViewById(R.id.search_button_container);
-        final ImageView searchButton = (ImageView) findViewById(R.id.search_button);
-        final View voiceButtonContainer = findViewById(R.id.voice_button_container);
-        final View voiceButton = findViewById(R.id.voice_button);
-
-        final SearchManager searchManager =
-                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
-        ComponentName activityName = searchManager.getGlobalSearchActivity();
-        if (activityName != null) {
-            int coi = getCurrentOrientationIndexForGlobalIcons();
-            sGlobalSearchIcon[coi] = updateButtonWithIconFromExternalActivity(
-                    R.id.search_button, activityName, R.drawable.ic_home_search_normal_holo,
-                    TOOLBAR_SEARCH_ICON_METADATA_NAME);
-            if (sGlobalSearchIcon[coi] == null) {
-                sGlobalSearchIcon[coi] = updateButtonWithIconFromExternalActivity(
-                        R.id.search_button, activityName, R.drawable.ic_home_search_normal_holo,
-                        TOOLBAR_ICON_METADATA_NAME);
-            }
-
-            if (searchButtonContainer != null) searchButtonContainer.setVisibility(View.VISIBLE);
-            searchButton.setVisibility(View.VISIBLE);
-            invalidatePressedFocusedStates(searchButtonContainer, searchButton);
-            return true;
-        } else {
-            // We disable both search and voice search when there is no global search provider
-            if (searchButtonContainer != null) searchButtonContainer.setVisibility(View.GONE);
-            if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE);
-            if (searchButton != null) searchButton.setVisibility(View.GONE);
-            if (voiceButton != null) voiceButton.setVisibility(View.GONE);
-            updateVoiceButtonProxyVisible(false);
-            return false;
-        }
-    }
-
-    protected void updateGlobalSearchIcon(Drawable.ConstantState d) {
-        if (mLauncherCallbacks != null && mLauncherCallbacks.providesSearch()) return;
-        final View searchButtonContainer = findViewById(R.id.search_button_container);
-        final View searchButton = (ImageView) findViewById(R.id.search_button);
-        updateButtonWithDrawable(R.id.search_button, d);
-        invalidatePressedFocusedStates(searchButtonContainer, searchButton);
-    }
-
-    protected boolean updateVoiceSearchIcon(boolean searchVisible) {
-        if (mLauncherCallbacks != null && mLauncherCallbacks.providesSearch()) {
-            return true;
-        }
-        final View voiceButtonContainer = findViewById(R.id.voice_button_container);
-        final View voiceButton = findViewById(R.id.voice_button);
-
-        // We only show/update the voice search icon if the search icon is enabled as well
-        final SearchManager searchManager =
-                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
-        ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity();
-
-        ComponentName activityName = null;
-        if (globalSearchActivity != null) {
-            // Check if the global search activity handles voice search
-            Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
-            intent.setPackage(globalSearchActivity.getPackageName());
-            activityName = intent.resolveActivity(getPackageManager());
-        }
-
-        if (activityName == null) {
-            // Fallback: check if an activity other than the global search activity
-            // resolves this
-            Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
-            activityName = intent.resolveActivity(getPackageManager());
-        }
-        if (searchVisible && activityName != null) {
-            int coi = getCurrentOrientationIndexForGlobalIcons();
-            sVoiceSearchIcon[coi] = updateButtonWithIconFromExternalActivity(
-                    R.id.voice_button, activityName, R.drawable.ic_home_voice_search_holo,
-                    TOOLBAR_VOICE_SEARCH_ICON_METADATA_NAME);
-            if (sVoiceSearchIcon[coi] == null) {
-                sVoiceSearchIcon[coi] = updateButtonWithIconFromExternalActivity(
-                        R.id.voice_button, activityName, R.drawable.ic_home_voice_search_holo,
-                        TOOLBAR_ICON_METADATA_NAME);
-            }
-            if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.VISIBLE);
-            voiceButton.setVisibility(View.VISIBLE);
-            updateVoiceButtonProxyVisible(false);
-            invalidatePressedFocusedStates(voiceButtonContainer, voiceButton);
-            return true;
-        } else {
-            if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE);
-            if (voiceButton != null) voiceButton.setVisibility(View.GONE);
-            updateVoiceButtonProxyVisible(false);
-            return false;
-        }
-    }
-
-    protected void updateVoiceSearchIcon(Drawable.ConstantState d) {
-        if (mLauncherCallbacks != null && mLauncherCallbacks.providesSearch()) {
-            return;
-        }
-
-        final View voiceButtonContainer = findViewById(R.id.voice_button_container);
-        final View voiceButton = findViewById(R.id.voice_button);
-        updateButtonWithDrawable(R.id.voice_button, d);
-        invalidatePressedFocusedStates(voiceButtonContainer, voiceButton);
-    }
-
-    public void updateVoiceButtonProxyVisible(boolean forceDisableVoiceButtonProxy) {
-        if (mLauncherCallbacks != null) {
-            forceDisableVoiceButtonProxy |= mLauncherCallbacks.forceDisableVoiceButtonProxy();
-        }
-        final View voiceButtonProxy = findViewById(R.id.voice_button_proxy);
-        if (voiceButtonProxy != null) {
-            boolean visible = !forceDisableVoiceButtonProxy &&
-                    mWorkspace.shouldVoiceButtonProxyBeVisible();
-            voiceButtonProxy.setVisibility(visible ? View.VISIBLE : View.GONE);
-            voiceButtonProxy.bringToFront();
-        }
-    }
-
-    /**
-     * This is an overrid eot disable the voice button proxy.  If disabled is true, then the voice button proxy
-     * will be hidden regardless of what shouldVoiceButtonProxyBeVisible() returns.
-     */
-    public void disableVoiceButtonProxy(boolean disabled) {
-        updateVoiceButtonProxyVisible(disabled);
-    }
-
     @Override
     public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
         final boolean result = super.dispatchPopulateAccessibilityEvent(event);
@@ -4883,13 +4574,15 @@
                 getDeviceProfile().getSearchBarBounds();
     }
 
-    @Override
     public void bindSearchablesChanged() {
-        boolean searchVisible = updateGlobalSearchIcon();
-        boolean voiceVisible = updateVoiceSearchIcon(searchVisible);
-        if (mSearchDropTargetBar != null) {
-            mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible);
+        if (mSearchDropTargetBar == null) {
+            return;
         }
+        if (mQsb != null) {
+            mSearchDropTargetBar.removeView(mQsb);
+            mQsb = null;
+        }
+        mSearchDropTargetBar.setQsbSearchBar(getQsbBar());
     }
 
     /**
@@ -5113,19 +4806,14 @@
         return oriMap[(d.getRotation() + indexOffset) % 4];
     }
 
-    public boolean isRotationEnabled() {
-        boolean enableRotation = sForceEnableRotation ||
-                getResources().getBoolean(R.bool.allow_rotation);
-        return enableRotation;
-    }
     public void lockScreenOrientation() {
-        if (isRotationEnabled()) {
+        if (Utilities.isRotationEnabled(this)) {
             setRequestedOrientation(mapConfigurationOriActivityInfoOri(getResources()
                     .getConfiguration().orientation));
         }
     }
     public void unlockScreenOrientation(boolean immediate) {
-        if (isRotationEnabled()) {
+        if (Utilities.isRotationEnabled(this)) {
             if (immediate) {
                 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
             } else {
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index 48af216..ec914d8 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -16,6 +16,7 @@
 
 package com.android.launcher3;
 
+import android.annotation.TargetApi;
 import android.app.SearchManager;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -26,16 +27,15 @@
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.graphics.Point;
+import android.os.Build;
 import android.os.Handler;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.Display;
 import android.view.WindowManager;
-
 import com.android.launcher3.compat.LauncherAppsCompat;
 import com.android.launcher3.compat.PackageInstallerCompat;
 import com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo;
-
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 
@@ -46,12 +46,14 @@
 
     private final AppFilter mAppFilter;
     private final BuildInfo mBuildInfo;
-    private LauncherModel mModel;
-    private IconCache mIconCache;
+    private final LauncherModel mModel;
+    private final IconCache mIconCache;
+
+    private final boolean mIsScreenLarge;
+    private final float mScreenDensity;
+    private final int mLongPressTimeout = 300;
+
     private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb;
-    private boolean mIsScreenLarge;
-    private float mScreenDensity;
-    private int mLongPressTimeout = 300;
     private boolean mWallpaperChangedSinceLastCheck;
 
     private static WeakReference<LauncherProvider> sLauncherProvider;
@@ -159,9 +161,6 @@
     };
 
     LauncherModel setLauncher(Launcher launcher) {
-        if (mModel == null) {
-            throw new IllegalStateException("setLauncher() called before init()");
-        }
         mModel.initialize(launcher);
         return mModel;
     }
@@ -194,6 +193,7 @@
         return LauncherFiles.SHARED_PREFERENCES_KEY;
     }
 
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
     DeviceProfile initDynamicGrid(Context context) {
         // Determine the dynamic grid properties
         WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
@@ -269,7 +269,7 @@
     public static boolean isDisableAllApps() {
         // Returns false on non-dogfood builds.
         return getInstance().mBuildInfo.isDogfoodBuild() &&
-                Launcher.isPropertyEnabled(Launcher.DISABLE_ALL_APPS_PROPERTY);
+                Utilities.isPropertyEnabled(Launcher.DISABLE_ALL_APPS_PROPERTY);
     }
 
     public static boolean isDogfoodBuild() {
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index b04fc3f..11440c0 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -30,6 +30,7 @@
 import android.content.Intent.ShortcutIconResource;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
+import android.content.pm.LauncherApps.Callback;
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
@@ -75,7 +76,6 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Maintains in-memory state of the Launcher. It is expected that there should be only one
@@ -110,6 +110,11 @@
     private boolean mIsLoaderTaskRunning;
     private volatile boolean mFlushingWorkerThread;
 
+    /**
+     * Maintain a set of packages per user, for which we added a shortcut on the workspace.
+     */
+    private static final String INSTALLED_SHORTCUTS_SET_PREFIX = "installed_shortcuts_set_for_user_";
+
     // Specific runnable types that are run on the main thread deferred handler, this allows us to
     // clear all queued binding runnables when the Launcher activity is destroyed.
     private static final int MAIN_THREAD_NORMAL_RUNNABLE = 0;
@@ -343,7 +348,7 @@
         // Process the updated package state
         Runnable r = new Runnable() {
             public void run() {
-                Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
+                Callbacks callbacks = getCallback();
                 if (callbacks != null) {
                     callbacks.updatePackageState(installInfo);
                 }
@@ -356,7 +361,7 @@
         // Process the updated package badge
         Runnable r = new Runnable() {
             public void run() {
-                Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
+                Callbacks callbacks = getCallback();
                 if (callbacks != null) {
                     callbacks.updatePackageBadge(packageName);
                 }
@@ -366,7 +371,7 @@
     }
 
     public void addAppsToAllApps(final Context ctx, final ArrayList<AppInfo> allAppsApps) {
-        final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
+        final Callbacks callbacks = getCallback();
 
         if (allAppsApps == null) {
             throw new RuntimeException("allAppsApps must not be null");
@@ -380,7 +385,7 @@
             public void run() {
                 runOnMainThread(new Runnable() {
                     public void run() {
-                        Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                        Callbacks cb = getCallback();
                         if (callbacks == cb && cb != null) {
                             callbacks.bindAppsAdded(null, null, null, allAppsApps);
                         }
@@ -393,7 +398,7 @@
 
     public void addAndBindAddedWorkspaceApps(final Context context,
             final ArrayList<ItemInfo> workspaceApps) {
-        final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
+        final Callbacks callbacks = getCallback();
 
         if (workspaceApps == null) {
             throw new RuntimeException("workspaceApps and allAppsApps must not be null");
@@ -425,7 +430,7 @@
                         final Intent launchIntent = a.getIntent();
 
                         // Short-circuit this logic if the icon exists somewhere on the workspace
-                        if (shortcutExists(context, name, launchIntent)) {
+                        if (shortcutExists(context, name, launchIntent, a.user)) {
                             continue;
                         }
 
@@ -484,7 +489,7 @@
                 if (!addedShortcutsFinal.isEmpty()) {
                     runOnMainThread(new Runnable() {
                         public void run() {
-                            Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                            Callbacks cb = getCallback();
                             if (callbacks == cb && cb != null) {
                                 final ArrayList<ItemInfo> addAnimated = new ArrayList<ItemInfo>();
                                 final ArrayList<ItemInfo> addNotAnimated = new ArrayList<ItemInfo>();
@@ -844,7 +849,8 @@
      * Returns true if the shortcuts already exists in the database.
      * we identify a shortcut by its title and intent.
      */
-    static boolean shortcutExists(Context context, String title, Intent intent) {
+    static boolean shortcutExists(Context context, String title, Intent intent,
+            UserHandleCompat user) {
         final ContentResolver cr = context.getContentResolver();
         final Intent intentWithPkg, intentWithoutPkg;
 
@@ -863,16 +869,18 @@
             intentWithPkg = intent;
             intentWithoutPkg = intent;
         }
+        String userSerial = Long.toString(UserManagerCompat.getInstance(context)
+                .getSerialNumberForUser(user));
         Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI,
-            new String[] { "title", "intent" }, "title=? and (intent=? or intent=?)",
-            new String[] { title, intentWithPkg.toUri(0), intentWithoutPkg.toUri(0) }, null);
-        boolean result = false;
+            new String[] { "title", "intent", "profileId" },
+            "title=? and (intent=? or intent=?) and profileId=?",
+            new String[] { title, intentWithPkg.toUri(0), intentWithoutPkg.toUri(0), userSerial },
+            null);
         try {
-            result = c.moveToFirst();
+            return c.moveToFirst();
         } finally {
             c.close();
         }
-        return result;
     }
 
     /**
@@ -1285,11 +1293,9 @@
              mPreviousConfigMcc = currentConfig.mcc;
         } else if (SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED.equals(action) ||
                    SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED.equals(action)) {
-            if (mCallbacks != null) {
-                Callbacks callbacks = mCallbacks.get();
-                if (callbacks != null) {
-                    callbacks.bindSearchablesChanged();
-                }
+            Callbacks callbacks = getCallback();
+            if (callbacks != null) {
+                callbacks.bindSearchablesChanged();
             }
         }
     }
@@ -1321,13 +1327,11 @@
      */
     public void startLoaderFromBackground() {
         boolean runLoader = false;
-        if (mCallbacks != null) {
-            Callbacks callbacks = mCallbacks.get();
-            if (callbacks != null) {
-                // Only actually run the loader if they're not paused.
-                if (!callbacks.setLoadOnResume()) {
-                    runLoader = true;
-                }
+        Callbacks callbacks = getCallback();
+        if (callbacks != null) {
+            // Only actually run the loader if they're not paused.
+            if (!callbacks.setLoadOnResume()) {
+                runLoader = true;
             }
         }
         if (runLoader) {
@@ -2811,6 +2815,8 @@
 
             // Clear the list of apps
             mBgAllAppsList.clear();
+            SharedPreferences prefs = mContext.getSharedPreferences(
+                    LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
             for (UserHandleCompat user : profiles) {
                 // Query for the set of apps
                 final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0;
@@ -2821,6 +2827,7 @@
                     Log.d(TAG, "getActivityList got " + apps.size() + " apps for user " + user);
                 }
                 // Fail if we don't have any apps
+                // TODO: Fix this. Only fail for the current user.
                 if (apps == null || apps.isEmpty()) {
                     return;
                 }
@@ -2839,6 +2846,25 @@
                     // This builds the icon bitmaps.
                     mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache, mLabelCache));
                 }
+
+                if (!user.equals(UserHandleCompat.myUserHandle())) {
+                    // Add shortcuts for packages which were installed while launcher was dead.
+                    String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX
+                            + mUserManager.getSerialNumberForUser(user);
+                    Set<String> packagesAdded = prefs.getStringSet(shortcutsSetKey, Collections.EMPTY_SET);
+                    HashSet<String> newPackageSet = new HashSet<String>();
+
+                    for (LauncherActivityInfoCompat info : apps) {
+                        String packageName = info.getComponentName().getPackageName();
+                        if (!packagesAdded.contains(packageName)
+                                && !newPackageSet.contains(packageName)) {
+                            InstallShortcutReceiver.queueInstallShortcut(info, mContext);
+                        }
+                        newPackageSet.add(packageName);
+                    }
+
+                    prefs.edit().putStringSet(shortcutsSetKey, newPackageSet).commit();
+                }
             }
             // Huh? Shouldn't this be inside the Runnable below?
             final ArrayList<AppInfo> added = mBgAllAppsList.added;
@@ -2953,6 +2979,30 @@
                         mIconCache.remove(packages[i], mUser);
                         mBgAllAppsList.addPackage(context, packages[i], mUser);
                     }
+
+                    // Auto add shortcuts for added packages.
+                    if (!UserHandleCompat.myUserHandle().equals(mUser)) {
+                        SharedPreferences prefs = context.getSharedPreferences(
+                                LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
+                        String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX
+                                + mUserManager.getSerialNumberForUser(mUser);
+                        Set<String> shortcutSet = new HashSet<String>(
+                                prefs.getStringSet(shortcutsSetKey,Collections.EMPTY_SET));
+
+                        for (int i=0; i<N; i++) {
+                            if (!shortcutSet.contains(packages[i])) {
+                                shortcutSet.add(packages[i]);
+                                List<LauncherActivityInfoCompat> activities =
+                                        mLauncherApps.getActivityList(packages[i], mUser);
+                                if (activities != null && !activities.isEmpty()) {
+                                    InstallShortcutReceiver.queueInstallShortcut(
+                                            activities.get(0), context);
+                                }
+                            }
+                        }
+
+                        prefs.edit().putStringSet(shortcutsSetKey, shortcutSet).commit();
+                    }
                     break;
                 case OP_UPDATE:
                     for (int i=0; i<N; i++) {
@@ -2963,6 +3013,19 @@
                     }
                     break;
                 case OP_REMOVE:
+                    // Remove the packageName for the set of auto-installed shortcuts. This
+                    // will ensure that the shortcut when the app is installed again.
+                    if (!UserHandleCompat.myUserHandle().equals(mUser)) {
+                        SharedPreferences prefs = context.getSharedPreferences(
+                                LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
+                        String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX
+                                + mUserManager.getSerialNumberForUser(mUser);
+                        HashSet<String> shortcutSet = new HashSet<String>(
+                                prefs.getStringSet(shortcutsSetKey, Collections.EMPTY_SET));
+                        shortcutSet.removeAll(Arrays.asList(mPackages));
+                        prefs.edit().putStringSet(shortcutsSetKey, shortcutSet).commit();
+                    }
+                    // Fall through
                 case OP_UNAVAILABLE:
                     boolean clearCache = mOp == OP_REMOVE;
                     for (int i=0; i<N; i++) {
@@ -2991,7 +3054,7 @@
                 mBgAllAppsList.removed.clear();
             }
 
-            final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
+            final Callbacks callbacks = getCallback();
             if (callbacks == null) {
                 Log.w(TAG, "Nobody to tell about the new app.  Launcher is probably loading.");
                 return;
@@ -3021,7 +3084,7 @@
 
                 mHandler.post(new Runnable() {
                     public void run() {
-                        Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                        Callbacks cb = getCallback();
                         if (callbacks == cb && cb != null) {
                             callbacks.bindAppsUpdated(modifiedFinal);
                         }
@@ -3134,7 +3197,7 @@
                     mHandler.post(new Runnable() {
 
                         public void run() {
-                            Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                            Callbacks cb = getCallback();
                             if (callbacks == cb && cb != null) {
                                 callbacks.bindShortcutsChanged(
                                         updatedShortcuts, removedShortcuts, mUser);
@@ -3148,7 +3211,7 @@
                 if (!widgets.isEmpty()) {
                     mHandler.post(new Runnable() {
                         public void run() {
-                            Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                            Callbacks cb = getCallback();
                             if (callbacks == cb && cb != null) {
                                 callbacks.bindWidgetsRestored(widgets);
                             }
@@ -3189,14 +3252,11 @@
                 }
 
                 // Remove any queued items from the install queue
-                String spKey = LauncherAppState.getSharedPreferencesKey();
-                SharedPreferences sp =
-                        context.getSharedPreferences(spKey, Context.MODE_PRIVATE);
-                InstallShortcutReceiver.removeFromInstallQueue(sp, removedPackageNames);
+                InstallShortcutReceiver.removeFromInstallQueue(context, removedPackageNames, mUser);
                 // Call the components-removed callback
                 mHandler.post(new Runnable() {
                     public void run() {
-                        Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                        Callbacks cb = getCallback();
                         if (callbacks == cb && cb != null) {
                             callbacks.bindComponentsRemoved(
                                     removedPackageNames, removedApps, mUser, removeReason);
@@ -3210,7 +3270,7 @@
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
-                    Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                    Callbacks cb = getCallback();
                     if (callbacks == cb && cb != null) {
                         callbacks.bindPackagesUpdated(widgetsAndShortcuts);
                     }
@@ -3220,7 +3280,7 @@
             // Write all the logs to disk
             mHandler.post(new Runnable() {
                 public void run() {
-                    Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
+                    Callbacks cb = getCallback();
                     if (callbacks == cb && cb != null) {
                         callbacks.dumpLogsToLocalData();
                     }
@@ -3754,4 +3814,8 @@
             Log.d(TAG, "mLoaderTask=null");
         }
     }
+
+    public Callbacks getCallback() {
+        return mCallbacks != null ? mCallbacks.get() : null;
+    }
 }
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 365d989..1715b02 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -16,7 +16,6 @@
 
 package com.android.launcher3;
 
-import android.app.SearchManager;
 import android.appwidget.AppWidgetHost;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
@@ -57,7 +56,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 
 public class LauncherProvider extends ContentProvider {
     private static final String TAG = "Launcher.LauncherProvider";
@@ -1342,29 +1340,8 @@
         }
 
         private ComponentName getSearchWidgetProvider() {
-            SearchManager searchManager =
-                    (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
-            ComponentName searchComponent = searchManager.getGlobalSearchActivity();
-            if (searchComponent == null) return null;
-            return getProviderInPackage(searchComponent.getPackageName());
-        }
-
-        /**
-         * Gets an appwidget provider from the given package. If the package contains more than
-         * one appwidget provider, an arbitrary one is returned.
-         */
-        private ComponentName getProviderInPackage(String packageName) {
-            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
-            List<AppWidgetProviderInfo> providers = appWidgetManager.getInstalledProviders();
-            if (providers == null) return null;
-            final int providerCount = providers.size();
-            for (int i = 0; i < providerCount; i++) {
-                ComponentName provider = providers.get(i).provider;
-                if (provider != null && provider.getPackageName().equals(packageName)) {
-                    return provider;
-                }
-            }
-            return null;
+            AppWidgetProviderInfo searchProvider = Utilities.getSearchWidgetProvider(mContext);
+            return (searchProvider == null) ? null : searchProvider.provider;
         }
 
         private void migrateLauncher2Shortcuts(SQLiteDatabase db, Uri uri) {
@@ -1455,6 +1432,12 @@
                                 userHandle = UserHandleCompat.myUserHandle();
                                 userSerialNumber = userManager.getSerialNumberForUser(userHandle);
                             }
+
+                            if (userHandle == null) {
+                                Launcher.addDumpLog(TAG, "skipping deleted user", true);
+                                continue;
+                            }
+
                             Launcher.addDumpLog(TAG, "migrating \""
                                 + c.getString(titleIndex) + "\" ("
                                 + cellX + "," + cellY + "@"
diff --git a/src/com/android/launcher3/SearchDropTargetBar.java b/src/com/android/launcher3/SearchDropTargetBar.java
index 6205088..99c2e08 100644
--- a/src/com/android/launcher3/SearchDropTargetBar.java
+++ b/src/com/android/launcher3/SearchDropTargetBar.java
@@ -22,7 +22,6 @@
 import android.animation.ValueAnimator;
 import android.content.Context;
 import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.animation.AccelerateInterpolator;
@@ -50,7 +49,6 @@
     private int mBarHeight;
     private boolean mDeferOnDragEnd = false;
 
-    private Drawable mPreviousBackground;
     private boolean mEnableDropDownDropTargets;
 
     public SearchDropTargetBar(Context context, AttributeSet attrs) {
@@ -70,7 +68,10 @@
         dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
         mInfoDropTarget.setLauncher(launcher);
         mDeleteDropTarget.setLauncher(launcher);
-        mQSBSearchBar = launcher.getQsbBar();
+    }
+
+    public void setQsbSearchBar(View qsb) {
+        mQSBSearchBar = qsb;
         if (mQSBSearchBar != null) {
             if (mEnableDropDownDropTargets) {
                 mQSBSearchBarAnim = LauncherAnimUtils.ofFloat(mQSBSearchBar, "translationY", 0,
@@ -224,20 +225,6 @@
         }
     }
 
-    public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) {
-        if (mQSBSearchBar != null) {
-            Drawable bg = mQSBSearchBar.getBackground();
-            if (bg != null && (!searchVisible && !voiceVisible)) {
-                // Save the background and disable it
-                mPreviousBackground = bg;
-                mQSBSearchBar.setBackgroundResource(0);
-            } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) {
-                // Restore the background
-                mQSBSearchBar.setBackground(mPreviousBackground);
-            }
-        }
-    }
-
     public Rect getSearchBarBounds() {
         if (mQSBSearchBar != null) {
             final int[] pos = new int[2];
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 7a16914..c0f7591 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -18,6 +18,9 @@
 
 import android.annotation.TargetApi;
 import android.app.Activity;
+import android.app.SearchManager;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.Context;
@@ -39,8 +42,6 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.PaintDrawable;
 import android.os.Build;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.util.Log;
 import android.util.Pair;
 import android.util.SparseArray;
@@ -93,7 +94,7 @@
         icon.setBounds(0, 0, sIconWidth, sIconHeight);
     }
 
-    private static boolean isPropertyEnabled(String propertyName) {
+    public static boolean isPropertyEnabled(String propertyName) {
         return Log.isLoggable(propertyName, Log.VERBOSE);
     }
 
@@ -508,4 +509,37 @@
             return v.getKeyDispatcherState() != null;
         }
     }
+
+    /**
+     * Returns a widget with category {@link AppWidgetProviderInfo#WIDGET_CATEGORY_SEARCHBOX}
+     * provided by the same package which is set to be global search activity.
+     * If widgetCategory is not supported, or no such widget is found, returns the first widget
+     * provided by the package.
+     */
+    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+    public static AppWidgetProviderInfo getSearchWidgetProvider(Context context) {
+        SearchManager searchManager =
+                (SearchManager) context.getSystemService(Context.SEARCH_SERVICE);
+        ComponentName searchComponent = searchManager.getGlobalSearchActivity();
+        if (searchComponent == null) return null;
+        String providerPkg = searchComponent.getPackageName();
+
+        AppWidgetProviderInfo defaultWidgetForSearchPackage = null;
+
+        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+        for (AppWidgetProviderInfo info : appWidgetManager.getInstalledProviders()) {
+            if (info.provider.getPackageName().equals(providerPkg)) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                    if ((info.widgetCategory & AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX) != 0) {
+                        return info;
+                    } else if (defaultWidgetForSearchPackage == null) {
+                        defaultWidgetForSearchPackage = info;
+                    }
+                } else {
+                    return info;
+                }
+            }
+        }
+        return defaultWidgetForSearchPackage;
+    }
 }
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 66d4ac0..2b520c5 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -1329,13 +1329,11 @@
             if (mCustomContentCallbacks != null) {
                 mCustomContentCallbacks.onShow(false);
                 mCustomContentShowTime = System.currentTimeMillis();
-                mLauncher.updateVoiceButtonProxyVisible(false);
             }
         } else if (hasCustomContent() && getNextPage() != 0 && mCustomContentShowing) {
             mCustomContentShowing = false;
             if (mCustomContentCallbacks != null) {
                 mCustomContentCallbacks.onHide();
-                mLauncher.updateVoiceButtonProxyVisible(false);
             }
         }
     }
@@ -2203,16 +2201,6 @@
         return -offsetFromTopEdge + mInsets.top + offsetToCenterInOverview;
     }
 
-    boolean shouldVoiceButtonProxyBeVisible() {
-        if (isOnOrMovingToCustomContent()) {
-            return false;
-        }
-        if (mState != State.NORMAL) {
-            return false;
-        }
-        return true;
-    }
-
     public void updateInteractionForState() {
         if (mState != State.NORMAL) {
             mLauncher.onInteractionBegin();
@@ -2461,14 +2449,15 @@
                 pageIndicator.setAlpha(finalHotseatAndPageIndicatorAlpha);
                 AlphaUpdateListener.updateVisibility(pageIndicator);
             }
-            searchBar.setAlpha(finalSearchBarAlpha);
-            AlphaUpdateListener.updateVisibility(searchBar);
+            if (searchBar != null) {
+                searchBar.setAlpha(finalSearchBarAlpha);
+                AlphaUpdateListener.updateVisibility(searchBar);
+            }
             updateCustomContentVisibility();
             setScaleX(mNewScale);
             setScaleY(mNewScale);
             setTranslationY(finalWorkspaceTranslationY);
         }
-        mLauncher.updateVoiceButtonProxyVisible(false);
 
         if (stateIsNormal) {
             animateBackgroundGradient(0f, animated);