Merge "De-jank quick contact animation" into jb-dev
diff --git a/res/drawable-hdpi/spinner_default_holo_dark.9.png b/res/drawable-hdpi/spinner_default_holo_dark.9.png
new file mode 100644
index 0000000..34a88df
--- /dev/null
+++ b/res/drawable-hdpi/spinner_default_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-mdpi/spinner_default_holo_dark.9.png b/res/drawable-mdpi/spinner_default_holo_dark.9.png
new file mode 100644
index 0000000..48af192
--- /dev/null
+++ b/res/drawable-mdpi/spinner_default_holo_dark.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/spinner_default_holo_dark.9.png b/res/drawable-xhdpi/spinner_default_holo_dark.9.png
new file mode 100644
index 0000000..e94ce80
--- /dev/null
+++ b/res/drawable-xhdpi/spinner_default_holo_dark.9.png
Binary files differ
diff --git a/res/drawable/ab_dropdown_navigation_item_background.xml b/res/drawable/ab_dropdown_navigation_item_background.xml
new file mode 100644
index 0000000..c144996
--- /dev/null
+++ b/res/drawable/ab_dropdown_navigation_item_background.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true"
+        android:drawable="@drawable/ab_dropdown_navigation_item_background_pressed"/>
+    <item android:drawable="@drawable/spinner_default_holo_dark" />
+</selector>
diff --git a/res/drawable/ab_dropdown_navigation_item_background_pressed.xml b/res/drawable/ab_dropdown_navigation_item_background_pressed.xml
new file mode 100644
index 0000000..d075a05
--- /dev/null
+++ b/res/drawable/ab_dropdown_navigation_item_background_pressed.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<layer-list
+    xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:drawable="@drawable/action_bar_item_pressed_holo_light" />
+    <item android:drawable="@drawable/spinner_default_holo_dark" />
+</layer-list>
diff --git a/res/drawable/action_bar_item_background.xml b/res/drawable/action_bar_item_background.xml
index 8dd8d9b..7ccc3a9 100644
--- a/res/drawable/action_bar_item_background.xml
+++ b/res/drawable/action_bar_item_background.xml
@@ -14,8 +14,7 @@
      limitations under the License.
 -->
 
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-          android:exitFadeDuration="@android:integer/config_mediumAnimTime">
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true" android:drawable="@drawable/action_bar_item_pressed_holo_light"/>
     <item android:drawable="@android:color/transparent" />
 </selector>
diff --git a/res/drawable/group_list_item_background.xml b/res/drawable/group_list_item_background.xml
index 345117f..70cd308 100644
--- a/res/drawable/group_list_item_background.xml
+++ b/res/drawable/group_list_item_background.xml
@@ -14,8 +14,7 @@
      limitations under the License.
 -->
 
-<selector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:exitFadeDuration="@android:integer/config_mediumAnimTime">
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_activated="true" android:drawable="@drawable/list_activated_holo" />
     <item android:state_pressed="true" android:drawable="@drawable/list_pressed_holo_light" />
     <item android:state_focused="true" android:drawable="@drawable/list_focused_holo" />
diff --git a/res/layout-sw580dp-w940dp/quickcontact_activity.xml b/res/layout-sw580dp-w940dp/quickcontact_activity.xml
new file mode 100644
index 0000000..5c38309
--- /dev/null
+++ b/res/layout-sw580dp-w940dp/quickcontact_activity.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<view
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    class="com.android.contacts.quickcontact.FloatingChildLayout"
+    android:id="@+id/floating_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:descendantFocusability="afterDescendants">
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="32dip"
+        android:orientation="horizontal">
+        <FrameLayout
+            android:layout_width="360dip"
+            android:layout_height="360dip">
+            <include layout="@layout/quickcontact_photo_container" />
+        </FrameLayout>
+        <LinearLayout
+            android:layout_width="360dip"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+            <include layout="@layout/quickcontact_track" />
+            <View
+                android:id="@+id/line_after_track"
+                android:layout_width="match_parent"
+                android:layout_height="2dip"
+                android:background="@color/quickcontact_tab_indicator" />
+            <android.support.v4.view.ViewPager
+                android:id="@+id/item_list_pager"
+                android:background="@color/quickcontact_list_background"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+        </LinearLayout>
+    </LinearLayout>
+</view>
diff --git a/res/layout-sw680dp-w1000dp/contact_detail_container.xml b/res/layout-sw680dp-w1000dp/contact_detail_container.xml
index 9e1eb33..8180e92 100644
--- a/res/layout-sw680dp-w1000dp/contact_detail_container.xml
+++ b/res/layout-sw680dp-w1000dp/contact_detail_container.xml
@@ -54,6 +54,7 @@
         android:id="@+id/updates_fragment_container"
         android:layout_width="0dip"
         android:layout_weight="2"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent"
+        android:visibility="gone" />
 
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/res/layout-sw680dp-w1000dp/quickcontact_activity.xml b/res/layout-sw680dp-w1000dp/quickcontact_activity.xml
new file mode 100644
index 0000000..5c38309
--- /dev/null
+++ b/res/layout-sw680dp-w1000dp/quickcontact_activity.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<view
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    class="com.android.contacts.quickcontact.FloatingChildLayout"
+    android:id="@+id/floating_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:descendantFocusability="afterDescendants">
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="32dip"
+        android:orientation="horizontal">
+        <FrameLayout
+            android:layout_width="360dip"
+            android:layout_height="360dip">
+            <include layout="@layout/quickcontact_photo_container" />
+        </FrameLayout>
+        <LinearLayout
+            android:layout_width="360dip"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+            <include layout="@layout/quickcontact_track" />
+            <View
+                android:id="@+id/line_after_track"
+                android:layout_width="match_parent"
+                android:layout_height="2dip"
+                android:background="@color/quickcontact_tab_indicator" />
+            <android.support.v4.view.ViewPager
+                android:id="@+id/item_list_pager"
+                android:background="@color/quickcontact_list_background"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+        </LinearLayout>
+    </LinearLayout>
+</view>
diff --git a/res/layout-sw680dp/quickcontact_activity.xml b/res/layout-sw680dp/quickcontact_activity.xml
new file mode 100644
index 0000000..8843fc9
--- /dev/null
+++ b/res/layout-sw680dp/quickcontact_activity.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<view
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:ex="http://schemas.android.com/apk/res/com.android.contacts"
+    class="com.android.contacts.quickcontact.FloatingChildLayout"
+    android:id="@+id/floating_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:descendantFocusability="afterDescendants">
+    <LinearLayout
+        android:id="@android:id/content"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:padding="32dip"
+        android:orientation="vertical" >
+        <FrameLayout
+            android:layout_width="360dip"
+            android:layout_height="@dimen/quick_contact_photo_container_height">
+            <include layout="@layout/quickcontact_photo_container" />
+        </FrameLayout>
+        <include layout="@layout/quickcontact_track" />
+        <View
+            android:id="@+id/line_after_track"
+            android:layout_width="match_parent"
+            android:layout_height="2dip"
+            android:background="@color/quickcontact_tab_indicator" />
+        <android.support.v4.view.ViewPager
+            android:id="@+id/item_list_pager"
+            android:layout_width="match_parent"
+            android:layout_height="160dip" />
+    </LinearLayout>
+</view>
diff --git a/res/layout/contact_detail_updates_fragment_container.xml b/res/layout/contact_detail_updates_fragment_container.xml
index fb3a8ac..7414f61 100644
--- a/res/layout/contact_detail_updates_fragment_container.xml
+++ b/res/layout/contact_detail_updates_fragment_container.xml
@@ -22,4 +22,5 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/updates_fragment_container"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"/>
\ No newline at end of file
+    android:layout_height="match_parent"
+    android:visibility="gone" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index ea59a3d..b078582 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 gevind"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> gevind"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Alle"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Alle kontakte"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Groepe"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Gunstelinge"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Foon"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index f18baed..56f357f 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 ተገኝቷል"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> ተገኝቷል"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"ሁሉም"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"ሁሉም እውቂያዎች"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"ቡድኖች"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"ተወዳጆች"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"ስልክ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index ac26be7..17d6a58 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"تم العثور على جهة اتصال واحدة"</item>
     <item quantity="other" msgid="7988132539476575389">"تم العثور على <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"الكل"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"جميع جهات الاتصال"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"المجموعات"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"المفضلة"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"الهاتف"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 435f47c..47efdc2 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"знойдзены 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Знойдзеныя: <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Усе"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Усе кантакты"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Групы"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Выбранае"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Тэлефон"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 0ce7374..08f7388 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 намерен"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> намерени"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Всички"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Всички контакти"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Групи"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Любими"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Телефон"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index ec06dbf..5cf8209 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -134,7 +134,8 @@
     <item quantity="one" msgid="4826918429708286628">"1 contacte"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> contactes"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Tots"</string>
+    <!-- no translation found for contactsAllLabel (6479708629170672169) -->
+    <skip />
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grups"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Preferits"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telèfon"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 1e1bf59..9744658 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Nalezeno: 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Nalezeno: <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Vše"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Všechny kontakty"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Skupiny"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Oblíbené"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 51f01ce..ed82fbc 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 fundet"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> fundet"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Alle"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Alle kontaktpersoner"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupper"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favorit"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 1ee13e9..fa2b504 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 gefunden"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> gefunden"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Alle"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Alle Kontakte"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Gruppen"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoriten"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 6eb32a2..e130495 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Βρέθηκε 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Βρέθηκαν <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Όλα"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Όλες οι επαφές"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Ομάδες"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Αγαπ."</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Τηλέφωνο"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index c1cae5f..37b6679 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 found"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> found"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"All"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"All contacts"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Groups"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favourites"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Phone"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 07afea7..9d0f8f0 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Se encontró uno (1)"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> encontrado(s)"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Todos"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Todos los contactos"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupos"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoritos"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Teléfono"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index b3503b5..a4bc8c6 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 encontrado"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> encontrados"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Todos"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Todos los contactos"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupos"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoritos"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Teléfono"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 0dfc7d6..87006b3 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 leitud"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> leitud"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Kõik"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Kõik kontaktid"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupid"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Lemmikud"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index f83fc5f..9c286e9 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -134,7 +134,8 @@
     <item quantity="one" msgid="4826918429708286628">"1 مورد پیدا شد"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> یافت شد"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"همه"</string>
+    <!-- no translation found for contactsAllLabel (6479708629170672169) -->
+    <skip />
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"گروه ها"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"موارد دلخواه"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"تلفن"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 1349934..a4164ee 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Löytyi 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Löytyi <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Kaikki"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Kaikki kontaktit"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Ryhmät"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Suosikit"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Puhelin"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 805288a..6a195cf 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 contact trouvé"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> contact(s) trouvé(s)"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Tous"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Tous les contacts"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Groupes"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoris"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Tél."</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 4909eea..bff0734 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 मिला"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> मिले"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"सभी"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"सभी संपर्क"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"समूह"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"पसंदीदा"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"फ़ोन"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 83e62c7..967c7a5 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 pronađen"</item>
     <item quantity="other" msgid="7988132539476575389">"Pronađeno kontakata: <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Sve"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Svi kontakti"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupe"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoriti"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index d1a6792..acc3dd8 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 találat"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> találat"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Összes"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Az összes névjegy"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Csoportok"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Kedvencek"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 6d47924..21a218f 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Ada 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Ada <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Semua"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Semua kontak"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grup"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favorit"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telepon"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index a974042..b0907c1 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 trovato"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> trovati"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Tutti"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Tutti i contatti"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Gruppi"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Preferiti"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefono"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 36e4b20..e888650 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"נמצא אחד"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> נמצאו"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"הכל"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"כל אנשי הקשר"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"קבוצות"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"מועדפים"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"טלפון"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 43f97e6..711aa60 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1件見つかりました"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g>件見つかりました"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"すべて"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"すべての連絡先"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"グループ"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"お気入り"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"電話"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3ad8c25..2118dae 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1개를 찾았습니다."</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g>개를 찾았습니다."</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"전체"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"모든 연락처"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"그룹"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"즐겨찾기"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"휴대전화"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 3d8fa17..7fe7127 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"rastas 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Rasta <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Visi"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Visi kontaktai"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupės"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Adresynas"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefonas"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index f6b77b1..fa06166 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Atrasta 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Atrastas <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Visas"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Visas kontaktpersonas"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupas"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Izlase"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Zvanīt"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index a24b5cf..c067af5 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -134,7 +134,8 @@
     <item quantity="one" msgid="4826918429708286628">"1 ditemui"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> ditemui"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Semua"</string>
+    <!-- no translation found for contactsAllLabel (6479708629170672169) -->
+    <skip />
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Kumpulan"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Kegemaran"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 2496659..863b52a 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -134,7 +134,8 @@
     <item quantity="one" msgid="4826918429708286628">"1 funnet"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> funnet"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Alle"</string>
+    <!-- no translation found for contactsAllLabel (6479708629170672169) -->
+    <skip />
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupper"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoritter"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 86d19fb..ce6c66f 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 gevonden"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> gevonden"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Alle"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Alle contacten"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Groepen"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoriet"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefoon"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index a411d96..5ab30a1 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Znaleziono: 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Znaleziono: <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Wszystkie"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Wszystkie kontakty"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupy"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Ulubione"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index ffc9ea6..7572bf6 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 encontrado"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> encontrado(s)"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Tudo"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Todos os contactos"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupos"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoritos"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefone"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index acfedef..3be405a 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Um encontrado"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> encontrados"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Tudo"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Todos os contatos"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupos"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoritos"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefone"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index 636bb43..0dbb54f 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -178,7 +178,7 @@
     <item quantity="one" msgid="4826918429708286628">"chattà 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Chattà <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <!-- no translation found for contactsAllLabel (6178225597569649305) -->
+    <!-- no translation found for contactsAllLabel (6479708629170672169) -->
     <skip />
     <!-- no translation found for contactsGroupsLabel (2841971472518003524) -->
     <skip />
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 36774a9..12ba779 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"A fost găsită 1 persoană din agendă"</item>
     <item quantity="other" msgid="7988132539476575389">"Au fost găsite <xliff:g id="COUNT">%d</xliff:g> (de) persoane din agendă"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Toate"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Toată Agenda"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupuri"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favorite"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 9dd0e0e..0c6e8f6 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Найдено: 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Найдено: <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Все"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Все контакты"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Группы"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Избранное"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Кнопки"</string>
@@ -410,7 +410,7 @@
     <string name="display_options_view_given_name_first" msgid="6968288511197363292">"Сначала имя"</string>
     <string name="display_options_view_family_name_first" msgid="1447288164951453714">"Сначала фамилию"</string>
     <string name="take_photo" msgid="7496128293167402354">"Сфотографировать"</string>
-    <string name="take_new_photo" msgid="7341354729436576304">"Создать новое фото"</string>
+    <string name="take_new_photo" msgid="7341354729436576304">"Сфотографировать"</string>
     <string name="pick_photo" msgid="3746334626214970837">"Выбрать фото из галереи"</string>
     <string name="pick_new_photo" msgid="7962368009197147617">"Выбрать новое фото из Галереи"</string>
     <string name="locale_change_in_progress" msgid="7583992153091537467">"Список контактов обновляется после смены языка интерфейса."</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 72735c8..a34e3b8 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Počet nájdených položiek: 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Počet nájdených položiek: <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Všetky"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Všetky kontakty"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Skupiny"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Obľúbené"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefón"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 3c2d7c8..263c48e 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 najden"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> najdenih"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Vse"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Vsi stiki"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Skupine"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Priljubljeno"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index ef6d21a..4b10063 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 пронађен"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> пронађено"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Све"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Сви контакти"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Групе"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Омиљено"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Телефон"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 54179e1..27698ec 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 hittades"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> hittades"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Alla"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Alla kontakter"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Grupper"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Favoriter"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index a146176..68f65a4 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Patikana 1"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> zimepatikana"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Zote"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Anwani zote"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Vikundi"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Vipendwa"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Simu"</string>
diff --git a/res/values-sw580dp-w940dp/styles.xml b/res/values-sw580dp-w940dp/styles.xml
index 07ef912..d035240 100644
--- a/res/values-sw580dp-w940dp/styles.xml
+++ b/res/values-sw580dp-w940dp/styles.xml
@@ -35,6 +35,7 @@
         <item name="list_item_gap_between_label_and_data">5dip</item>
         <item name="list_item_vertical_divider_margin">5dip</item>
         <item name="list_item_presence_icon_margin">4dip</item>
+        <item name="list_item_presence_icon_size">16dip</item>
         <item name="list_item_photo_size">64dip</item>
         <item name="list_item_profile_photo_size">80dip</item>
         <item name="list_item_prefix_highlight_color">@color/people_app_theme_color</item>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 7a247ae..a8d935b 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -35,6 +35,7 @@
         <item name="list_item_gap_between_label_and_data">5dip</item>
         <item name="list_item_vertical_divider_margin">5dip</item>
         <item name="list_item_presence_icon_margin">4dip</item>
+        <item name="list_item_presence_icon_size">16dip</item>
         <item name="list_item_photo_size">64dip</item>
         <item name="list_item_profile_photo_size">80dip</item>
         <item name="list_item_prefix_highlight_color">@color/people_app_theme_color</item>
diff --git a/res/values-sw680dp/styles.xml b/res/values-sw680dp/styles.xml
index 3db3867..fb242d9 100644
--- a/res/values-sw680dp/styles.xml
+++ b/res/values-sw680dp/styles.xml
@@ -35,6 +35,7 @@
         <item name="list_item_gap_between_label_and_data">5dip</item>
         <item name="list_item_vertical_divider_margin">5dip</item>
         <item name="list_item_presence_icon_margin">4dip</item>
+        <item name="list_item_presence_icon_size">16dip</item>
         <item name="list_item_photo_size">64dip</item>
         <item name="list_item_profile_photo_size">80dip</item>
         <item name="list_item_prefix_highlight_color">@color/people_app_theme_color</item>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 2e7e052..26b594b 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"พบ 1 รายการ"</item>
     <item quantity="other" msgid="7988132539476575389">"พบ <xliff:g id="COUNT">%d</xliff:g> รายการ"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"ทั้งหมด"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"ที่อยู่ติดต่อทั้งหมด"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"กลุ่ม"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"รายการโปรด"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"โทรศัพท์"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 07643af..b3642e3 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 ang nakita"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> ang nakita"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Lahat"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Lahat ng contact"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Mga Pangkat"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Mga Paborito"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telepono"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 82ef250..bda73d0 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"1 kişi bulundu"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> kişi bulundu"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Tümü"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Tüm kişiler"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Gruplar"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Sık Kullanılanlar"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 33ac75e..d2dbb57 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Знайдено 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Знайдено <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Усі"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Усі контакти"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Групи"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Вибране"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Тел."</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index f825411..c9407f3 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"Đã tìm thấy 1"</item>
     <item quantity="other" msgid="7988132539476575389">"Đã tìm thấy <xliff:g id="COUNT">%d</xliff:g>"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Tất cả"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Tất cả liên hệ"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Nhóm"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Mục ưa thích"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Điện thoại"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index d069f9c..0474e23 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -134,7 +134,8 @@
     <item quantity="one" msgid="4826918429708286628">"找到 1 个联系人"</item>
     <item quantity="other" msgid="7988132539476575389">"找到 <xliff:g id="COUNT">%d</xliff:g> 个联系人"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"全部"</string>
+    <!-- no translation found for contactsAllLabel (6479708629170672169) -->
+    <skip />
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"群组"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"收藏"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"拨号"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e7ce3d7..8043348 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"找到 1 位聯絡人"</item>
     <item quantity="other" msgid="7988132539476575389">"找到 <xliff:g id="COUNT">%d</xliff:g> 位聯絡人"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"全部"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"所有聯絡人"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"群組"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"我的最愛"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"電話"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index d997f59..f3dc93e 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -134,7 +134,7 @@
     <item quantity="one" msgid="4826918429708286628">"otholakele ongu-1"</item>
     <item quantity="other" msgid="7988132539476575389">"<xliff:g id="COUNT">%d</xliff:g> tholakele"</item>
   </plurals>
-    <string name="contactsAllLabel" msgid="6178225597569649305">"Konke"</string>
+    <string name="contactsAllLabel" msgid="6479708629170672169">"Bonke oxhumana nabo"</string>
     <string name="contactsGroupsLabel" msgid="2841971472518003524">"Amaqembu"</string>
     <string name="contactsFavoritesLabel" msgid="8417039765586853670">"Izintandokazi"</string>
     <string name="dialerIconLabel" msgid="6500826552823403796">"Ifoni"</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 1702585..829b207 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -176,6 +176,7 @@
     </style>
 
     <style name="ContactsActionBarDropDownStyle" parent="@android:style/Widget.Holo.Light.Spinner">
+        <item name="android:background">@drawable/ab_dropdown_navigation_item_background</item>
     </style>
 
     <style name="ContactsActionBarTheme" parent="@android:style/Theme.Holo">
@@ -351,14 +352,10 @@
     <style name="PeopleNavigationDropDownTextAppearance">
         <item name="android:textColor">#333333</item>
         <item name="android:textSize">18sp</item>
-        <item name="android:textStyle">normal</item>
-        <item name="android:textAllCaps">false</item>
     </style>
 
     <style name="PeopleNavigationDropDownHeaderTextAppearance">
-        <item name="android:textColor">?android:attr/textColorPrimaryInverse</item>
-        <item name="android:textSize">14sp</item>
-        <item name="android:textStyle">bold</item>
-        <item name="android:textAllCaps">true</item>
+        <item name="android:textColor">#cdffffff</item>
+        <item name="android:textSize">18sp</item>
     </style>
 </resources>
diff --git a/src/com/android/contacts/ContactsApplication.java b/src/com/android/contacts/ContactsApplication.java
index b23dde1..956ce65 100644
--- a/src/com/android/contacts/ContactsApplication.java
+++ b/src/com/android/contacts/ContactsApplication.java
@@ -26,10 +26,13 @@
 import android.app.FragmentManager;
 import android.app.LoaderManager;
 import android.content.ContentResolver;
+import android.content.ContentUris;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.os.AsyncTask;
 import android.os.StrictMode;
 import android.preference.PreferenceManager;
+import android.provider.ContactsContract.Contacts;
 import android.util.Log;
 
 public final class ContactsApplication extends Application {
@@ -120,10 +123,6 @@
             Log.d(Constants.PERFORMANCE_TAG, "ContactsApplication.onCreate start");
         }
 
-        // Priming caches to placate the StrictMode police
-        Context context = getApplicationContext();
-        PreferenceManager.getDefaultSharedPreferences(context);
-        AccountTypeManager.getInstance(context);
         if (ENABLE_FRAGMENT_LOG) FragmentManager.enableDebugLogging(true);
         if (ENABLE_LOADER_LOG) LoaderManager.enableDebugLogging(true);
 
@@ -132,8 +131,30 @@
                     new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());
         }
 
+        // Perform the initialization that doesn't have to finish immediately.
+        // We use an async task here just to avoid creating a new thread.
+        (new DelayedInitializer()).execute();
+
         if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
             Log.d(Constants.PERFORMANCE_TAG, "ContactsApplication.onCreate finish");
         }
     }
+
+    private class DelayedInitializer extends AsyncTask<Void, Void, Void> {
+        @Override
+        protected Void doInBackground(Void... params) {
+            final Context context = ContactsApplication.this;
+
+            // Warm up the preferences, the account type manager and the contacts provider.
+            PreferenceManager.getDefaultSharedPreferences(context);
+            AccountTypeManager.getInstance(context);
+            getContentResolver().getType(ContentUris.withAppendedId(Contacts.CONTENT_URI, 1));
+            return null;
+        }
+
+        public void execute() {
+            executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
+                    (Void[]) null);
+        }
+    }
 }
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index bcceff4..075c59f 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -150,7 +150,7 @@
 
     private ContactsUnavailableFragment mContactsUnavailableFragment;
     private ProviderStatusWatcher mProviderStatusWatcher;
-    private int mProviderStatus;
+    private ProviderStatusWatcher.Status mProviderStatus;
 
     private boolean mOptionsMenuContactsAvailable;
 
@@ -217,7 +217,8 @@
     }
 
     public boolean areContactsAvailable() {
-        return mProviderStatus == ProviderStatus.STATUS_NORMAL;
+        return (mProviderStatus != null)
+                && mProviderStatus.status == ProviderStatus.STATUS_NORMAL;
     }
 
     private boolean areContactWritableAccountsAvailable() {
@@ -560,6 +561,11 @@
                 case ContactsRequest.ACTION_VIEW_CONTACT:
                     // We redirect this intent to the detail activity on 1-pane, so we don't get
                     // here.  It's only for 2-pane.
+                    Uri currentlyLoadedContactUri = mContactDetailFragment.getUri();
+                    if (currentlyLoadedContactUri != null
+                            && !mRequest.getContactUri().equals(currentlyLoadedContactUri)) {
+                        mContactDetailsView.setMaskVisibility(true);
+                    }
                     tabToOpen = TabState.ALL;
                     break;
                 case ContactsRequest.ACTION_GROUP:
@@ -612,7 +618,7 @@
         // If we are switching from one group to another, do a cross-fade
         if (mGroupDetailFragment != null && mGroupDetailFragment.getGroupUri() != null &&
                 !UriUtils.areEqual(mGroupDetailFragment.getGroupUri(), groupUri)) {
-            mGroupDetailsView.startTransition(mGroupDetailFragment.getView(), false);
+            mGroupDetailsView.startMaskTransition(false);
         }
         mGroupDetailFragment.loadGroup(groupUri);
         invalidateOptionsMenuIfNeeded();
@@ -986,14 +992,15 @@
     }
 
     private void updateViewConfiguration(boolean forceUpdate) {
-        int providerStatus = mProviderStatusWatcher.getProviderStatus();
-        if (!forceUpdate && (providerStatus == mProviderStatus)) return;
+        ProviderStatusWatcher.Status providerStatus = mProviderStatusWatcher.getProviderStatus();
+        if (!forceUpdate && (mProviderStatus != null)
+                && (providerStatus.status == mProviderStatus.status)) return;
         mProviderStatus = providerStatus;
 
         View contactsUnavailableView = findViewById(R.id.contacts_unavailable_view);
         View mainView = findViewById(R.id.main_view);
 
-        if (mProviderStatus == ProviderStatus.STATUS_NORMAL) {
+        if (mProviderStatus.status == ProviderStatus.STATUS_NORMAL) {
             // Ensure that the mTabPager is visible; we may have made it invisible below.
             contactsUnavailableView.setVisibility(View.GONE);
             if (mTabPager != null) {
@@ -1028,9 +1035,8 @@
                 getFragmentManager().beginTransaction()
                         .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
                         .commitAllowingStateLoss();
-            } else {
-                mContactsUnavailableFragment.update();
             }
+            mContactsUnavailableFragment.updateStatus(mProviderStatus);
 
             // Show the contactsUnavailableView, and hide the mTabPager so that we don't
             // see it sliding in underneath the contactsUnavailableView at the edges.
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index c91f493..5c68dcb 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -356,6 +356,9 @@
         mShowStaticPhoto = showPhoto;
     }
 
+    /**
+     * Shows the contact detail with a message indicating there are no contact details.
+     */
     public void showEmptyState() {
         setData(null, null);
     }
@@ -406,6 +409,9 @@
 
         if (mContactData == null) {
             mView.setVisibility(View.INVISIBLE);
+            if (mStaticPhotoContainer != null) {
+                mStaticPhotoContainer.setVisibility(View.GONE);
+            }
             mAllEntries.clear();
             if (mAdapter != null) {
                 mAdapter.notifyDataSetChanged();
diff --git a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java b/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
index 7af9b28..08ed87b 100644
--- a/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
+++ b/src/com/android/contacts/detail/ContactDetailFragmentCarousel.java
@@ -173,6 +173,16 @@
         }
     }
 
+    /**
+     * Reset the fragment carousel to show the about page.
+     */
+    public void reset() {
+        if (mCurrentPage != ABOUT_PAGE) {
+            mCurrentPage = ABOUT_PAGE;
+            snapToEdge();
+        }
+    }
+
     public int getCurrentPage() {
         return mCurrentPage;
     }
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index a99f35f..2c18d4f 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -291,8 +291,7 @@
         if (PhoneCapabilityTester.isUsingTwoPanes(mActivity)) {
             // Tablet: If we already showed data before, we want to cross-fade from screen to screen
             if (contactWasLoaded && mTransitionAnimationView != null && isDifferentContact) {
-                mTransitionAnimationView.startTransition(
-                        mViewContainer, mContactData == null);
+                mTransitionAnimationView.startMaskTransition(mContactData == null);
             }
         } else {
             // Small screen: We are on our own screen. Fade the data in, but only the first time
@@ -367,7 +366,7 @@
                     // This is screen is very hard to animate properly, because there is such a hard
                     // cut from the regular version. A proper animation would have to reflow text
                     // and move things around. Doing a simple cross-fade instead.
-                    mTransitionAnimationView.startTransition(mViewContainer, false);
+                    mTransitionAnimationView.startMaskTransition(false);
                 }
 
                 // Set the contact data (hide the static photo because the photo will already be in
@@ -406,6 +405,9 @@
             case LayoutMode.TWO_COLUMN_FRAGMENT_CAROUSEL: {
                 // Allow swiping between all fragments
                 mFragmentCarousel.enableSwipe(true);
+                if (isDifferentContact) {
+                    mFragmentCarousel.reset();
+                }
                 if (!isDifferentContact && animateStateChange) {
                     mFragmentCarousel.animateAppear();
                 }
diff --git a/src/com/android/contacts/dialpad/DialpadFragment.java b/src/com/android/contacts/dialpad/DialpadFragment.java
index 89585e8..745c044 100644
--- a/src/com/android/contacts/dialpad/DialpadFragment.java
+++ b/src/com/android/contacts/dialpad/DialpadFragment.java
@@ -73,6 +73,7 @@
 import com.android.contacts.activities.DialtactsActivity;
 import com.android.contacts.util.Constants;
 import com.android.contacts.util.PhoneNumberFormatter;
+import com.android.contacts.util.StopWatch;
 import com.android.internal.telephony.ITelephony;
 import com.android.phone.CallLogAsync;
 import com.android.phone.HapticFeedback;
@@ -468,17 +469,25 @@
     public void onResume() {
         super.onResume();
 
+        final StopWatch stopWatch = StopWatch.start("Dialpad.onResume");
+
         // Query the last dialed number. Do it first because hitting
         // the DB is 'slow'. This call is asynchronous.
         queryLastOutgoingCall();
 
+        stopWatch.lap("qloc");
+
         // retrieve the DTMF tone play back setting.
         mDTMFToneEnabled = Settings.System.getInt(getActivity().getContentResolver(),
                 Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;
 
+        stopWatch.lap("dtwd");
+
         // Retrieve the haptic feedback setting.
         mHaptic.checkSystemSetting();
 
+        stopWatch.lap("hptc");
+
         // if the mToneGenerator creation fails, just continue without it.  It is
         // a local audio signal, and is not as important as the dtmf tone itself.
         synchronized (mToneGeneratorLock) {
@@ -491,6 +500,7 @@
                 }
             }
         }
+        stopWatch.lap("tg");
         // Prevent unnecessary confusion. Reset the press count anyway.
         mDialpadPressCount = 0;
 
@@ -501,6 +511,8 @@
             fillDigitsIfNecessary(parent.getIntent());
         }
 
+        stopWatch.lap("fdin");
+
         // While we're in the foreground, listen for phone state changes,
         // purely so that we can take down the "dialpad chooser" if the
         // phone becomes idle while the chooser UI is visible.
@@ -508,6 +520,8 @@
                 (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
         telephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
 
+        stopWatch.lap("tm");
+
         // Potentially show hint text in the mDigits field when the user
         // hasn't typed any digits yet.  (If there's already an active call,
         // this hint text will remind the user that he's about to add a new
@@ -531,7 +545,13 @@
             showDialpadChooser(false);
         }
 
+        stopWatch.lap("hnt");
+
         updateDialAndDeleteButtonEnabledState();
+
+        stopWatch.lap("bes");
+
+        stopWatch.stopAndLog(TAG, 50);
     }
 
     @Override
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index becc704..b645425 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -18,6 +18,7 @@
 import com.android.contacts.R;
 
 import android.app.Fragment;
+import android.content.Context;
 import android.os.Bundle;
 import android.provider.ContactsContract.ProviderStatus;
 import android.view.Gravity;
@@ -35,8 +36,6 @@
  */
 public class ContactsUnavailableFragment extends Fragment implements OnClickListener {
 
-    private ProviderStatusWatcher mProviderStatusWatcher;
-
     private View mView;
     private TextView mMessageView;
     private TextView mSecondaryMessageView;
@@ -51,10 +50,11 @@
 
     private OnContactsUnavailableActionListener mListener;
 
+    private ProviderStatusWatcher.Status mProviderStatus;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mProviderStatusWatcher = ProviderStatusWatcher.getInstance(getActivity());
     }
 
     @Override
@@ -74,7 +74,11 @@
         mRetryUpgradeButton = (Button) mView.findViewById(R.id.import_failure_retry_button);
         mRetryUpgradeButton.setOnClickListener(this);
         mProgress = (ProgressBar) mView.findViewById(R.id.progress);
-        update();
+
+        if (mProviderStatus != null) {
+            updateStatus(mProviderStatus);
+        }
+
         return mView;
     }
 
@@ -83,9 +87,13 @@
         mListener = listener;
     }
 
-    public void update() {
-        int providerStatus = mProviderStatusWatcher.getProviderStatus();
-        switch (providerStatus) {
+    public void updateStatus(ProviderStatusWatcher.Status providerStatus) {
+        mProviderStatus = providerStatus;
+        if (mView == null) {
+            // The view hasn't been inflated yet.
+            return;
+        }
+        switch (providerStatus.status) {
             case ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS:
                 setMessageText(mNoContactsMsgResId, mNSecNoContactsMsgResId);
                 mCreateContactButton.setVisibility(View.VISIBLE);
@@ -122,7 +130,7 @@
 
             case ProviderStatus.STATUS_UPGRADE_OUT_OF_MEMORY:
                 String message = getResources().getString(R.string.upgrade_out_of_memory,
-                        new Object[] { mProviderStatusWatcher.getProviderStatusData() });
+                        new Object[] { providerStatus.data});
                 mMessageView.setText(message);
                 mMessageView.setGravity(Gravity.LEFT);
                 mMessageView.setVisibility(View.VISIBLE);
@@ -155,7 +163,10 @@
                 mListener.onFreeInternalStorageAction();
                 break;
             case R.id.import_failure_retry_button:
-                mProviderStatusWatcher.retryUpgrade();
+                final Context context = getActivity();
+                if (context != null) { // Just in case.
+                    ProviderStatusWatcher.retryUpgrade(context);
+                }
                 break;
         }
     }
@@ -167,9 +178,8 @@
     public void setMessageText(int resId, int secResId) {
         mNoContactsMsgResId = resId;
         mNSecNoContactsMsgResId = secResId;
-        if (mMessageView != null &&
-                mProviderStatusWatcher.getProviderStatus() ==
-                    ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS) {
+        if ((mMessageView != null) && (mProviderStatus != null) &&
+                (mProviderStatus.status == ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS)) {
             if (resId != -1) {
                 mMessageView.setText(mNoContactsMsgResId);
                 mMessageView.setGravity(Gravity.CENTER_HORIZONTAL);
diff --git a/src/com/android/contacts/list/ProviderStatusWatcher.java b/src/com/android/contacts/list/ProviderStatusWatcher.java
index 3ce4b78..ae0b779 100644
--- a/src/com/android/contacts/list/ProviderStatusWatcher.java
+++ b/src/com/android/contacts/list/ProviderStatusWatcher.java
@@ -47,6 +47,19 @@
         public void onProviderStatusChange();
     }
 
+    public static class Status {
+        /** See {@link ProviderStatus#STATUS} */
+        public final int status;
+
+        /** See {@link ProviderStatus#DATA1} */
+        public final String data;
+
+        public Status(int status, String data) {
+            this.status = status;
+            this.data = data;
+        }
+    }
+
     private static final String[] PROJECTION = new String[] {
         ProviderStatus.STATUS,
         ProviderStatus.DATA1
@@ -57,8 +70,6 @@
      */
     private static final int LOAD_WAIT_TIMEOUT_MS = 1000;
 
-    private static final int STATUS_UNKNOWN = -1;
-
     private static ProviderStatusWatcher sInstance;
 
     private final Context mContext;
@@ -71,10 +82,7 @@
     private LoaderTask mLoaderTask;
 
     /** Last known provider status.  This can be changed on a worker thread. */
-    private int mProviderStatus = STATUS_UNKNOWN;
-
-    /** Last known provider status data.  This can be changed on a worker thread. */
-    private String mProviderData;
+    private Status mProviderStatus;
 
     private final ArrayList<ProviderStatusListener> mListeners = Lists.newArrayList();
 
@@ -177,32 +185,18 @@
      * (If {@link ProviderStatus#STATUS_UPGRADING} is returned, the app (should) shows an according
      * message, like "contacts are being updated".)
      */
-    public int getProviderStatus() {
+    public Status getProviderStatus() {
         waitForLoaded();
 
-        if (mProviderStatus == STATUS_UNKNOWN) {
-            return ProviderStatus.STATUS_UPGRADING;
+        if (mProviderStatus == null) {
+            return new Status(ProviderStatus.STATUS_UPGRADING, null);
         }
 
         return mProviderStatus;
     }
 
-    /**
-     * @return last known provider status data.  See also {@link #getProviderStatus()}.
-     */
-    public String getProviderStatusData() {
-        waitForLoaded();
-
-        if (mProviderStatus == STATUS_UNKNOWN) {
-            // STATUS_UPGRADING has no data.
-            return "";
-        }
-
-        return mProviderData;
-    }
-
     private void waitForLoaded() {
-        if (mProviderStatus == STATUS_UNKNOWN) {
+        if (mProviderStatus == null) {
             if (mLoaderTask == null) {
                 // For some reason the loader couldn't load the status.  Let's start it again.
                 startLoading();
@@ -238,8 +232,10 @@
                 if (cursor != null) {
                     try {
                         if (cursor.moveToFirst()) {
-                            mProviderStatus = cursor.getInt(0);
-                            mProviderData = cursor.getString(1);
+                            // Note here we can't just say "Status", as AsyncTask has the "Status"
+                            // enum too.
+                            mProviderStatus = new ProviderStatusWatcher.Status(
+                                    cursor.getInt(0), cursor.getString(1));
                             return true;
                         }
                     } finally {
@@ -291,14 +287,14 @@
     /**
      * Sends a provider status update, which will trigger a retry of database upgrade
      */
-    public void retryUpgrade() {
+    public static void retryUpgrade(final Context context) {
         Log.i(TAG, "retryUpgrade");
         final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
             @Override
             protected Void doInBackground(Void... params) {
                 ContentValues values = new ContentValues();
                 values.put(ProviderStatus.STATUS, ProviderStatus.STATUS_UPGRADING);
-                mContext.getContentResolver().update(ProviderStatus.CONTENT_URI, values,
+                context.getContentResolver().update(ProviderStatus.CONTENT_URI, values,
                         null, null);
                 return null;
             }
diff --git a/src/com/android/contacts/list/ShortcutIntentBuilder.java b/src/com/android/contacts/list/ShortcutIntentBuilder.java
index 753ba02..d71a0f5 100644
--- a/src/com/android/contacts/list/ShortcutIntentBuilder.java
+++ b/src/com/android/contacts/list/ShortcutIntentBuilder.java
@@ -137,6 +137,7 @@
      */
     private abstract class LoadingAsyncTask extends AsyncTask<Void, Void, Void> {
         protected Uri mUri;
+        protected String mContentType;
         protected String mDisplayName;
         protected byte[] mBitmapData;
         protected long mPhotoId;
@@ -147,6 +148,7 @@
 
         @Override
         protected Void doInBackground(Void... params) {
+            mContentType = mContext.getContentResolver().getType(mUri);
             loadData();
             loadPhoto();
             return null;
@@ -196,7 +198,7 @@
         }
         @Override
         protected void onPostExecute(Void result) {
-            createContactShortcutIntent(mUri, mDisplayName, mBitmapData);
+            createContactShortcutIntent(mUri, mContentType, mDisplayName, mBitmapData);
         }
     }
 
@@ -248,7 +250,7 @@
         return bitmap;
     }
 
-    private void createContactShortcutIntent(Uri contactUri, String displayName,
+    private void createContactShortcutIntent(Uri contactUri, String contentType, String displayName,
             byte[] bitmapData) {
         Bitmap bitmap = getPhotoBitmap(bitmapData);
 
@@ -263,7 +265,7 @@
         // Tell the launcher to not do its animation, because we are doing our own
         shortcutIntent.putExtra(INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION, true);
 
-        shortcutIntent.setData(contactUri);
+        shortcutIntent.setDataAndType(contactUri, contentType);
         shortcutIntent.putExtra(ContactsContract.QuickContact.EXTRA_MODE,
                 ContactsContract.QuickContact.MODE_LARGE);
         shortcutIntent.putExtra(ContactsContract.QuickContact.EXTRA_EXCLUDE_MIMES,
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index c54619c..cbddf90 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -21,6 +21,7 @@
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.DataKind;
+import com.android.contacts.util.Constants;
 import com.android.contacts.util.DataStatus;
 import com.android.contacts.util.ImageViewDrawableSetter;
 import com.android.contacts.util.SchedulingUtils;
@@ -196,7 +197,7 @@
         Uri lookupUri = intent.getData();
 
         // Check to see whether it comes from the old version.
-        if (LEGACY_AUTHORITY.equals(lookupUri.getAuthority())) {
+        if (lookupUri != null && LEGACY_AUTHORITY.equals(lookupUri.getAuthority())) {
             final long rawContactId = ContentUris.parseId(lookupUri);
             lookupUri = RawContacts.getContactLookupUri(getContentResolver(),
                     ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId));
@@ -206,8 +207,9 @@
 
         // Read requested parameters for displaying
         final Rect sourceBounds = intent.getSourceBounds();
-        Preconditions.checkNotNull(sourceBounds, "missing sourceBounds");
-        mFloatingLayout.setChildTargetScreen(sourceBounds);
+        if (sourceBounds != null) {
+            mFloatingLayout.setChildTargetScreen(sourceBounds);
+        }
 
         mExcludeMimes = intent.getStringArrayExtra(QuickContact.EXTRA_EXCLUDE_MIMES);
 
@@ -499,6 +501,9 @@
             bindData(data);
 
             if (TRACE_LAUNCH) android.os.Debug.stopMethodTracing();
+            if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
+                Log.d(Constants.PERFORMANCE_TAG, "QuickContact shown");
+            }
 
             // Data bound and ready, pull curtain to show. Put this on the Handler to ensure
             // that the layout passes are completed
diff --git a/src/com/android/contacts/util/ImageViewDrawableSetter.java b/src/com/android/contacts/util/ImageViewDrawableSetter.java
index 5cde022..1d23dd0 100644
--- a/src/com/android/contacts/util/ImageViewDrawableSetter.java
+++ b/src/com/android/contacts/util/ImageViewDrawableSetter.java
@@ -39,10 +39,10 @@
     private ImageView mTarget;
     private byte[] mCompressed;
     private Drawable mPreviousDrawable;
+    private int mDurationInMillis = 0;
     private static final String TAG = "ImageViewDrawableSetter";
 
     public ImageViewDrawableSetter() {
-
     }
 
     public ImageViewDrawableSetter(ImageView target) {
@@ -54,6 +54,10 @@
         setCompressedImage(contactData.getPhotoBinaryData());
     }
 
+    public void setTransitionDuration(int durationInMillis) {
+        mDurationInMillis = durationInMillis;
+    }
+
     public ImageView getTarget() {
         return mTarget;
     }
@@ -97,7 +101,7 @@
         // If we don't have a new Drawable, something went wrong... bail out.
         if (newDrawable == null) return previousBitmap();
 
-        if (mPreviousDrawable == null) {
+        if (mPreviousDrawable == null || mDurationInMillis == 0) {
             // Set the new one immediately.
             mTarget.setImageDrawable(newDrawable);
         } else {
@@ -107,7 +111,7 @@
             beforeAndAfter[1] = newDrawable;
             final TransitionDrawable transition = new TransitionDrawable(beforeAndAfter);
             mTarget.setImageDrawable(transition);
-            transition.startTransition(200);
+            transition.startTransition(mDurationInMillis);
         }
 
         // Remember this for next time, so that we can transition from it to the
diff --git a/src/com/android/contacts/util/StopWatch.java b/src/com/android/contacts/util/StopWatch.java
new file mode 100644
index 0000000..0657621
--- /dev/null
+++ b/src/com/android/contacts/util/StopWatch.java
@@ -0,0 +1,85 @@
+/*
+ * 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.contacts.util;
+
+import com.google.android.collect.Lists;
+
+import android.util.Log;
+
+import java.util.ArrayList;
+
+/**
+ * A {@link StopWatch} records start, laps and stop, and print them to logcat.
+ */
+public class StopWatch {
+
+    private final String mLabel;
+
+    private final ArrayList<Long> mTimes = Lists.newArrayList();
+    private final ArrayList<String> mLapLabels = Lists.newArrayList();
+
+    private StopWatch(String label) {
+        mLabel = label;
+        lap("");
+    }
+
+    /**
+     * Create a new instance and start it.
+     */
+    public static StopWatch start(String label) {
+        return new StopWatch(label);
+    }
+
+    /**
+     * Record a lap.
+     */
+    public void lap(String lapLabel) {
+        mTimes.add(System.currentTimeMillis());
+        mLapLabels.add(lapLabel);
+    }
+
+    /**
+     * Stop it and log the result, if the total time >= {@code timeThresholdToLog}.
+     */
+    public void stopAndLog(String TAG, int timeThresholdToLog) {
+
+        lap("");
+
+        final long start = mTimes.get(0);
+        final long stop = mTimes.get(mTimes.size() - 1);
+
+        final long total = stop - start;
+        if (total < timeThresholdToLog) return;
+
+        final StringBuilder sb = new StringBuilder();
+        sb.append(mLabel);
+        sb.append(",");
+        sb.append(total);
+        sb.append(": ");
+
+        long last = start;
+        for (int i = 1; i < mTimes.size(); i++) {
+            final long current = mTimes.get(i);
+            sb.append(mLapLabels.get(i));
+            sb.append(",");
+            sb.append((current - last));
+            sb.append(" ");
+            last = current;
+        }
+        Log.v(TAG, sb.toString());
+    }
+}
diff --git a/src/com/android/contacts/widget/TransitionAnimationView.java b/src/com/android/contacts/widget/TransitionAnimationView.java
index cefc82d..28d728b 100644
--- a/src/com/android/contacts/widget/TransitionAnimationView.java
+++ b/src/com/android/contacts/widget/TransitionAnimationView.java
@@ -15,30 +15,20 @@
  */
 package com.android.contacts.widget;
 
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
 import android.animation.ObjectAnimator;
 import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.Color;
-import android.graphics.drawable.BitmapDrawable;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.FrameLayout;
 
 /**
- * A container for a view that needs to have exit/enter animations when rebinding data.
- * After rebinding the contents, the following call should be made (where child is the only visible)
- * child
- * <pre>
- *   TransitionAnimationView.startAnimation(child);
- * </pre>
+ * A container that places a masking view on top of all other views.  The masking view can be
+ * faded in and out.  Currently, the masking view is solid color white.
  */
-public class TransitionAnimationView extends FrameLayout implements AnimatorListener {
-    private View mPreviousStateView;
-    private Bitmap mPreviousStateBitmap;
-    private ObjectAnimator mPreviousAnimator;
+public class TransitionAnimationView extends FrameLayout {
+    private View mMaskingView;
+    private ObjectAnimator mAnimator;
 
     public TransitionAnimationView(Context context) {
         this(context, null, 0);
@@ -55,75 +45,43 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mPreviousStateView = new View(getContext());
-        mPreviousStateView.setVisibility(View.INVISIBLE);
-        mPreviousStateView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+        mMaskingView = new View(getContext());
+        mMaskingView.setVisibility(View.INVISIBLE);
+        mMaskingView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
                 LayoutParams.MATCH_PARENT));
-        addView(mPreviousStateView);
+        mMaskingView.setBackgroundColor(Color.WHITE);
+        addView(mMaskingView);
     }
 
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        mPreviousStateView.setBackgroundDrawable(null);
-        if (mPreviousStateBitmap != null) {
-            mPreviousStateBitmap.recycle();
-            mPreviousStateBitmap = null;
-        }
-    }
-
-    public void startTransition(View view, boolean closing) {
-        if (mPreviousAnimator != null && mPreviousAnimator.isRunning()) {
-            mPreviousAnimator.end();
-        }
-        if (view.getVisibility() != View.VISIBLE) {
-            if (!closing) {
-                mPreviousAnimator = ObjectAnimator.ofFloat(view, View.ALPHA, 0.0f, 1.0f);
-                mPreviousAnimator.start();
-            }
-        } else if (closing) {
-            mPreviousAnimator = ObjectAnimator.ofFloat(view, View.ALPHA, 1.0f, 0.0f);
-            mPreviousAnimator.start();
+    public void setMaskVisibility(boolean flag) {
+        if (flag) {
+            mMaskingView.setAlpha(1.0f);
+            mMaskingView.setVisibility(View.VISIBLE);
         } else {
-            if (view.getWidth() > 0 && view.getHeight() > 0) {
-                // Take a "screenshot" of the current state of the screen and show that on top
-                // of the real content. Then, fade that out.
-                mPreviousStateBitmap = Bitmap.createBitmap(
-                        view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
-                mPreviousStateView.setBackgroundDrawable(
-                        new BitmapDrawable(getContext().getResources(), mPreviousStateBitmap));
-                mPreviousStateView.setLayoutParams(view.getLayoutParams());
-                mPreviousStateBitmap.eraseColor(Color.WHITE);
-                Canvas canvas = new Canvas(mPreviousStateBitmap);
-                view.draw(canvas);
-                canvas.setBitmap(null);
-                mPreviousStateView.setVisibility(View.VISIBLE);
-
-                mPreviousAnimator =
-                        ObjectAnimator.ofFloat(mPreviousStateView, View.ALPHA, 1.0f, 0.0f);
-                mPreviousAnimator.start();
-            }
+            mMaskingView.setVisibility(View.INVISIBLE);
         }
     }
 
-    @Override
-    public void onAnimationEnd(Animator animation) {
-        mPreviousStateView.setVisibility(View.INVISIBLE);
-        mPreviousStateView.setBackgroundDrawable(null);
-        mPreviousStateBitmap.recycle();
-        mPreviousStateBitmap = null;
-        mPreviousAnimator = null;
-    }
+    /**
+     * Starts the transition of showing or hiding the mask.
+     * If showMask is true, the mask will be set to be invisible then fade into hide the other
+     * views in this container.  If showMask is false, the mask will be set to be hide other views
+     * initially.  Then, the other views in this container will be revealed.
+     */
+    public void startMaskTransition(boolean showMask) {
+        // Stop any animation that may still be running.
+        if (mAnimator != null && mAnimator.isRunning()) {
+            mAnimator.end();
+        }
 
-    @Override
-    public void onAnimationCancel(Animator animation) {
-    }
-
-    @Override
-    public void onAnimationStart(Animator animation) {
-    }
-
-    @Override
-    public void onAnimationRepeat(Animator animation) {
+        mMaskingView.setVisibility(View.VISIBLE);
+        if (showMask) {
+            mAnimator = ObjectAnimator.ofFloat(mMaskingView, View.ALPHA, 0.0f, 1.0f);
+            mAnimator.start();
+        } else {
+            // asked to hide the view
+            mAnimator = ObjectAnimator.ofFloat(mMaskingView, View.ALPHA, 1.0f, 0.0f);
+            mAnimator.start();
+        }
     }
 }