am ecf025c0: Reconcile with ics-mr1-release

* commit 'ecf025c0980230e6f925ce8ddcf8965ed17531af':
diff --git a/proguard.flags b/proguard.flags
index f56ffff..3117066 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -11,3 +11,9 @@
 -keep class ** {
   *** *ForTest(...);
 }
+
+# Any class or method annotated with NeededForTesting.
+-keep @com.android.providers.contacts.util.NeededForTesting class *
+-keepclassmembers class * {
+@com.android.providers.contacts.util.NeededForTesting *;
+}
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index df3e1f6..2f6562b 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android-kernprogramme"</string>
     <string name="app_label" msgid="3389954322874982620">"Kontakte-berging"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakte"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Gradeer kontaktedatabasis op."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Kontakopgradering benodig meer berging"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Gradeer kontakberging op"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Kies om die opgradering te voltooi."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Gradeer kontaktedatabasis op."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Kontakte-opgradering benodig meer geheue."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Gradeer berging vir kontakte op"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Raak om die opgradering te voltooi."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakte"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Ander"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Kry toegang tot alle stemboodskappe"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Laat die program alle stemboodskappe stoor en ophaal wat hierdie toestel kan lees."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Laat die program toe om alle stemboodskappe te stoor en op te haal wat hierdie toestel kan lees."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Stemboodskap van "</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index ce2da2f..6aa55ec 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"የAndroid ኮር ትግበራ"</string>
     <string name="app_label" msgid="3389954322874982620">"የዕውቂያ ማከማቻ"</string>
     <string name="provider_label" msgid="6012150850819899907">"እውቅያዎች"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"የእውቂያዎችን ውሂብ ጎታ በማሻሻል ላይ፡፡"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"የእውቅያ አልቅ ተጨማሪ ማህደረ ትውስታ ይፈልጋል"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"የእውቂያ ማከማቻን ማላቅ"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"አልቁን ለማጠናቀቅ ምረጥ።"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"የእውቂያዎችን ውሂብ ጎታ በማሻሻል ላይ፡፡"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"የእውቅያዎች  አሻሽል  ተጨማሪ ማህደረ ትውስታ ይፈልጋል"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"ለእውቅያዎች ማከማቻ በማሻሻል ላይ"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"አሻሽሉን ለማጠናቀቅ ንካ፡፡"</string>
     <string name="default_directory" msgid="93961630309570294">"እውቅያዎች"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"ሌላ"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"ሁሉንም  የድምፅ መልዕክቶች ድረስ"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"ትግበራ ይህ መሣሪያ መድረስ  የሚችለውን የድምፅ መልዕክቶች በሙሉ ለማከማቸት እና ሰርስሮ ለማውጣት ይፈቅዳል።"</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"ትግበራ ይህ መሣሪያ መድረስ የሚችለውን የድምፅ መልዕክቶች በሙሉ ለማከማቸት እና ሰርስሮ ለማውጣት ይፈቅዳል።"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"ከ....የድምፅ መልዕክት "</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 9e0ac4e..3cd298d 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"تطبيقات Android المركزية"</string>
     <string name="app_label" msgid="3389954322874982620">"تخزين جهات الاتصال"</string>
     <string name="provider_label" msgid="6012150850819899907">"جهات الاتصال"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"جارٍ ترقية قاعدة بيانات جهات الاتصال."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"تحتاج ترقية جهة الاتصال إلى مزيد من الذاكرة"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"سعة تخزين ترقية جهة الاتصال"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"حدد لإكمال الترقية."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"جارٍ ترقية قاعدة بيانات جهات الاتصال."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"تتطلب ترقية جهات الاتصال مزيدًا من الذاكرة."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"ترقية وحدة التخزين لجهات الاتصال"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"المس لإكمال عملية الترقية."</string>
     <string name="default_directory" msgid="93961630309570294">"جهات الاتصال"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"غير ذلك"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"الوصول إلى جميع رسائل البريد الصوتي"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"للسماح للتطبيق بتخزين واسترداد جميع رسائل البريد الصوتي التي يمكن الوصول إليها عبر هذا الجهاز."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"للسماح للتطبيق بتخزين واسترداد جميع رسائل البريد الصوتي التي يمكن الوصول إليها عبر هذا الجهاز."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"بريد صوتي من "</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 13df956..dee34a7 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Основни приложения на Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Хранилище на контакти"</string>
     <string name="provider_label" msgid="6012150850819899907">"Контакти"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Базата от данни на контактите се надгражда."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Надстройването на контакта се нуждае от още памет"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Надстройка на хранилището за контакти"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Изберете за завършване на надстройването."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Базата от данни на контактите се надстройва."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"За надстройването на контактите е необходима още памет."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Хранилището за контакти се надстройва"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Докоснете, за да завършите надстройването."</string>
     <string name="default_directory" msgid="93961630309570294">"Контакти"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Други"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Достъп до всички гласови съобщения"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Разрешава на приложението да съхранява и извлича всички гласови съобщения, до които това устройство има достъп."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Разрешава на приложението да съхранява и извлича всички гласови съобщения, до които това устройство има достъп."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Гласова поща от "</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 8df6be3..ef073fa 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Aplicacions bàsiques d\'Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Emmagatzematge de contactes"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contactes"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"S\'està actualitzant la base de dades de Contactes."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Per actualitzar els contactes cal tenir més memòria"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"S\'està actualitzant l\'emmagatzematge dels contactes"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Seleccioneu-ho per completar l\'actualització."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"S\'està actualitzant la base de dades dels contactes."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Per actualitzar els contactes cal tenir més memòria."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"S\'està actualitzant l\'emmagatzematge per als contactes"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Toca-ho per completar l\'actualització."</string>
     <string name="default_directory" msgid="93961630309570294">"Contactes"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Altres"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Accés a tots els missatges de veu"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Permet que l\'aplicació emmagatzemi i recuperi tots els missatges de veu als quals pot accedir aquest dispositiu."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Permet que l\'aplicació emmagatzemi i recuperi totes les bústies de veu a les quals pot accedir aquest dispositiu."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Missatge de veu de "</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 3da1f3d..76335a0 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Úložiště kontaktů"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakty"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Aktualizace databáze kontaktů."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Upgrade kontaktu vyžaduje více paměti"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Nedostatek paměti pro upgrade kontaktu"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Výběrem této možnosti dokončíte upgrade."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Probíhá upgrade databáze kontaktů."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Upgrade kontaktů vyžaduje více paměti."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Probíhá upgrade úložiště kontaktů"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Dotykem dokončíte upgrade."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakty"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Jiné"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Přístup ke všem hlasovým zprávám"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Umožňuje aplikaci ukládat a načítat všechny hlasové zprávy, ke kterým má toto zařízení přístup."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Umožňuje aplikaci ukládat a načítat všechny hlasové zprávy, ke kterým má toto zařízení přístup."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Hlasová zpráva od uživatele "</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 76bb37f..7b708fb 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android-kerneapplikationer"</string>
     <string name="app_label" msgid="3389954322874982620">"Lagring af kontakter"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakter"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Opgraderer databasen med kontaktpersoner."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Opgradering af kontaktpersoner kræver mere hukommelse"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Opgraderer lagerplads til kontaktpersoner"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Vælg for at fuldføre opgraderingen."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Opgraderer databasen med kontaktpersoner."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Opgradering af kontaktpersoner kræver mere hukommelse."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Opgraderer lagring af kontaktpersoner"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Tryk for at fuldføre opgraderingen."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontaktpersoner"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Andre"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Adgang til alle telefonsvarerbeskeder"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Tillader applikationen at gemme og hente alle telefonsvarerbeskeder, som denne enhed kan få adgang til."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Tillader, at applikationen gemmer og henter alle telefonsvarerbeskeder, som denne enhed kan få adgang til."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Telefonsvarerbesked fra "</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 6827f15..1f10b19 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Kontakte-Speicher"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakte"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Kontaktdatenbank wird aktualisiert..."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Kontaktupgrade erfordert mehr Speicher"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Kontaktspeicher wird aktualisiert"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Zum Abschluss des Upgrades auswählen"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Kontaktdatenbank wird aktualisiert..."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Kontakte-Upgrade erfordert mehr Speicher."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Speicher für Kontakte wird aktualisiert..."</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Zum Abschluss des Upgrades berühren"</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakte"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Sonstige"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Zugriff auf alle Mailbox-Nachrichten"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Ermöglicht der Anwendung das Speichern und Abrufen aller Mailbox-Nachrichten, auf die dieses Gerät zugreifen kann"</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Ermöglicht der App das Speichern und Abrufen aller Mailbox-Nachrichten, auf die dieses Gerät zugreifen kann"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Mailbox-Nachricht von "</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 4fb21c9..2622515 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Βασικές εφαρμογές Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Χώρος αποθήκευσης επαφών"</string>
     <string name="provider_label" msgid="6012150850819899907">"Επαφές"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Αναβάθμιση βάσης δεδομένων επαφών"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Η αναβάθμιση των επαφών απαιτεί περισσότερη μνήμη"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Αναβάθμιση χώρου αποθήκευσης επαφών"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Επιλέξτε για την ολοκλήρωση της αναβάθμισης."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Αναβάθμιση βάσης δεδομένων επαφών"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Απαιτείται περισσότερη μνήμη για την αναβάθμιση των επαφών."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Αναβάθμιση χώρου αποθήκευσης για επαφές"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Αγγίξτε για να ολοκληρώσετε την αναβάθμιση."</string>
     <string name="default_directory" msgid="93961630309570294">"Επαφές"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Άλλο"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Πρόσβαση σε όλα τα μηνύματα αυτόματου τηλεφωνητή"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Επιτρέπει στην εφαρμογή την αποθήκευση και ανάκτηση όλων των μηνυμάτων αυτόματου τηλεφωνητή, στα οποία έχει πρόσβαση αυτή η συσκευή."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Επιτρέπει στην εφαρμογή την αποθήκευση και ανάκτηση όλων των μηνυμάτων αυτόματου τηλεφωνητή, στα οποία μπορεί να έχει πρόσβαση αυτή η συσκευή."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Μήνυμα αυτόματου τηλεφωνητή από "</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index efa2d60..9cbc783 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Contacts Storage"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contacts"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Upgrading Contacts database."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Contact upgrade needs more memory"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Upgrading contact storage"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Select to complete the upgrade."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Upgrading contacts database."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Contact upgrade needs more memory."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Upgrading storage for contacts"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Touch to complete the upgrade."</string>
     <string name="default_directory" msgid="93961630309570294">"Contacts"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Other"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Access all voicemails"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Allows the application to store and retrieve all voicemails that this device can access."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Allows the app to store and retrieve all voicemails that this device can access."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Voicemail from "</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b09e262..a3cddf2 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Aplicaciones básicas de Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Almacenamiento para contactos"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contactos"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Actualizando la base de datos de  los contactos"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"La actualización de los contactos necesita más memoria."</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Actualizando almacenamiento de contactos"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Selecciona para completar la actualización."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Actualizando la base de datos de los contactos"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"La actualización de contactos necesita más memoria."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Actualizando el espacio de almacenamiento de los contactos"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Toca para completar la actualización."</string>
     <string name="default_directory" msgid="93961630309570294">"Contactos"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Otro"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Acceder a todos los mensajes de voz"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Permite que la aplicación almacene y recupere todos los mensajes de voz a los que este dispositivo puede acceder."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Permite que la aplicación almacene y recupere todos los mensajes de voz a los que este dispositivo puede acceder."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Mensaje de voz de "</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index b901512..d4f7edf 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Aplicaciones básicas de Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Información de los contactos"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contactos"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Actualizando base de datos de contactos"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"La actualización del contacto necesita más memoria."</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Espacio de almacenamiento de actualización de contactos"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Selecciona esta opción para completar la actualización."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Actualizando la base de datos de contactos..."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"La actualización de contactos necesita más memoria."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Actualizando el almacenamiento para contactos..."</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Toca para completar la actualización."</string>
     <string name="default_directory" msgid="93961630309570294">"Contactos"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Otro"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Acceder a todos los mensajes de voz"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Permite que la aplicación almacene y recupere todos los mensajes de voz a los que puede acceder este dispositivo."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Permite que la aplicación almacene y recupere todos los mensajes de voz a los que puede acceder este dispositivo."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Mensaje de voz de "</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 687b0c4..bcdf710 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"حافظه مخاطبین"</string>
     <string name="provider_label" msgid="6012150850819899907">"مخاطبین"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"ارتقاء پایگاه داده مخاطبین."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"برای ارتقاء مخاطب به حافظه بیشتری نیاز است"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"ارتقا حافظه مخاطب"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"برای کامل کردن ارتقا انتخاب کنید."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"ارتقا پایگاه داده مخاطبین."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"برای ارتقای مخاطبین به حافظه بیشتری نیاز است."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"ارتقا حافظه برای مخاطبین"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"برای تکمیل ارتقا لمس کنید."</string>
     <string name="default_directory" msgid="93961630309570294">"مخاطبین"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"سایر موارد"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"دسترسی به تمام پست‌های صوتی"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"به برنامه اجازه ذخیره و بازیابی تمام پست‌های صوتی قابل دسترس برای این دستگاه را می‌دهد."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"به برنامه اجازه ذخیره و بازیابی تمام پست‌های صوتی قابل دسترس برای این دستگاه را می‌دهد."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"پست صوتی از "</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index e39fc54..d9c341f 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Androidin ydinsovellukset"</string>
     <string name="app_label" msgid="3389954322874982620">"Yhteystietojen tallennus"</string>
     <string name="provider_label" msgid="6012150850819899907">"Yhteystiedot"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Päivitetään yhteystietojen tietokantaa."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Yhteystietojen päivittämiseen tarvitaan lisää muistia"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Päivitetään yhteystietojen tallennustilaa"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Suorita päivitys loppuun valitsemalla."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Päivitetään yhteystietojen tietokantaa."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Yhteystietojen päivittämiseen tarvitaan enemmän muistia."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Päivitetään yhteystietojen tallennustilaa"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Suorita päivitys loppuun koskettamalla."</string>
     <string name="default_directory" msgid="93961630309570294">"Yhteystiedot"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Muu"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Kaikkien vastaajaviestien käyttäminen"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Antaa sovelluksen tallentaa ja hakea kaikki vastaajaviestit, jotka ovat laitteen käytettävissä."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Antaa sovelluksen tallentaa ja hakea kaikki vastaajaviestit, jotka ovat laitteen käytettävissä."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Vastaajaviesti henkilöltä "</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 6d794f2..b25b763 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Applications de base Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Liste des contacts"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contacts"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Mise à jour de la base de données Contacts."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"La mise à niveau des contacts requiert plus de mémoire."</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Mise à niveau du stockage des contacts"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Sélectionnez pour effectuer la mise à niveau."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Mise à jour de la base de données des contacts en cours…"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"La mise à jour des contacts requiert plus de mémoire."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Mise à jour du stockage des contacts"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Appuyez pour terminer la mise à jour."</string>
     <string name="default_directory" msgid="93961630309570294">"Contacts"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Autre"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Accéder à tous les messages vocaux"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Permet à l\'application de stocker et de récupérer tous les messages vocaux auxquels ce service peut accéder."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Permet à l\'application de stocker et de récupérer tous les messages vocaux auxquels cet appareil peut accéder."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Message vocal de "</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 153767b..f2d706a 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"संपर्क संग्रहण"</string>
     <string name="provider_label" msgid="6012150850819899907">"संपर्क"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"संपर्क डेटाबेस अपग्रेड हो रहा है."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"संपर्क अपग्रेड के लिए अधिक स्मृति की आवश्यकता होती है"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"संपर्क संग्रहण अपग्रेड किया जा रहा है"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"अपग्रेड पूर्ण करने के लिए चयन करें."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"संपर्क डेटाबेस अपग्रेड हो रहा है."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"संपर्क अपग्रेड के लिए अधिक स्मृति की आवश्यकता होती है."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"संपर्कों के लिए संग्रहण अपग्रेड करना"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"अपग्रेड पूर्ण करने के लिए स्पर्श करें."</string>
     <string name="default_directory" msgid="93961630309570294">"संपर्क"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"अन्य"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"सभी ध्‍वनि‍मेल पर पहुंचें"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"एप्‍लि‍केशन को ऐसे सभी ध्‍वनि‍मेल संग्रहीत और पुनर्प्राप्त करने देता है जि‍न पर यह उपकरण पहुंच सकता है."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"एप्‍लि‍केशन को ऐसे सभी ध्‍वनि‍मेल संग्रहीत और पुनर्प्राप्त करने देता है जि‍न पर यह उपकरण पहुंच सकता है."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"इनका ध्‍वनि‍मेल: "</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index f00b088..2b53781 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Matične aplikacije za Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Prostor za pohranu kontakata"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakti"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Nadogradnja baze podataka kontakata."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Za nadogradnju kontakta potrebno je više memorije"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Nadogradnja pohrane kontakata"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Odaberite da biste dovršili nadogradnju."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Nadogradnja baze podataka kontakata."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Za nadogradnju kontakata potrebno je više memorije."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Nadogradnja pohrane za kontakte"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Dodirnite da biste dovršili nadogradnju."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakti"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Drugo"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Pristup svoj govornoj pošti"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Omogućuje aplikaciji pohranu i dohvat sve govorne pošte kojoj uređaj može pristupiti."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Aplikaciji omogućuje pohranjivanje i dohvaćanje svih poruka govorne pošte kojoj ovaj uređaj može pristupati."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Govorna pošta od "</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 934bd73..7f477e5 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Alap Android-alkalmazások"</string>
     <string name="app_label" msgid="3389954322874982620">"Névjegytár"</string>
     <string name="provider_label" msgid="6012150850819899907">"Címtár"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Névjegyek adatbázisának frissítése"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"A névjegy frissítéséhez több memóriára van szükség"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"A névjegy-tárhely frissítése"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Válassza ezt a verziófrissítéshez."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Névjegyek adatbázisának frissítése."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"A névjegyek frissítéséhez több memóriára van szükség."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Névjegyek tárolójának frissítése"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Érintse meg a frissítés befejezéséhez."</string>
     <string name="default_directory" msgid="93961630309570294">"Címtár"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Egyéb"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Hozzáférés az összes hangüzenethez"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Lehetővé teszi, hogy az alkalmazás tárolja és lekérje azokat a hangüzeneteket, amelyekhez ez a készülék hozzáférhet."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Lehetővé teszi, hogy az alkalmazás tárolja és lekérje azokat a hangüzeneteket, amelyekhez ez a készülék hozzáférhet."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Hangüzenet tőle: "</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 34600a8..f958b12 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Apl Inti Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Penyimpanan Kenalan"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kenalan"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Meningkatkan versi basis data Kenalan."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Peningkatan versi kenalan memerlukan lebih banyak memori"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Meningkatkan penyimpanan kenalan"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Pilih untuk menyelesaikan peningkatan versi."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Meningkatkan versi basis data kenalan."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Peningkatan versi kenalan memerlukan lebih banyak memori."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Meningkatkan versi penyimpanan untuk kenalan"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Sentuh untuk menyelesaikan peningkatan versi."</string>
     <string name="default_directory" msgid="93961630309570294">"Kenalan"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Lainnya"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Akses semua pesan suara"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Mengizinkan aplikasi menyimpan dan mengambil semua pesan suara yang dapat diakses oleh perangkat ini."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Mengizinkan apl menyimpan dan mengambil semua pesan suara yang dapat diakses oleh perangkat ini."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Kotak pesan dari "</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 719dc98..dfea4d4 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Applicazioni di base Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Archiviazione contatti"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contatti"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Upgrade del database di Contatti."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"L\'aggiornamento dei contatti richiede più memoria"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Aggiornamento dell\'archivio contatti"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Seleziona per completare l\'aggiornamento."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Upgrade del database dei contatti."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"L\'upgrade dei contatti richiede più memoria."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Upgrade dell\'archivio dei contatti"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Tocca per completare l\'upgrade."</string>
     <string name="default_directory" msgid="93961630309570294">"Contatti"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Altro"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Accesso a tutti i messaggi vocali"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Consente all\'applicazione di archiviare e recuperare tutti i messaggi vocali a cui questo dispositivo può accedere."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Consente all\'applicazione di archiviare recuperare tutti i messaggi vocali a cui questo dispositivo può accedere."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Messaggio vocale da "</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 0840371..c87a2f9 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"אחסון אנשי קשר"</string>
     <string name="provider_label" msgid="6012150850819899907">"אנשי קשר"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"משדרג את מסד הנתונים של אנשי הקשר."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"שדרוג אנשי קשר דורש זיכרון נוסף"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"משדרג אחסון של אנשי קשר"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"בחר כדי להשלים את השדרוג."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"משדרג את מסד הנתונים של אנשי הקשר."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"שדרוג אנשי הקשר מחייב זיכרון נוסף."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"משדרג את האחסון של אנשי קשר"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"גע כדי לבצע את השדרוג."</string>
     <string name="default_directory" msgid="93961630309570294">"אנשי קשר"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"אחר"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"גישה לכל הודעות הדואר הקולי"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"מאפשר ליישום לאחסן ולאחזר את כל הודעות הדואר הקולי שמכשיר זה יכול לגשת אליהן."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"מאפשר ליישום לאחסן ולאחזר את כל הודעות הדואר הקולי שלמכשיר זה יש גישה אליהן."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"הודעה קולית מאת "</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index ec64581..74044d8 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"アドレス帳"</string>
     <string name="provider_label" msgid="6012150850819899907">"連絡先"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"連絡先データベースをアップグレードしています。"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"連絡先のアップグレードに必要なメモリが不足しています"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"連絡先ストレージのアップグレード"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"アップグレードを完了するには選択してください。"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"連絡先データベースをアップグレードしています。"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"連絡先のアップグレードに必要なメモリが不足しています。"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"連絡先用ストレージのアップグレード"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"アップグレードを完了するにはタップしてください。"</string>
     <string name="default_directory" msgid="93961630309570294">"連絡先"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"その他"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"すべてのボイスメールにアクセス"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"この端末でアクセス可能なすべてのボイスメールを保存、取得することをアプリケーションに許可します。"</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"この端末でアクセス可能なすべてのボイスメールを保存、取得することをアプリに許可します。"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"受信ボイスメール: "</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index a1a1b91..041cc0b 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core 앱"</string>
     <string name="app_label" msgid="3389954322874982620">"주소록 저장소"</string>
     <string name="provider_label" msgid="6012150850819899907">"주소록"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"주소록 데이터베이스 업그레이드 중"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"연락처를 업그레이드하려면 메모리가 더 필요합니다."</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"연락처 저장소 업그레이드"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"업그레이드를 완료하려면 선택하세요."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"주소록 데이터베이스 업그레이드 중"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"주소록을 업그레이드하려면 메모리가 더 필요합니다."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"주소록을 위한 저장소 업그레이드 중"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"업그레이드를 완료하려면 터치하세요."</string>
     <string name="default_directory" msgid="93961630309570294">"주소록"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"기타"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"모든 음성사서함에 액세스"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"애플리케이션을 사용하면 이 기기에서 액세스할 수 있는 모든 음성사서함을 저장하고 검색할 수 있습니다."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"앱이 이 기기에서 액세스할 수 있는 모든 음성사서함을 저장하고 검색하도록 허용합니다."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"음성사서함 발신자 "</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index b0f2cf2..b873d1f 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Pagrindinės „Android“ programos"</string>
     <string name="app_label" msgid="3389954322874982620">"Adresatų saugykla"</string>
     <string name="provider_label" msgid="6012150850819899907">"Adresinė"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Naujovinama Kontaktų duomenų bazė."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Norint naujovinti adresatą, reikia daugiau atminties"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Naujovinama adresatų saugykla"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Pasirinkite ir užbaikite naujovinimą."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Naujovinami kontaktų duomenys."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Norint naujovinti kontaktus, reikia daugiau atminties."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Naujovinama kontaktų atmintinė"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Palieskite, kad baigtumėte naujovinti."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontaktai"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Kita"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Pasiekti visus balso pašto pranešimus"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Leidžiama programai saugoti ir nuskaityti visus balso pašto pranešimus, kuriuos gali pasiekti šis įrenginys."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Leidžiama programai saugoti ir nuskaityti visus balso pašto pranešimus, kuriuos gali pasiekti šis įrenginys."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Balso pašto pranešimas nuo "</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 5c11d72..fa1e89e 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Kontaktpersonu krātuve"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontaktpersonas"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Notiek kontaktpersonu datu bāzes jaunināšana."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Lai jauninātu kontaktpersonas, nepieciešams vairāk atmiņas."</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Kontaktpersonu krātuves jaunināšana"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Atlasiet, lai pabeigtu jaunināšanu."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Notiek kontaktpersonu datu bāzes jaunināšana."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Lai jauninātu kontaktpersonas, nepieciešams vairāk vietas atmiņā."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Notiek kontaktpersonu krātuves jaunināšana"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Pieskarieties, lai pabeigtu jaunināšanu."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontaktpersonas"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Cits"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Piekļuve visiem balss pasta ziņojumiem"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Ļauj lietojumprogrammai glabāt un izgūt visus balss pasta ziņojumus, kuriem var piekļūt šajā ierīcē."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Ļauj lietotnei glabāt un izgūt visus balss pasta ziņojumus, kuriem var piekļūt šajā ierīcē."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Balss pasta ziņojums no "</string>
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index d00395e..653a8d9 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Apl Teras Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Storan Kenalan"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kenalan"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Menaiktaraf pangkalan data Kenalan."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Kemas kini kenalan memerlukan lagi memori"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Meningkatkan storan kenalan"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Pilih untuk menyelesaikan pengemaskinian."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Menaik taraf pangkalan data kenalan."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Peningkatan kenalan memerlukan lebih banyak memori."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Meningkatkan storan untuk kenalan"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Sentuh untuk menyelesaikan peningkatan."</string>
     <string name="default_directory" msgid="93961630309570294">"Kenalan"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Lain-lain"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Akses semua mel suara"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Membenarkan aplikasi menyimpan dan mengambil semula semua mel suara yang boleh diakses peranti ini."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Membenarkan aplikasi menyimpan dan mengambil semula semua mel suara yang boleh diakses peranti ini."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Mel suara daripada "</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 72bb3e9..5775854 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Kjerneapper for Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Kontaktlager"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakter"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Oppgraderer kontaktdatabase."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Det er ikke nok minne for å oppgradere kontaktene"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Oppgraderer lagrede kontakter"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Velg for å fullføre oppgraderingen."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Oppgraderer kontaktdatabasen."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Du har ikke nok minne til å oppgradere kontaktene."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Oppgraderer lagring for kontakter"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Trykk for å fullføre oppgraderingen."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakter"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Andre"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Tilgang til alle talemeldinger"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Gjør at applikasjonen kan lagre og hente alle talepostmeldinger som denne enheten har tilgang til."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Lar appen lagre og hente alle talepostmeldinger som denne enheten har tilgang til."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Talemelding fra "</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 82e7e70..1a09288 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Kernapps van Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Opslag contacten"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contacten"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Contactendatabase bijwerken."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Voor het bijwerken van contacten is meer geheugen nodig"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Contactopslag bijwerken"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Selecteer om de upgrade te voltooien."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Contactendatabase bijwerken."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Voor het bijwerken van contacten is meer geheugen nodig."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Opslag voor contacten bijwerken"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Raak aan om de upgrade te voltooien."</string>
     <string name="default_directory" msgid="93961630309570294">"Contacten"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Overig"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Toegang tot alle voicemails"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Hiermee kan de app alle voicemails opslaan en ophalen waartoe dit apparaat toegang heeft."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Toestaan dat de app alle voicemails opslaat en ophaalt waartoe dit apparaat toegang heeft."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Voicemail van "</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index dfcf8fd..b598221 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Aplikacje główne Androida"</string>
     <string name="app_label" msgid="3389954322874982620">"Spis kontaktów"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakty"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Uaktualnianie bazy danych Kontaktów."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Uaktualnienie kontaktów wymaga więcej pamięci"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Uaktualnianie magazynu kontaktów"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Wybierz, aby dokończyć uaktualnianie."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Uaktualnianie bazy danych kontaktów"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Uaktualnienie kontaktów wymaga więcej pamięci."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Pamięć na uaktualnienie kontaktów"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Dotknij, aby dokończyć uaktualnianie."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakty"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Inne"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Dostęp do wszystkich wiadomości głosowych"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Zezwala aplikacji na przechowywanie i pobieranie wszystkich wiadomości głosowych, do których ma dostęp to urządzenie."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Zezwala aplikacji na przechowywanie i pobieranie wszystkich wiadomości głosowych, do których ma dostęp to urządzenie."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Poczta głosowa od "</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index e84a22e..acdb0d2 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Aplicações Principais do Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Armazenamento de contactos"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contactos"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"A atualizar a base de dados de Contactos."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"A actualização de contactos necessita de mais memória"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"A actualizar armazenamento de contactos"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Seleccione para concluir a actualização."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"A atualizar a base de dados de contactos."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"A atualização de contactos necessita de mais memória."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"A atualizar armazenamento de contactos"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Toque para concluir a atualização."</string>
     <string name="default_directory" msgid="93961630309570294">"Contactos"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Outro"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Acesso a todas as mensagens de correio de voz"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Permite à aplicação guardar e recuperar todas as mensagens de correio de voz a que este aparelho pode aceder."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Permite à aplicação guardar e recuperar todas as mensagens de correio de voz a que este aparelho pode aceder."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Correio de voz de "</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index ec9efae..5d471a1 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Principais aplicativos do Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Armazenamento de contatos"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contatos"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Atualizando o banco de dados de contatos."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"A atualização de contatos precisa de mais memória"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Armazenamento de atualização de contatos"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Selecione para concluir a atualização."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Atualizando o banco de dados de contatos."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"A atualização de contatos precisa de mais memória."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Atualização do armazenamento para contatos"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Toque para concluir a atualização."</string>
     <string name="default_directory" msgid="93961630309570294">"Contatos"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Outros"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Acessar todas as mensagens de voz"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Permite que o aplicativo armazene e recupere todas as mensagens de voz que esse dispositivo acessa."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Permite que o aplicativo armazene e recupere todas as mensagens de voz que esse dispositivo acessa."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Correio de voz de "</string>
 </resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index e975b42..317a60d 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -20,16 +20,16 @@
     <skip />
     <string name="app_label" msgid="3389954322874982620">"Glista da contacts"</string>
     <string name="provider_label" msgid="6012150850819899907">"Contacts"</string>
-    <!-- no translation found for upgrade_msg (6174884195179549239) -->
+    <!-- no translation found for upgrade_msg (8640807392794309950) -->
     <skip />
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Ina actualisaziun da contacts basegna dapli memoria"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Actualisar la memoria da contacts"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Tscherner per cumplettar l\'actualisaziun"</string>
+    <!-- outdated translation 4089605622758004662 -->     <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Ina actualisaziun da contacts basegna dapli memoria"</string>
+    <!-- outdated translation 7849508493764133004 -->     <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Actualisar la memoria da contacts"</string>
+    <!-- outdated translation 3967762223137708403 -->     <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Tscherner per cumplettar l\'actualisaziun"</string>
     <string name="default_directory" msgid="93961630309570294">"Contacts"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Auter"</string>
     <!-- no translation found for read_write_all_voicemail_label (4557216100818257560) -->
     <skip />
-    <!-- no translation found for read_write_all_voicemail_description (2249895806470926882) -->
+    <!-- no translation found for read_write_all_voicemail_description (8029809937805761356) -->
     <skip />
     <!-- no translation found for voicemail_from_column (435732568832121444) -->
     <skip />
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 7ceb2ff..110f166 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Stocarea datelor din Agendă"</string>
     <string name="provider_label" msgid="6012150850819899907">"Agendă"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Se actualizează baza de date a Agendei."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Actualizarea datelor despre persoanele din agendă necesită mai multă memorie"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Se trece la o versiune superioară a memoriei pentru persoanele din agendă"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Selectaţi pentru a finaliza trecerea la o versiune superioară."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Se actualizează baza de date a Agendei."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Actualizarea agendei necesită mai multă memorie."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Măriţi spaţiul de stocare pentru Agendă"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Atingeţi pentru a finaliza actualizarea."</string>
     <string name="default_directory" msgid="93961630309570294">"Agendă"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Altul"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Accesaţi toate mesajele vocale"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Permite aplicaţiei să stocheze şi să preia toate mesajele vocale pe care acest dispozitiv le poate accesa."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Permite aplicaţiei să stocheze şi să preia toate mesajele vocale pe care acest dispozitiv le poate accesa."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Mesaj vocal de la "</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 60ae7b9..45b28a0 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Основные приложения Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Хранилище контактов"</string>
     <string name="provider_label" msgid="6012150850819899907">"Контакты"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Обновление базы данных контактов..."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Необходимо больше памяти для обновления контактов"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Обновление памяти контактов"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Нажмите, чтобы завершить обновление."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Обновление базы данных контактов..."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Для обновления контактов нужно больше памяти."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Недостаточно места для обновления контактов"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Нажмите, чтобы завершить обновление."</string>
     <string name="default_directory" msgid="93961630309570294">"Контакты"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Другое"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Доступ к голосовым сообщениям"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Разрешить приложению сохранять и извлекать все голосовые сообщения, к которым есть доступ на этом устройстве."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Приложение сможет сохранять и загружать все голосовые сообщения, к которым есть доступ на этом устройстве."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Голосовое сообщение от абонента "</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index ec716f6..e8d82c6 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Úložisko kontaktov"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakty"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Prebieha inovácia databázy kontaktov."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Inovácia kontaktu vyžaduje viac pamäte"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Prebieha inovácia ukladacieho priestoru kontaktov"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Výberom tejto možnosti dokončíte inováciu"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Prebieha inovácia databázy kontaktov."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Inovácia kontaktov vyžaduje viac pamäte."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Prebieha inovácia úložiska pre kontakty"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Dotykom na túto možnosť dokončíte inováciu."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakty"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Iné"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Prístup ku všetkým hlasovým správam"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Umožňuje aplikácii uchovávať a načítavať všetky hlasové správy, ku ktorým má zariadenie prístup."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Umožňuje aplikácii uchovávať a načítavať všetky hlasové správy, ku ktorým má zariadenie prístup."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Hlasová správa od "</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index ec1fe50..af43531 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Osrednji programi sistema Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Shramba za stike"</string>
     <string name="provider_label" msgid="6012150850819899907">"Stiki"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Nadgradnja zbirke podatkov stikov."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Za nadgradnjo stika je potrebnega več pomnilnika"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Nadgradnja shrambe za stike"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Izberite, da dokončate nadgradnjo."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Nadgradnja zbirke podatkov stikov."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Za nadgradnjo stikov je potrebno več pomnilnika"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Nadgradnja shrambe za stike"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Dotaknite se, da končate nadgradnjo."</string>
     <string name="default_directory" msgid="93961630309570294">"Stiki"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Drugo"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Dostop do glasovne pošte"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Programu dovoli shranjevanje in prenos sporočil glasovne pošte, do katerih lahko dostopa ta naprava."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Programu dovoli shranjevanje in prenos sporočil v odzivniku, do katerih lahko dostopa ta naprava."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Govorna pošta s številke "</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index fca0af9..c8888db 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core апликације"</string>
     <string name="app_label" msgid="3389954322874982620">"Складиште контаката"</string>
     <string name="provider_label" msgid="6012150850819899907">"Контакти"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Надограђивање базе података о контактима."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"За ажурирање контаката потребно је више меморије"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Ажурирање складишта контаката"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Изаберите опцију за довршетак надоградње."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Надограђивање базе података о контактима."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"За ажурирање контаката потребно је више меморије."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Надограђивање меморије за контакте"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Додирните да бисте довршили надоградњу."</string>
     <string name="default_directory" msgid="93961630309570294">"Контакти"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Други"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Приступ свим порукама говорне поште"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Омогућава апликацији да складишти и преузима све поруке говорне поште којима овај уређај може да приступи."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Дозвољава апликацији да складишти и преузима све поруке говорне поште којима овај уређај може да приступи."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Говорна пошта од "</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 897fbff..06ecf9a 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Kontakter"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kontakter"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Uppgraderar kontaktdatabas."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Kontaktuppgradering kräver mer minne"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Uppgradera kontaktminne"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Välj för att slutföra uppgraderingen."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Kontaktdatabasen uppgraderas."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Kontaktuppgradering kräver mer minne."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Lagringsutrymmet för kontakter uppgraderas"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Tryck om du vill slutföra uppgraderingen."</string>
     <string name="default_directory" msgid="93961630309570294">"Kontakter"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Övrigt"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Åtkomst till alla röstmeddelanden"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Tillåter att programmet sparar och hämtar alla röstmeddelanden som enheten har åtkomst till."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Tillåter att appen sparar och hämtar alla röstmeddelanden som enheten har åtkomst till."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Röstmeddelande från "</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 1c8ebd1..b83c636 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Programu Msingi za Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Hifadhi ya Anwani"</string>
     <string name="provider_label" msgid="6012150850819899907">"Anwani"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Inapandisha daraja la hifadhidata ya Anwani."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Kupandisha gredi kwa anwani kunahitaji kumbukumbu zaidi"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Upandishaji gredi wa hifadhi ya anwani"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Chagua ili kukamilisha kupandisha daraja."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Inapandisha gredi hifadhidata ya Anwani."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Kupandishwa gredi kwa anwani kunahitaji kumbukumbu zaidi."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Inapandisha gredi hifadhi ya anwani"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Gusa ili kukamilisha kupandisha gredi."</string>
     <string name="default_directory" msgid="93961630309570294">"Anwani"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Nyingineyo"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Fikia barua zote za sauti"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Huruhusu programu kuhifadhi na kuepua barua zote za sauti ambazo kifaa hiki kinaweza kufikia."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Inaruhusu programu kuhifadhi na kutoa jumbe zote za sauti ambazo kifaa hiki kinaweza kufikia."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Barua ya sauti kutoka "</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index d9b996c..0cb6adc 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"แอปพลิเคชันหลักของ Android"</string>
     <string name="app_label" msgid="3389954322874982620">"ที่จัดเก็บรายชื่อ"</string>
     <string name="provider_label" msgid="6012150850819899907">"สมุดโทรศัพท์"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"กำลังอัปเกรดฐานข้อมูลรายชื่อติดต่อ"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"ต้องใช้หน่วยความจำเพิ่มเพื่ออัปเกรดสมุดโทรศัพท์"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"กำลังอัปเกรดที่เก็บรายชื่อในสมุดโทรศัพท์"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"เลือกเพื่อทำการอัปเกรดให้สมบูรณ์"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"กำลังอัปเกรดฐานข้อมูลสมุดโทรศัพท์"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"ต้องใช้หน่วยความจำเพิ่มเพื่ออัปเกรดสมุดโทรศัพท์"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"กำลังอัปเกรดที่จัดเก็บข้อมูลสำหรับสมุดโทรศัพท์"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"แตะเพื่อทำการอัปเกรดให้สมบูรณ์"</string>
     <string name="default_directory" msgid="93961630309570294">"สมุดโทรศัพท์"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"อื่นๆ"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"เข้าถึงข้อความเสียงทั้งหมด"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"อนุญาตให้แอปพลิเคชันจัดเก็บและเรียกข้อความเสียงทั้งหมดที่อุปกรณ์นี้สามารถเข้าถึงได้"</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"อนุญาตให้แอปพลิเคชันจัดเก็บและเรียกข้อความเสียงทั้งหมดที่อุปกรณ์นี้สามารถเข้าถึงได้"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"ข้อความเสียงจาก "</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index eb88576..44f6b73 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Core Apps ng Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Imbakan ng Mga Contact"</string>
     <string name="provider_label" msgid="6012150850819899907">"Mga Contact"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Ina-upgrade ang database ng Mga Contact."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Nangangailangan ang pag-upgrade sa contact nang higit pang memory"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Pag-upgrade ng imbakan ng contact"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Piliing kumpletuhin ang pag-upgrade."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Ina-upgrade ang database ng mga contact."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Nangangailangan ng higit pang memory ang pag-upgrade sa mga contact."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Ina-upgrade ang storage para sa mga contact"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Pindutin upang kumpletuhin ang pag-upgrade."</string>
     <string name="default_directory" msgid="93961630309570294">"Mga Contact"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Iba pa"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"I-access ang lahat ng voicemail"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Binibigyang-daan ang application upang maimbak at mabawi ang lahat ng voicemail na naa-access ng device na ito."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Binibigyang-daan ang app upang iimbak at kuning muli ang lahat ng voicemail na naa-access ng device na ito."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Voicemail mula sa/kay "</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 3cc061a..672288a 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Çekirdek Uygulamaları"</string>
     <string name="app_label" msgid="3389954322874982620">"Kişi Deposu"</string>
     <string name="provider_label" msgid="6012150850819899907">"Kişiler"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Kişiler veritabanı yeni sürüme geçiriliyor."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Kişiyi yeni sürüme geçirmek için daha fazla bellek gerekiyor"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Kişi deposu yükseltiliyor"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Yeni sürüme geçmeyi tamamlamak için seçin."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Kişiler veritabanı yeni sürüme geçiriliyor."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Kişileri yeni sürüme geçirmek için daha fazla bellek gerekiyor."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Kişiler için depolama alanı yeni sürüme geçiriliyor"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Yeni sürüme geçmeyi tamamlamak için dokunun."</string>
     <string name="default_directory" msgid="93961630309570294">"Kişiler"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Diğer"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Tüm sesli mesajlara erişim"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Uygulamaya, bu cihazın erişebileceği tüm sesli mesajları depolama ve alma izni verir."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Uygulamaya, bu cihazın erişebileceği tüm sesli mesajları depolama ve alma izni verir."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Sesli mesaj gönderen: "</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 28e6148..1829219 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
     <string name="app_label" msgid="3389954322874982620">"Пам\'ять контактів"</string>
     <string name="provider_label" msgid="6012150850819899907">"Контакти"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Оновлення бази даних контактів."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Оновл. контакту потреб. більше пам\'яті"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Оновлення пам\'яті контактів"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Виберіть для заверш. оновлення."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Оновлення бази даних контактів."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Оновлення контактів потребує більше пам’яті."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Оновлення пам’яті для контактів"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Торкніться, щоб завершити оновлення."</string>
     <string name="default_directory" msgid="93961630309570294">"Контакти"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Інші"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Доступ до всієї голосової пошти"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Дозволяє програмі зберігати й отримувати всю голосову пошту, доступ до якої має цей пристрій."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Дозволяє програмі зберігати й отримувати всю голосову пошту, доступ до якої має цей пристрій."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Голосова пошта від "</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index d793fa9..431a403 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Ứng dụng lõi Android"</string>
     <string name="app_label" msgid="3389954322874982620">"Bộ nhớ Danh bạ"</string>
     <string name="provider_label" msgid="6012150850819899907">"Danh bạ"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Đang nâng cấp cơ sở dữ liệu Danh bạ."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Nâng cấp liên hệ cần thêm bộ nhớ"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Nâng cấp bộ nhớ liên hệ"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Chọn để hoàn tất nâng cấp."</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Đang nâng cấp cơ sở dữ liệu danh bạ."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Nâng cấp danh bạ cần thêm bộ nhớ."</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Đang nâng cấp dung lượng cho danh bạ"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Chạm để hoàn tất nâng cấp."</string>
     <string name="default_directory" msgid="93961630309570294">"Danh bạ"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Khác"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Truy cập tất cả các thư thoại"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Cho phép ứng dụng lưu trữ và truy xuất tất cả thư thoại mà thiết bị này có thể truy cập."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Cho phép ứng dụng lưu trữ và truy xuất tất cả thư thoại mà thiết bị này có thể truy cập."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Thư thoại từ "</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 554e401..5dd88e4 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android 核心应用程序"</string>
     <string name="app_label" msgid="3389954322874982620">"联系人存储"</string>
     <string name="provider_label" msgid="6012150850819899907">"联系人"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"正在升级联系人数据库。"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"联系人升级需要更多的存储空间"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"升级联系人时存储空间不足"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"请选择以完成升级。"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"正在升级联系人数据库。"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"联系人升级需要更多的存储空间。"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"正在升级存储器以容纳更多联系人"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"请触摸以完成升级。"</string>
     <string name="default_directory" msgid="93961630309570294">"联系人"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"其他"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"访问所有语音邮件"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"允许应用程序存储和检索此设备可访问的所有语音邮件。"</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"允许应用程序存储和检索此设备可访问的所有语音邮件。"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"语音邮件发件人 "</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 2d8761d..ba929c3 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Android 核心應用程式"</string>
     <string name="app_label" msgid="3389954322874982620">"聯絡人儲存空間"</string>
     <string name="provider_label" msgid="6012150850819899907">"聯絡人"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"正在升級聯絡人資料庫。"</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"需要更多記憶體才能將聯絡人升級"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"升級聯絡人儲存空間"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"選取以完成升級。"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"正在升級聯絡人資料庫。"</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"需要更多記憶體才能將聯絡人升級。"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"正在升級聯絡人儲存空間"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"輕觸即可完成升級。"</string>
     <string name="default_directory" msgid="93961630309570294">"聯絡人"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"其他"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"存取所有語音留言"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"允許應用程式儲存和擷取這個裝置可存取的所有語音留言。"</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"允許應用程式儲存及擷取這個裝置可存取的所有語音留言。"</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"語音郵件寄件者: "</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index b170638..76de636 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -19,13 +19,13 @@
     <string name="sharedUserLabel" msgid="8024311725474286801">"Izinhlelo Zokusebenza ze-Android Core"</string>
     <string name="app_label" msgid="3389954322874982620">"Isitoreji Sothintana Nabo"</string>
     <string name="provider_label" msgid="6012150850819899907">"Othintana nabo"</string>
-    <string name="upgrade_msg" msgid="6174884195179549239">"Ukufaka ezakamuva kwimininingo egciniwe yothintana naye."</string>
-    <string name="upgrade_out_of_memory_notification_ticker" msgid="4089605622758004662">"Ukuthuthukisa othintana naye kudinga enye imemori"</string>
-    <string name="upgrade_out_of_memory_notification_title" msgid="7849508493764133004">"Ithuthukisa isitoreji sothintana naye"</string>
-    <string name="upgrade_out_of_memory_notification_text" msgid="3967762223137708403">"Khetha ukuqedela ukuthuthukisa"</string>
+    <string name="upgrade_msg" msgid="8640807392794309950">"Ukufaka ezakamuva kwimininingo egciniwe yothintana naye."</string>
+    <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Ukuthuthukisa othintana naye kudinga enye imemori"</string>
+    <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Ukuthuthukiswa kwesilondolozi soxhumana nabo"</string>
+    <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Thinta ukuqedela ukuthuthukisa."</string>
     <string name="default_directory" msgid="93961630309570294">"Othintana nabo"</string>
     <string name="local_invisible_directory" msgid="705244318477396120">"Okunye"</string>
     <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Finyelela kuwo wonke amavoyisimeyili"</string>
-    <string name="read_write_all_voicemail_description" msgid="2249895806470926882">"Ivumela uhlelo olusebenzayo lulonde futhi lulande wonke ama-imeyli ezwi ledivayisi engakwazi ukuwafinyelela."</string>
+    <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Ivumela uhlelo olusebenzayo lulonde futhi lulande wonke ama-imeyli ezwi ledivayisi engakwazi ukuwafinyelela."</string>
     <string name="voicemail_from_column" msgid="435732568832121444">"Imeyili yezwi kusuka "</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index bc14294..aaa7f44 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -27,16 +27,16 @@
     <string name="provider_label">Contacts</string>
 
     <!-- [CHAR LIMIT=NONE] Boot message while upgrading contacts. -->
-    <string name="upgrade_msg">Upgrading Contacts database.</string>
+    <string name="upgrade_msg">Upgrading contacts database.</string>
 
     <!-- Ticker for the notification shown when updating contacts fails because of memory shortage -->
-    <string name="upgrade_out_of_memory_notification_ticker">Contact upgrade needs more memory</string>
+    <string name="upgrade_out_of_memory_notification_ticker">Contacts upgrade needs more memory.</string>
 
     <!-- Title for the notification shown when updating contacts fails because of memory shortage -->
-    <string name="upgrade_out_of_memory_notification_title">Upgrading contact storage</string>
+    <string name="upgrade_out_of_memory_notification_title">Upgrading storage for contacts</string>
 
     <!-- Text for the notification shown when updating contacts fails because of memory shortage -->
-    <string name="upgrade_out_of_memory_notification_text">Select to complete the upgrade.</string>
+    <string name="upgrade_out_of_memory_notification_text">Touch to complete the upgrade.</string>
 
     <!-- The name of the default contact directory -->
     <string name="default_directory">Contacts</string>
@@ -49,7 +49,7 @@
     <string name="read_write_all_voicemail_label">Access all voicemails</string>
     <!-- Description of an application permission, listed so the user can choose whether
          they want to allow the application to do this. [CHAR LIMIT=NONE] -->
-    <string name="read_write_all_voicemail_description">Allows the application to store and retrieve
+    <string name="read_write_all_voicemail_description">Allows the app to store and retrieve
         all voicemails that this device can access.</string>
 
     <!-- The prefix string before the number used for the display name for the voicemail table.
diff --git a/src/com/android/providers/contacts/CallLogProvider.java b/src/com/android/providers/contacts/CallLogProvider.java
index 3c39625..89ae591 100644
--- a/src/com/android/providers/contacts/CallLogProvider.java
+++ b/src/com/android/providers/contacts/CallLogProvider.java
@@ -46,7 +46,7 @@
 public class CallLogProvider extends ContentProvider {
     /** Selection clause to use to exclude voicemail records.  */
     private static final String EXCLUDE_VOICEMAIL_SELECTION = getInequalityClause(
-            Calls.TYPE, Integer.toString(Calls.VOICEMAIL_TYPE));
+            Calls.TYPE, Calls.VOICEMAIL_TYPE);
 
     private static final int CALLS = 1;
 
@@ -320,10 +320,9 @@
     * matches CALLS_ID. For other uri types the behaviour is undefined.
     * @throws IllegalArgumentException if the id included in the Uri is not a valid long value.
     */
-    private String parseCallIdFromUri(Uri uri) {
+    private long parseCallIdFromUri(Uri uri) {
         try {
-            Long id = Long.valueOf(uri.getPathSegments().get(1));
-            return id.toString();
+            return Long.parseLong(uri.getPathSegments().get(1));
         } catch (NumberFormatException e) {
             throw new IllegalArgumentException("Invalid call id in uri: " + uri, e);
         }
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index f5f1a6a..fb1aec9 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -422,11 +422,6 @@
         public static final String GROUP_ROW_ID = GroupMembership.GROUP_ROW_ID;
     }
 
-    public interface PhoneColumns {
-        public static final String NORMALIZED_NUMBER = Data.DATA4;
-        public static final String CONCRETE_NORMALIZED_NUMBER = DataColumns.CONCRETE_DATA4;
-    }
-
     public interface GroupsColumns {
         public static final String PACKAGE_ID = "package_id";
 
@@ -4377,21 +4372,31 @@
     }
 
     /**
+     * Test if the given column appears in the given projection.
+     */
+    public static boolean isInProjection(String[] projection, String column) {
+        if (projection == null) {
+            return true; // Null means "all columns".  We can't really tell if it's in there...
+        }
+        for (String test : projection) {
+            if (column.equals(test)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
      * Test if any of the columns appear in the given projection.
      */
-    public boolean isInProjection(String[] projection, String... columns) {
+    public static boolean isInProjection(String[] projection, String... columns) {
         if (projection == null) {
             return true;
         }
 
         // Optimized for a single-column test
         if (columns.length == 1) {
-            String column = columns[0];
-            for (String test : projection) {
-                if (column.equals(test)) {
-                    return true;
-                }
-            }
+            return isInProjection(projection, columns[0]);
         } else {
             for (String test : projection) {
                 for (String column : columns) {
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 59b2170..c4a8a81 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -16,6 +16,7 @@
 
 package com.android.providers.contacts;
 
+import com.android.common.content.ProjectionMap;
 import com.android.common.content.SyncStateContentProviderHelper;
 import com.android.providers.contacts.ContactAggregator.AggregationSuggestionParameter;
 import com.android.providers.contacts.ContactLookupKey.LookupKeySegment;
@@ -30,7 +31,6 @@
 import com.android.providers.contacts.ContactsDatabaseHelper.Joins;
 import com.android.providers.contacts.ContactsDatabaseHelper.NameLookupColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.NameLookupType;
-import com.android.providers.contacts.ContactsDatabaseHelper.PhoneColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.PhoneLookupColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.PhotoFilesColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.PresenceColumns;
@@ -44,6 +44,7 @@
 import com.android.providers.contacts.ContactsDatabaseHelper.Views;
 import com.android.providers.contacts.SearchIndexManager.FtsQueryBuilder;
 import com.android.providers.contacts.util.DbQueryUtils;
+import com.android.providers.contacts.util.NeededForTesting;
 import com.android.vcard.VCardComposer;
 import com.android.vcard.VCardConfig;
 import com.google.android.collect.Lists;
@@ -54,9 +55,6 @@
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.OnAccountsUpdateListener;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
 import android.app.SearchManager;
 import android.content.ContentProviderOperation;
 import android.content.ContentProviderResult;
@@ -65,7 +63,6 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.IContentService;
-import android.content.Intent;
 import android.content.OperationApplicationException;
 import android.content.SharedPreferences;
 import android.content.SyncAdapterType;
@@ -77,10 +74,7 @@
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
 import android.database.AbstractCursor;
-import android.database.CrossProcessCursor;
 import android.database.Cursor;
-import android.database.CursorWindow;
-import android.database.CursorWrapper;
 import android.database.DatabaseUtils;
 import android.database.MatrixCursor;
 import android.database.MatrixCursor.RowBuilder;
@@ -128,7 +122,6 @@
 import android.provider.ContactsContract.Directory;
 import android.provider.ContactsContract.DisplayPhoto;
 import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.Intents;
 import android.provider.ContactsContract.PhoneLookup;
 import android.provider.ContactsContract.PhotoFiles;
 import android.provider.ContactsContract.Profile;
@@ -182,7 +175,6 @@
 
     private static final int BACKGROUND_TASK_INITIALIZE = 0;
     private static final int BACKGROUND_TASK_OPEN_WRITE_ACCESS = 1;
-    private static final int BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS = 2;
     private static final int BACKGROUND_TASK_UPDATE_ACCOUNTS = 3;
     private static final int BACKGROUND_TASK_UPDATE_LOCALE = 4;
     private static final int BACKGROUND_TASK_UPGRADE_AGGREGATION_ALGORITHM = 5;
@@ -212,13 +204,6 @@
      */
     private static final String PREAUTHORIZED_URI_TOKEN = "perm_token";
 
-    /**
-     * Property key for the legacy contact import version. The need for a version
-     * as opposed to a boolean flag is that if we discover bugs in the contact import process,
-     * we can trigger re-import by incrementing the import version.
-     */
-    private static final String PROPERTY_CONTACTS_IMPORTED = "contacts_imported_v1";
-    private static final int PROPERTY_CONTACTS_IMPORT_VERSION = 1;
     private static final String PREF_LOCALE = "locale";
 
     private static final String PROPERTY_AGGREGATION_ALGORITHM = "aggregation_v2";
@@ -283,8 +268,8 @@
 
     private static final int RAW_CONTACTS = 2002;
     private static final int RAW_CONTACTS_ID = 2003;
-    private static final int RAW_CONTACTS_DATA = 2004;
-    private static final int RAW_CONTACT_ENTITY_ID = 2005;
+    private static final int RAW_CONTACTS_ID_DATA = 2004;
+    private static final int RAW_CONTACT_ID_ENTITY = 2005;
     private static final int RAW_CONTACTS_ID_DISPLAY_PHOTO = 2006;
     private static final int RAW_CONTACTS_ID_STREAM_ITEMS = 2007;
     private static final int RAW_CONTACTS_ID_STREAM_ITEMS_ID = 2008;
@@ -300,6 +285,9 @@
     private static final int EMAILS_FILTER = 3008;
     private static final int POSTALS = 3009;
     private static final int POSTALS_ID = 3010;
+    private static final int CALLABLES = 3011;
+    private static final int CALLABLES_ID = 3012;
+    private static final int CALLABLES_FILTER = 3013;
 
     private static final int PHONE_LOOKUP = 4000;
 
@@ -357,7 +345,7 @@
     private static final int STREAM_ITEMS_ID_PHOTOS_ID = 21004;
     private static final int STREAM_ITEMS_LIMIT = 21005;
 
-    private static final int DISPLAY_PHOTO = 22000;
+    private static final int DISPLAY_PHOTO_ID = 22000;
     private static final int PHOTO_DIMENSIONS = 22001;
 
     // Inserts into URIs in this map will direct to the profile database if the parent record's
@@ -366,7 +354,7 @@
     private static final Map<Integer, String> INSERT_URI_ID_VALUE_MAP = Maps.newHashMap();
     static {
         INSERT_URI_ID_VALUE_MAP.put(DATA, Data.RAW_CONTACT_ID);
-        INSERT_URI_ID_VALUE_MAP.put(RAW_CONTACTS_DATA, Data.RAW_CONTACT_ID);
+        INSERT_URI_ID_VALUE_MAP.put(RAW_CONTACTS_ID_DATA, Data.RAW_CONTACT_ID);
         INSERT_URI_ID_VALUE_MAP.put(STATUS_UPDATES, StatusUpdates.DATA_ID);
         INSERT_URI_ID_VALUE_MAP.put(STREAM_ITEMS, StreamItems.RAW_CONTACT_ID);
         INSERT_URI_ID_VALUE_MAP.put(RAW_CONTACTS_ID_STREAM_ITEMS, StreamItems.RAW_CONTACT_ID);
@@ -502,22 +490,22 @@
 
     /*
      * Sorting order for email address suggestions: first starred, then the rest.
-     * second in_visible_group, then the rest.
-     * Within the four (starred/unstarred, in_visible_group/not-in_visible_group) groups
-     * - three buckets: very recently contacted, then fairly
-     * recently contacted, then the rest.  Within each of the bucket - descending count
-     * of times contacted (both for data row and for contact row). If all else fails, alphabetical.
+     * Within the two groups:
+     * - three buckets: very recently contacted, then fairly recently contacted, then the rest.
+     * Within each of the bucket - descending count of times contacted (both for data row and for
+     * contact row).
+     * If all else fails, in_visible_group, alphabetical.
      * (Super)primary email address is returned before other addresses for the same contact.
      */
     private static final String EMAIL_FILTER_SORT_ORDER =
         Contacts.STARRED + " DESC, "
-        + Contacts.IN_VISIBLE_GROUP + " DESC, "
         + "(CASE WHEN " + TIME_SINCE_LAST_USED + " < " + EMAIL_FILTER_CURRENT
         + " THEN 0 "
                 + " WHEN " + TIME_SINCE_LAST_USED + " < " + EMAIL_FILTER_RECENT
         + " THEN 1 "
         + " ELSE 2 END), "
         + DataUsageStatColumns.TIMES_USED + " DESC, "
+        + Contacts.IN_VISIBLE_GROUP + " DESC, "
         + Contacts.DISPLAY_NAME + ", "
         + Data.CONTACT_ID + ", "
         + Data.IS_SUPER_PRIMARY + " DESC, "
@@ -887,6 +875,8 @@
      * Note {@link Groups#SUMMARY_COUNT} doesn't exist in groups/view_groups.
      * When we detect this column being requested, we join {@link Joins#GROUP_MEMBER_COUNT} to
      * generate it.
+     *
+     * TODO Support SUMMARY_GROUP_COUNT_PER_ACCOUNT too.  See also queryLocal().
      */
     private static final ProjectionMap sGroupsSummaryProjectionMap = ProjectionMap.builder()
             .addAll(sGroupsProjectionMap)
@@ -895,27 +885,7 @@
                     "(SELECT COUNT(" + ContactsColumns.CONCRETE_ID + ") FROM "
                         + Tables.CONTACTS_JOIN_RAW_CONTACTS_DATA_FILTERED_BY_GROUPMEMBERSHIP
                         + " WHERE " + Contacts.HAS_PHONE_NUMBER + ")")
-            .build();
-
-    // This is only exposed as hidden API for the contacts app, so we can be very specific in
-    // the filtering
-    private static final ProjectionMap sGroupsSummaryProjectionMapWithGroupCountPerAccount =
-            ProjectionMap.builder()
-            .addAll(sGroupsSummaryProjectionMap)
-            .add(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
-                    "(SELECT COUNT(*) FROM " + Views.GROUPS + " WHERE "
-                        + "(" + Groups.ACCOUNT_NAME + "="
-                            + GroupsColumns.CONCRETE_ACCOUNT_NAME
-                            + " AND "
-                            + Groups.ACCOUNT_TYPE + "=" + GroupsColumns.CONCRETE_ACCOUNT_TYPE
-                            + " AND "
-                            + Groups.DELETED + "=0 AND "
-                            + Groups.FAVORITES + "=0 AND "
-                            + Groups.AUTO_ADD + "=0"
-                        + ")"
-                        + " GROUP BY "
-                            + Groups.ACCOUNT_NAME + ", " + Groups.ACCOUNT_TYPE
-                   + ")")
+            .add(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, "0") // Always returns 0 for now.
             .build();
 
     /** Contains the agg_exceptions columns */
@@ -1063,13 +1033,13 @@
     private static final String DEFAULT_SNIPPET_ARG_ELLIPSIS = "...";
     private static final int DEFAULT_SNIPPET_ARG_MAX_TOKENS = -10;
 
-    private boolean sIsPhoneInitialized;
-    private boolean sIsPhone;
+    private boolean mIsPhoneInitialized;
+    private boolean mIsPhone;
 
-    private StringBuilder mSb = new StringBuilder();
-    private String[] mSelectionArgs1 = new String[1];
-    private String[] mSelectionArgs2 = new String[2];
-    private ArrayList<String> mSelectionArgs = Lists.newArrayList();
+    private final StringBuilder mSb = new StringBuilder();
+    private final String[] mSelectionArgs1 = new String[1];
+    private final String[] mSelectionArgs2 = new String[2];
+    private final ArrayList<String> mSelectionArgs = Lists.newArrayList();
 
     private Account mAccount;
 
@@ -1129,10 +1099,10 @@
 
         matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts", RAW_CONTACTS);
         matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#", RAW_CONTACTS_ID);
-        matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/data", RAW_CONTACTS_DATA);
+        matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/data", RAW_CONTACTS_ID_DATA);
         matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/display_photo",
                 RAW_CONTACTS_ID_DISPLAY_PHOTO);
-        matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/entity", RAW_CONTACT_ENTITY_ID);
+        matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/entity", RAW_CONTACT_ID_ENTITY);
         matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/stream_items",
                 RAW_CONTACTS_ID_STREAM_ITEMS);
         matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/stream_items/#",
@@ -1156,6 +1126,10 @@
         matcher.addURI(ContactsContract.AUTHORITY, "data/postals/#", POSTALS_ID);
         /** "*" is in CSV form with data ids ("123,456,789") */
         matcher.addURI(ContactsContract.AUTHORITY, "data/usagefeedback/*", DATA_USAGE_FEEDBACK_ID);
+        matcher.addURI(ContactsContract.AUTHORITY, "data/callables/", CALLABLES);
+        matcher.addURI(ContactsContract.AUTHORITY, "data/callables/#", CALLABLES_ID);
+        matcher.addURI(ContactsContract.AUTHORITY, "data/callables/filter", CALLABLES_FILTER);
+        matcher.addURI(ContactsContract.AUTHORITY, "data/callables/filter/*", CALLABLES_FILTER);
 
         matcher.addURI(ContactsContract.AUTHORITY, "groups", GROUPS);
         matcher.addURI(ContactsContract.AUTHORITY, "groups/#", GROUPS_ID);
@@ -1222,7 +1196,7 @@
                 STREAM_ITEMS_ID_PHOTOS_ID);
         matcher.addURI(ContactsContract.AUTHORITY, "stream_items_limit", STREAM_ITEMS_LIMIT);
 
-        matcher.addURI(ContactsContract.AUTHORITY, "display_photo/#", DISPLAY_PHOTO);
+        matcher.addURI(ContactsContract.AUTHORITY, "display_photo/#", DISPLAY_PHOTO_ID);
         matcher.addURI(ContactsContract.AUTHORITY, "photo_dimensions", PHOTO_DIMENSIONS);
 
         HashMap<String, Integer> tmpTypeMap = new HashMap<String, Integer>();
@@ -1335,8 +1309,8 @@
     // The active transaction context will switch depending on the operation being performed.
     // Both transaction contexts will be cleared out when a batch transaction is started, and
     // each will be processed separately when a batch transaction completes.
-    private TransactionContext mContactTransactionContext = new TransactionContext(false);
-    private TransactionContext mProfileTransactionContext = new TransactionContext(true);
+    private final TransactionContext mContactTransactionContext = new TransactionContext(false);
+    private final TransactionContext mProfileTransactionContext = new TransactionContext(true);
     private final ThreadLocal<TransactionContext> mTransactionContext =
             new ThreadLocal<TransactionContext>();
 
@@ -1344,18 +1318,18 @@
     private long mPreAuthorizedUriDuration;
 
     // Map of single-use pre-authorized URIs to expiration times.
-    private Map<Uri, Long> mPreAuthorizedUris = Maps.newHashMap();
+    private final Map<Uri, Long> mPreAuthorizedUris = Maps.newHashMap();
 
     // Random number generator.
-    private SecureRandom mRandom = new SecureRandom();
+    private final SecureRandom mRandom = new SecureRandom();
 
     private LegacyApiSupport mLegacyApiSupport;
     private GlobalSearchSupport mGlobalSearchSupport;
     private CommonNicknameCache mCommonNicknameCache;
     private SearchIndexManager mSearchIndexManager;
 
-    private ContentValues mValues = new ContentValues();
-    private HashMap<String, Boolean> mAccountWritability = Maps.newHashMap();
+    private final ContentValues mValues = new ContentValues();
+    private final HashMap<String, Boolean> mAccountWritability = Maps.newHashMap();
 
     private int mProviderStatus = ProviderStatus.STATUS_NORMAL;
     private boolean mProviderStatusUpdateNeeded;
@@ -1387,6 +1361,12 @@
             return initialize();
         } catch (RuntimeException e) {
             Log.e(TAG, "Cannot start provider", e);
+            // In production code we don't want to throw here, so that phone will still work
+            // in low storage situations.
+            // See I5c88a3024ff1c5a06b5756b29a2d903f8f6a2531
+            if (shouldThrowExceptionForInitializationError()) {
+                throw e;
+            }
             return false;
         } finally {
             if (Log.isLoggable(Constants.PERFORMANCE_TAG, Log.DEBUG)) {
@@ -1395,6 +1375,10 @@
         }
     }
 
+    protected boolean shouldThrowExceptionForInitializationError() {
+        return false;
+    }
+
     private boolean initialize() {
         StrictMode.setThreadPolicy(
                 new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());
@@ -1444,7 +1428,6 @@
                 DEFAULT_PREAUTHORIZED_URI_EXPIRATION);
 
         scheduleBackgroundTask(BACKGROUND_TASK_INITIALIZE);
-        scheduleBackgroundTask(BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS);
         scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_ACCOUNTS);
         scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_LOCALE);
         scheduleBackgroundTask(BACKGROUND_TASK_UPGRADE_AGGREGATION_ALGORITHM);
@@ -1521,10 +1504,8 @@
                 new DataRowHandlerForNote(context, dbHelper, contactAggregator));
     }
 
-    /**
-     * Visible for testing.
-     */
-    /* package */ PhotoPriorityResolver createPhotoPriorityResolver(Context context) {
+    @VisibleForTesting
+    PhotoPriorityResolver createPhotoPriorityResolver(Context context) {
         return new PhotoPriorityResolver(context);
     }
 
@@ -1553,13 +1534,6 @@
                 break;
             }
 
-            case BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS: {
-                if (isLegacyContactImportNeeded()) {
-                    importLegacyContactsInBackground();
-                }
-                break;
-            }
-
             case BACKGROUND_TASK_UPDATE_ACCOUNTS: {
                 Context context = getContext();
                 if (!mAccountUpdateListenerRegistered) {
@@ -1725,7 +1699,7 @@
         }
     }
 
-    /* Visible for testing */
+    @VisibleForTesting
     protected void cleanupPhotoStore() {
         SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
         mActiveDb.set(db);
@@ -1752,32 +1726,23 @@
 
         // Also query for all social stream item photos.
         c = db.query(Tables.STREAM_ITEM_PHOTOS + " JOIN " + Tables.STREAM_ITEMS
-                + " ON " + StreamItemPhotos.STREAM_ITEM_ID + "=" + StreamItemsColumns.CONCRETE_ID
-                + " JOIN " + Tables.RAW_CONTACTS
-                + " ON " + StreamItems.RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID,
+                + " ON " + StreamItemPhotos.STREAM_ITEM_ID + "=" + StreamItemsColumns.CONCRETE_ID,
                 new String[]{
                         StreamItemPhotosColumns.CONCRETE_ID,
                         StreamItemPhotosColumns.CONCRETE_STREAM_ITEM_ID,
-                        StreamItemPhotos.PHOTO_FILE_ID,
-                        RawContacts.ACCOUNT_TYPE,
-                        RawContacts.ACCOUNT_NAME
+                        StreamItemPhotos.PHOTO_FILE_ID
                 },
                 null, null, null, null, null);
         Map<Long, Long> photoFileIdToStreamItemPhotoId = Maps.newHashMap();
         Map<Long, Long> streamItemPhotoIdToStreamItemId = Maps.newHashMap();
-        Map<Long, Account> streamItemPhotoIdToAccount = Maps.newHashMap();
         try {
             while (c.moveToNext()) {
                 long streamItemPhotoId = c.getLong(0);
                 long streamItemId = c.getLong(1);
                 long photoFileId = c.getLong(2);
-                String accountType = c.getString(3);
-                String accountName = c.getString(4);
                 usedPhotoFileIds.add(photoFileId);
                 photoFileIdToStreamItemPhotoId.put(photoFileId, streamItemPhotoId);
                 streamItemPhotoIdToStreamItemId.put(streamItemPhotoId, streamItemId);
-                Account account = new Account(accountName, accountType);
-                streamItemPhotoIdToAccount.put(photoFileId, account);
             }
         } finally {
             c.close();
@@ -1857,12 +1822,12 @@
         return mNameLookupBuilder;
     }
 
-    /* Visible for testing */
+    @VisibleForTesting
     public ContactDirectoryManager getContactDirectoryManagerForTest() {
         return mContactDirectoryManager;
     }
 
-    /* Visible for testing */
+    @VisibleForTesting
     protected Locale getLocale() {
         return Locale.getDefault();
     }
@@ -1872,99 +1837,11 @@
         return profileMode != null && profileMode;
     }
 
-    protected boolean isLegacyContactImportNeeded() {
-        int version = Integer.parseInt(
-                mContactsHelper.getProperty(PROPERTY_CONTACTS_IMPORTED, "0"));
-        return version < PROPERTY_CONTACTS_IMPORT_VERSION;
-    }
-
-    protected LegacyContactImporter getLegacyContactImporter() {
-        return new LegacyContactImporter(getContext(), this);
-    }
-
-    /**
-     * Imports legacy contacts as a background task.
-     */
-    private void importLegacyContactsInBackground() {
-        Log.v(TAG, "Importing legacy contacts");
-        setProviderStatus(ProviderStatus.STATUS_UPGRADING);
-
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
-        mContactsHelper.setLocale(this, mCurrentLocale);
-        prefs.edit().putString(PREF_LOCALE, mCurrentLocale.toString()).commit();
-
-        LegacyContactImporter importer = getLegacyContactImporter();
-        if (importLegacyContacts(importer)) {
-            onLegacyContactImportSuccess();
-        } else {
-            onLegacyContactImportFailure();
-        }
-    }
-
-    /**
-     * Unlocks the provider and declares that the import process is complete.
-     */
-    private void onLegacyContactImportSuccess() {
-        NotificationManager nm =
-            (NotificationManager)getContext().getSystemService(Context.NOTIFICATION_SERVICE);
-        nm.cancel(LEGACY_IMPORT_FAILED_NOTIFICATION);
-
-        // Store a property in the database indicating that the conversion process succeeded
-        mContactsHelper.setProperty(PROPERTY_CONTACTS_IMPORTED,
-                String.valueOf(PROPERTY_CONTACTS_IMPORT_VERSION));
-        setProviderStatus(ProviderStatus.STATUS_NORMAL);
-        Log.v(TAG, "Completed import of legacy contacts");
-    }
-
-    /**
-     * Announces the provider status and keeps the provider locked.
-     */
-    private void onLegacyContactImportFailure() {
-        Context context = getContext();
-        NotificationManager nm =
-            (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
-
-        // Show a notification
-        Notification n = new Notification(android.R.drawable.stat_notify_error,
-                context.getString(R.string.upgrade_out_of_memory_notification_ticker),
-                System.currentTimeMillis());
-        n.setLatestEventInfo(context,
-                context.getString(R.string.upgrade_out_of_memory_notification_title),
-                context.getString(R.string.upgrade_out_of_memory_notification_text),
-                PendingIntent.getActivity(context, 0, new Intent(Intents.UI.LIST_DEFAULT), 0));
-        n.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;
-
-        nm.notify(LEGACY_IMPORT_FAILED_NOTIFICATION, n);
-
-        setProviderStatus(ProviderStatus.STATUS_UPGRADE_OUT_OF_MEMORY);
-        Log.v(TAG, "Failed to import legacy contacts");
-
-        // Do not let any database changes until this issue is resolved.
-        mOkToOpenAccess = false;
-    }
-
-    /* Visible for testing */
-    /* package */ boolean importLegacyContacts(LegacyContactImporter importer) {
-        boolean aggregatorEnabled = mContactAggregator.isEnabled();
-        mContactAggregator.setEnabled(false);
-        try {
-            if (importer.importContacts()) {
-
-                // TODO aggregate all newly added raw contacts
-                mContactAggregator.setEnabled(aggregatorEnabled);
-                return true;
-            }
-        } catch (Throwable e) {
-           Log.e(TAG, "Legacy contact import failed", e);
-        }
-        mEstimatedStorageRequirement = importer.getEstimatedStorageRequirement();
-        return false;
-    }
-
     /**
      * Wipes all data from the contacts database.
      */
-    /* package */ void wipeData() {
+    @NeededForTesting
+    void wipeData() {
         mContactsHelper.wipeData();
         mProfileHelper.wipeData();
         mContactsPhotoStore.clear();
@@ -2082,18 +1959,11 @@
     @Override
     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
         if (mWriteAccessLatch != null) {
-            // We are stuck trying to upgrade contacts db.  The only update request
-            // allowed in this case is an update of provider status, which will trigger
-            // an attempt to upgrade contacts again.
+            // Update on PROVIDER_STATUS used to be used as a trigger to re-start legacy contact
+            // import.  Now that we no longer support it, we just ignore it.
             int match = sUriMatcher.match(uri);
             if (match == PROVIDER_STATUS) {
-                Integer newStatus = values.getAsInteger(ProviderStatus.STATUS);
-                if (newStatus != null && newStatus == ProviderStatus.STATUS_UPGRADING) {
-                    scheduleBackgroundTask(BACKGROUND_TASK_IMPORT_LEGACY_CONTACTS);
-                    return 1;
-                } else {
-                    return 0;
-                }
+                return 0;
             }
         }
         waitForAccess(mWriteAccessLatch);
@@ -2416,9 +2286,9 @@
                 break;
             }
 
-            case RAW_CONTACTS_DATA:
+            case RAW_CONTACTS_ID_DATA:
             case PROFILE_RAW_CONTACTS_ID_DATA: {
-                int segment = match == RAW_CONTACTS_DATA ? 1 : 2;
+                int segment = match == RAW_CONTACTS_ID_DATA ? 1 : 2;
                 values.put(Data.RAW_CONTACT_ID, uri.getPathSegments().get(segment));
                 id = insertData(values, callerIsSyncAdapter);
                 mSyncToNetwork |= !callerIsSyncAdapter;
@@ -3580,6 +3450,7 @@
             case DATA_ID:
             case PHONES_ID:
             case EMAILS_ID:
+            case CALLABLES_ID:
             case POSTALS_ID:
             case PROFILE_DATA_ID: {
                 long dataId = ContentUris.parseId(uri);
@@ -3904,9 +3775,9 @@
                 break;
             }
 
-            case RAW_CONTACTS_DATA:
+            case RAW_CONTACTS_ID_DATA:
             case PROFILE_RAW_CONTACTS_ID_DATA: {
-                int segment = match == RAW_CONTACTS_DATA ? 1 : 2;
+                int segment = match == RAW_CONTACTS_ID_DATA ? 1 : 2;
                 final String rawContactId = uri.getPathSegments().get(segment);
                 String selectionWithId = (Data.RAW_CONTACT_ID + "=" + rawContactId + " ")
                     + (selection == null ? "" : " AND " + selection);
@@ -3929,6 +3800,7 @@
             case DATA_ID:
             case PHONES_ID:
             case EMAILS_ID:
+            case CALLABLES_ID:
             case POSTALS_ID: {
                 count = updateData(uri, values, selection, selectionArgs, callerIsSyncAdapter);
                 if (count > 0) {
@@ -4523,7 +4395,7 @@
         scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_ACCOUNTS);
     }
 
-    protected boolean updateAccountsInBackground(Account[] accounts) {
+    private boolean updateAccountsInBackground(Account[] accounts) {
         // TODO : Check the unit test.
         boolean accountsChanged = false;
         SQLiteDatabase db = mDbHelper.get().getWritableDatabase();
@@ -4836,11 +4708,14 @@
             return null;
         }
 
-        CrossProcessCursor crossProcessCursor = getCrossProcessCursor(cursor);
-        if (crossProcessCursor != null) {
-            return addSnippetExtrasToCursor(uri, cursor);
-        } else {
-            return matrixCursorFromCursor(addSnippetExtrasToCursor(uri, cursor));
+        // Load the cursor contents into a memory cursor (backed by a cursor window) and close the
+        // underlying cursor.
+        try {
+            MemoryCursor memCursor = new MemoryCursor(null, cursor.getColumnNames());
+            memCursor.fillFromCursor(cursor);
+            return memCursor;
+        } finally {
+            cursor.close();
         }
     }
 
@@ -4851,23 +4726,7 @@
             return cursor;
         }
 
-        // Parse out snippet arguments for use when snippets are retrieved from the cursor.
-        String[] args = null;
-        String snippetArgs =
-                getQueryParameter(uri, SearchSnippetColumns.SNIPPET_ARGS_PARAM_KEY);
-        if (snippetArgs != null) {
-            args = snippetArgs.split(",");
-        }
-
         String query = uri.getLastPathSegment();
-        String startMatch = args != null && args.length > 0 ? args[0]
-                : DEFAULT_SNIPPET_ARG_START_MATCH;
-        String endMatch = args != null && args.length > 1 ? args[1]
-                : DEFAULT_SNIPPET_ARG_END_MATCH;
-        String ellipsis = args != null && args.length > 2 ? args[2]
-                : DEFAULT_SNIPPET_ARG_ELLIPSIS;
-        int maxTokens = args != null && args.length > 3 ? Integer.parseInt(args[3])
-                : DEFAULT_SNIPPET_ARG_MAX_TOKENS;
 
         // Snippet data is needed for the snippeting on the client side, so store it in the cursor
         if (cursor instanceof AbstractCursor && deferredSnippetingRequested(uri)){
@@ -4896,31 +4755,6 @@
         return cursor;
     }
 
-    private CrossProcessCursor getCrossProcessCursor(Cursor cursor) {
-        Cursor c = cursor;
-        if (c instanceof CrossProcessCursor) {
-            return (CrossProcessCursor) c;
-        } else if (c instanceof CursorWindow) {
-            return getCrossProcessCursor(((CursorWrapper) c).getWrappedCursor());
-        } else {
-            return null;
-        }
-    }
-
-    public MatrixCursor matrixCursorFromCursor(Cursor cursor) {
-        MatrixCursor newCursor = new MatrixCursor(cursor.getColumnNames());
-        int numColumns = cursor.getColumnCount();
-        String data[] = new String[numColumns];
-        cursor.moveToPosition(-1);
-        while (cursor.moveToNext()) {
-            for (int i = 0; i < numColumns; i++) {
-                data[i] = cursor.getString(i);
-            }
-            newCursor.addRow(data);
-        }
-        return newCursor;
-    }
-
     private static final class DirectoryQuery {
         public static final String[] COLUMNS = new String[] {
                 Directory._ID,
@@ -4971,17 +4805,6 @@
         }
     }
 
-    private boolean hasColumn(String[] projection, String column) {
-        if (projection == null) {
-            return true; // Null projection means "all columns".
-        }
-
-        for (int i = 0; i < projection.length; i++) {
-            if (column.equalsIgnoreCase(projection[i])) return true;
-        }
-        return false;
-    }
-
     protected Cursor queryLocal(Uri uri, String[] projection, String selection,
             String[] selectionArgs, String sortOrder, long directoryId) {
         if (VERBOSE_LOGGING) {
@@ -5433,10 +5256,19 @@
                 return cursor;
             }
 
-            case PHONES: {
+            case PHONES:
+            case CALLABLES: {
+                final String mimeTypeIsPhoneExpression =
+                        DataColumns.MIMETYPE_ID + "=" + mDbHelper.get().getMimeTypeIdForPhone();
+                final String mimeTypeIsSipExpression =
+                        DataColumns.MIMETYPE_ID + "=" + mDbHelper.get().getMimeTypeIdForSip();
                 setTablesAndProjectionMapForData(qb, uri, projection, false);
-                qb.appendWhere(" AND " + DataColumns.MIMETYPE_ID + "=" +
-                        mDbHelper.get().getMimeTypeIdForPhone());
+                if (match == CALLABLES) {
+                    qb.appendWhere(" AND ((" + mimeTypeIsPhoneExpression +
+                            ") OR (" + mimeTypeIsSipExpression + "))");
+                } else {
+                    qb.appendWhere(" AND " + mimeTypeIsPhoneExpression);
+                }
 
                 final boolean removeDuplicates = readBooleanQueryParameter(
                         uri, ContactsContract.REMOVE_DUPLICATE_ENTRIES, false);
@@ -5456,31 +5288,50 @@
                 break;
             }
 
-            case PHONES_ID: {
+            case PHONES_ID:
+            case CALLABLES_ID: {
+                final String mimeTypeIsPhoneExpression =
+                        DataColumns.MIMETYPE_ID + "=" + mDbHelper.get().getMimeTypeIdForPhone();
+                final String mimeTypeIsSipExpression =
+                        DataColumns.MIMETYPE_ID + "=" + mDbHelper.get().getMimeTypeIdForSip();
                 setTablesAndProjectionMapForData(qb, uri, projection, false);
                 selectionArgs = insertSelectionArg(selectionArgs, uri.getLastPathSegment());
-                qb.appendWhere(" AND " + DataColumns.MIMETYPE_ID + " = "
-                        + mDbHelper.get().getMimeTypeIdForPhone());
+                if (match == CALLABLES_ID) {
+                    qb.appendWhere(" AND ((" + mimeTypeIsPhoneExpression +
+                            ") OR (" + mimeTypeIsSipExpression + "))");
+                } else {
+                    qb.appendWhere(" AND " + mimeTypeIsPhoneExpression);
+                }
                 qb.appendWhere(" AND " + Data._ID + "=?");
                 break;
             }
 
-            case PHONES_FILTER: {
+            case PHONES_FILTER:
+            case CALLABLES_FILTER: {
+                final String mimeTypeIsPhoneExpression =
+                        DataColumns.MIMETYPE_ID + "=" + mDbHelper.get().getMimeTypeIdForPhone();
+                final String mimeTypeIsSipExpression =
+                        DataColumns.MIMETYPE_ID + "=" + mDbHelper.get().getMimeTypeIdForSip();
+
                 String typeParam = uri.getQueryParameter(DataUsageFeedback.USAGE_TYPE);
                 Integer typeInt = sDataUsageTypeMap.get(typeParam);
                 if (typeInt == null) {
                     typeInt = DataUsageStatColumns.USAGE_TYPE_INT_CALL;
                 }
                 setTablesAndProjectionMapForData(qb, uri, projection, true, typeInt);
-                qb.appendWhere(" AND " + DataColumns.MIMETYPE_ID + " = "
-                        + mDbHelper.get().getMimeTypeIdForPhone());
+                if (match == CALLABLES_FILTER) {
+                    qb.appendWhere(" AND ((" + mimeTypeIsPhoneExpression +
+                            ") OR (" + mimeTypeIsSipExpression + "))");
+                } else {
+                    qb.appendWhere(" AND " + mimeTypeIsPhoneExpression);
+                }
+
                 if (uri.getPathSegments().size() > 2) {
                     String filterParam = uri.getLastPathSegment();
                     StringBuilder sb = new StringBuilder();
                     sb.append(" AND (");
 
                     boolean hasCondition = false;
-                    boolean orNeeded = false;
                     final String ftsMatchQuery = SearchIndexManager.getFtsMatchQuery(
                             filterParam, FtsQueryBuilder.UNSCOPED_NORMALIZING);
                     if (ftsMatchQuery.length() > 0) {
@@ -5493,13 +5344,12 @@
                                 " WHERE " + SearchIndexColumns.NAME + " MATCH '");
                         sb.append(ftsMatchQuery);
                         sb.append("')");
-                        orNeeded = true;
                         hasCondition = true;
                     }
 
                     String number = PhoneNumberUtils.normalizeNumber(filterParam);
                     if (!TextUtils.isEmpty(number)) {
-                        if (orNeeded) {
+                        if (hasCondition) {
                             sb.append(" OR ");
                         }
                         sb.append(Data._ID +
@@ -5511,6 +5361,23 @@
                         hasCondition = true;
                     }
 
+                    if (!TextUtils.isEmpty(filterParam) && match == CALLABLES_FILTER) {
+                        // If the request is via Callable uri, Sip addresses matching the filter
+                        // parameter should be returned.
+                        if (hasCondition) {
+                            sb.append(" OR ");
+                        }
+                        sb.append("(");
+                        sb.append(mimeTypeIsSipExpression);
+                        sb.append(" AND ((" + Data.DATA1 + " LIKE ");
+                        DatabaseUtils.appendEscapedSQLString(sb, filterParam + '%');
+                        sb.append(") OR (" + Data.DATA1 + " LIKE ");
+                        // Users may want SIP URIs starting from "sip:"
+                        DatabaseUtils.appendEscapedSQLString(sb, "sip:"+ filterParam + '%');
+                        sb.append(")))");
+                        hasCondition = true;
+                    }
+
                     if (!hasCondition) {
                         // If it is neither a phone number nor a name, the query should return
                         // an empty cursor.  Let's ensure that.
@@ -5519,9 +5386,21 @@
                     sb.append(")");
                     qb.appendWhere(sb);
                 }
-                groupBy = "(CASE WHEN " + PhoneColumns.NORMALIZED_NUMBER
-                        + " IS NOT NULL THEN " + PhoneColumns.NORMALIZED_NUMBER
+                if (match == CALLABLES_FILTER) {
+                    // If the row is for a phone number that has a normalized form, we should use
+                    // the normalized one as PHONES_FILTER does, while we shouldn't do that
+                    // if the row is for a sip address.
+                    String isPhoneAndHasNormalized = "("
+                        + mimeTypeIsPhoneExpression + " AND "
+                        + Phone.NORMALIZED_NUMBER + " IS NOT NULL)";
+                    groupBy = "(CASE WHEN " + isPhoneAndHasNormalized
+                        + " THEN " + Phone.NORMALIZED_NUMBER
                         + " ELSE " + Phone.NUMBER + " END), " + RawContacts.CONTACT_ID;
+                } else {
+                    groupBy = "(CASE WHEN " + Phone.NORMALIZED_NUMBER
+                        + " IS NOT NULL THEN " + Phone.NORMALIZED_NUMBER
+                        + " ELSE " + Phone.NUMBER + " END), " + RawContacts.CONTACT_ID;
+                }
                 if (sortOrder == null) {
                     final String accountPromotionSortOrder = getAccountPromotionSortOrder(uri);
                     if (!TextUtils.isEmpty(accountPromotionSortOrder)) {
@@ -5680,9 +5559,9 @@
                 break;
             }
 
-            case RAW_CONTACTS_DATA:
+            case RAW_CONTACTS_ID_DATA:
             case PROFILE_RAW_CONTACTS_ID_DATA: {
-                int segment = match == RAW_CONTACTS_DATA ? 1 : 2;
+                int segment = match == RAW_CONTACTS_ID_DATA ? 1 : 2;
                 long rawContactId = Long.parseLong(uri.getPathSegments().get(segment));
                 setTablesAndProjectionMapForData(qb, uri, projection, false);
                 selectionArgs = insertSelectionArg(selectionArgs, String.valueOf(rawContactId));
@@ -5814,17 +5693,18 @@
             }
 
             case GROUPS_SUMMARY: {
-                final boolean returnGroupCountPerAccount =
-                        readBooleanQueryParameter(uri, Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT,
-                                false);
                 String tables = Views.GROUPS + " AS " + Tables.GROUPS;
-                if (hasColumn(projection, Groups.SUMMARY_COUNT)) {
+                if (ContactsDatabaseHelper.isInProjection(projection, Groups.SUMMARY_COUNT)) {
                     tables = tables + Joins.GROUP_MEMBER_COUNT;
                 }
+                if (ContactsDatabaseHelper.isInProjection(projection,
+                        Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT)) {
+                    // TODO Add join for this column too (and update the projection map)
+                    // TODO Also remove Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT when it works.
+                    Log.w(TAG, Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT + " is not supported yet");
+                }
                 qb.setTables(tables);
-                qb.setProjectionMap(returnGroupCountPerAccount ?
-                        sGroupsSummaryProjectionMapWithGroupCountPerAccount
-                        : sGroupsSummaryProjectionMap);
+                qb.setProjectionMap(sGroupsSummaryProjectionMap);
                 appendAccountFromParameter(qb, uri);
                 groupBy = GroupsColumns.CONCRETE_ID;
                 break;
@@ -5925,7 +5805,7 @@
                 break;
             }
 
-            case RAW_CONTACT_ENTITY_ID: {
+            case RAW_CONTACT_ID_ENTITY: {
                 long rawContactId = Long.parseLong(uri.getPathSegments().get(1));
                 setTablesAndProjectionMapForRawEntities(qb, uri);
                 selectionArgs = insertSelectionArg(selectionArgs, String.valueOf(rawContactId));
@@ -5966,6 +5846,7 @@
         Cursor cursor =
                 query(mActiveDb.get(), qb, projection, selection, selectionArgs, sortOrder, groupBy,
                         limit);
+
         if (readBooleanQueryParameter(uri, ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, false)) {
             cursor = bundleLetterCountExtras(cursor, mActiveDb.get(), qb, selection,
                     selectionArgs, sortOrder, addressBookIndexerCountExpression);
@@ -5973,6 +5854,7 @@
         if (snippetDeferred) {
             cursor = addDeferredSnippetingExtra(cursor);
         }
+
         return cursor;
     }
 
@@ -7142,7 +7024,7 @@
                 }
             }
 
-            case DISPLAY_PHOTO: {
+            case DISPLAY_PHOTO_ID: {
                 long photoFileId = ContentUris.parseId(uri);
                 if (!mode.equals("r")) {
                     throw new IllegalArgumentException(
@@ -7463,7 +7345,7 @@
             case CONTACTS_LOOKUP_DISPLAY_PHOTO:
             case CONTACTS_LOOKUP_ID_DISPLAY_PHOTO:
             case RAW_CONTACTS_ID_DISPLAY_PHOTO:
-            case DISPLAY_PHOTO:
+            case DISPLAY_PHOTO_ID:
                 return "image/jpeg";
             case RAW_CONTACTS:
             case PROFILE_RAW_CONTACTS:
@@ -7612,19 +7494,35 @@
                     " IN(" + CONTACT_LOOKUP_NAME_TYPES + "))");
     }
 
-    public boolean isPhoneNumber(String filter) {
-        boolean atLeastOneDigit = false;
-        int len = filter.length();
+    public boolean isPhoneNumber(String query) {
+        if (TextUtils.isEmpty(query)) {
+            return false;
+        }
+        // assume a phone number if it has at least 1 digit
+        return countPhoneNumberDigits(query) > 0;
+    }
+
+    /**
+     * Returns the number of digitis in a phone number ignoring special characters such as '-'.
+     * If the string is not a valid phone number, 0 is returned.
+     */
+    public static int countPhoneNumberDigits(String query) {
+        int numDigits = 0;
+        int len = query.length();
         for (int i = 0; i < len; i++) {
-            char c = filter.charAt(i);
-            if (c >= '0' && c <= '9') {
-                atLeastOneDigit = true;
-            } else if (c != '*' && c != '#' && c != '+' && c != 'N' && c != '.' && c != ';'
-                    && c != '-' && c != '(' && c != ')' && c != ' ') {
-                return false;
+            char c = query.charAt(i);
+            if (Character.isDigit(c)) {
+                numDigits ++;
+            } else if (c == '*' || c == '#' || c == 'N' || c == '.' || c == ';'
+                    || c == '-' || c == '(' || c == ')' || c == ' ') {
+                // carry on
+            } else if (c == '+' && numDigits == 0) {
+                // plus before any digits is ok
+            } else {
+                return 0; // not a phone number
             }
         }
-        return atLeastOneDigit;
+        return numDigits;
     }
 
     /**
@@ -7887,13 +7785,27 @@
         }
     }
 
-    /* Visible for testing */
+    @VisibleForTesting
     boolean isPhone() {
-        if (!sIsPhoneInitialized) {
-            sIsPhone = new TelephonyManager(getContext()).isVoiceCapable();
-            sIsPhoneInitialized = true;
+        if (!mIsPhoneInitialized) {
+            mIsPhone = new TelephonyManager(getContext()).isVoiceCapable();
+            mIsPhoneInitialized = true;
         }
-        return sIsPhone;
+        return mIsPhone;
+    }
+
+    boolean isVoiceCapable() {
+        // this copied from com.android.phone.PhoneApp.onCreate():
+
+        // "voice capable" flag.
+        // This flag currently comes from a resource (which is
+        // overrideable on a per-product basis):
+        return getContext().getResources()
+                .getBoolean(com.android.internal.R.bool.config_voice_capable);
+        // ...but this might eventually become a PackageManager "system
+        // feature" instead, in which case we'd do something like:
+        // return
+        //   getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_VOICE_CALLS);
     }
 
     private boolean handleDataUsageFeedback(Uri uri) {
@@ -8043,6 +7955,6 @@
      * @return a boolean indicating if a snippet is needed or not.
      */
     private boolean snippetNeeded(String [] projection) {
-        return mDbHelper.get().isInProjection(projection, SearchSnippetColumns.SNIPPET);
+        return ContactsDatabaseHelper.isInProjection(projection, SearchSnippetColumns.SNIPPET);
     }
 }
diff --git a/src/com/android/providers/contacts/CrossProcessCursorWrapper.java b/src/com/android/providers/contacts/CrossProcessCursorWrapper.java
deleted file mode 100644
index 76baa96..0000000
--- a/src/com/android/providers/contacts/CrossProcessCursorWrapper.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.providers.contacts;
-
-import android.database.CrossProcessCursor;
-import android.database.Cursor;
-import android.database.CursorWindow;
-import android.database.CursorWrapper;
-
-/**
- * Cursor wrapper that implements {@link CrossProcessCursor}, but will only behave as such if the
- * cursor it is wrapping is itself a {@link CrossProcessCursor} or another wrapper around the same.
- */
-public class CrossProcessCursorWrapper extends CursorWrapper implements CrossProcessCursor {
-
-    // The cross process cursor.  Only non-null if the wrapped cursor was a cross-process cursor.
-    private final CrossProcessCursor mCrossProcessCursor;
-
-    public CrossProcessCursorWrapper(Cursor cursor) {
-        super(cursor);
-        mCrossProcessCursor = getCrossProcessCursor(cursor);
-    }
-
-    private CrossProcessCursor getCrossProcessCursor(Cursor cursor) {
-        if (cursor instanceof CrossProcessCursor) {
-            return (CrossProcessCursor) cursor;
-        } else if (cursor instanceof CursorWrapper) {
-            return getCrossProcessCursor(((CursorWrapper) cursor).getWrappedCursor());
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public void fillWindow(int pos, CursorWindow window) {
-        if (mCrossProcessCursor != null) {
-            mCrossProcessCursor.fillWindow(pos, window);
-        } else {
-            throw new UnsupportedOperationException("Wrapped cursor is not a cross-process cursor");
-        }
-    }
-
-    @Override
-    public CursorWindow getWindow() {
-        if (mCrossProcessCursor != null) {
-            return mCrossProcessCursor.getWindow();
-        } else {
-            throw new UnsupportedOperationException("Wrapped cursor is not a cross-process cursor");
-        }
-    }
-
-    @Override
-    public boolean onMove(int oldPosition, int newPosition) {
-        if (mCrossProcessCursor != null) {
-            return mCrossProcessCursor.onMove(oldPosition, newPosition);
-        } else {
-            throw new UnsupportedOperationException("Wrapped cursor is not a cross-process cursor");
-        }
-    }
-
-}
diff --git a/src/com/android/providers/contacts/DataRowHandlerForPhoneNumber.java b/src/com/android/providers/contacts/DataRowHandlerForPhoneNumber.java
index 008d9cf..88e432e 100644
--- a/src/com/android/providers/contacts/DataRowHandlerForPhoneNumber.java
+++ b/src/com/android/providers/contacts/DataRowHandlerForPhoneNumber.java
@@ -15,7 +15,6 @@
  */
 package com.android.providers.contacts;
 
-import com.android.providers.contacts.ContactsDatabaseHelper.PhoneColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.PhoneLookupColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
 import com.android.providers.contacts.SearchIndexManager.IndexBuilder;
@@ -48,7 +47,7 @@
             String numberE164 =
                     PhoneNumberUtils.formatNumberToE164(number, mDbHelper.getCurrentCountryIso());
             if (numberE164 != null) {
-                values.put(PhoneColumns.NORMALIZED_NUMBER, numberE164);
+                values.put(Phone.NORMALIZED_NUMBER, numberE164);
             }
             dataId = super.insert(db, txContext, rawContactId, values);
 
@@ -76,7 +75,7 @@
                         mDbHelper.getCurrentCountryIso());
             }
             if (numberE164 != null) {
-                values.put(PhoneColumns.NORMALIZED_NUMBER, numberE164);
+                values.put(Phone.NORMALIZED_NUMBER, numberE164);
             }
         }
 
diff --git a/src/com/android/providers/contacts/GlobalSearchSupport.java b/src/com/android/providers/contacts/GlobalSearchSupport.java
index 5d4d273..2acae60 100644
--- a/src/com/android/providers/contacts/GlobalSearchSupport.java
+++ b/src/com/android/providers/contacts/GlobalSearchSupport.java
@@ -17,10 +17,13 @@
 package com.android.providers.contacts;
 
 import android.app.SearchManager;
+import android.content.Context;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.database.sqlite.SQLiteDatabase;
+import android.location.Country;
+import android.location.CountryDetector;
 import android.net.Uri;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -30,40 +33,30 @@
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.SearchSnippetColumns;
 import android.provider.ContactsContract.StatusUpdates;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
 import com.android.i18n.phonenumbers.PhoneNumberUtil;
-import com.android.i18n.phonenumbers.NumberParseException;
 import com.android.providers.contacts.ContactsDatabaseHelper.AggregatedPresenceColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.ContactsColumns;
 import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
 import com.android.providers.contacts.ContactsDatabaseHelper.Views;
 
 import java.util.ArrayList;
-import java.util.Locale;
 
 /**
  * Support for global search integration for Contacts.
  */
 public class GlobalSearchSupport {
 
-    private static final String[] SEARCH_SUGGESTIONS_BASED_ON_PHONE_NUMBER_COLUMNS = {
-            "_id",
-            SearchManager.SUGGEST_COLUMN_TEXT_1,
-            SearchManager.SUGGEST_COLUMN_TEXT_2,
-            SearchManager.SUGGEST_COLUMN_ICON_1,
-            SearchManager.SUGGEST_COLUMN_INTENT_DATA,
-            SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
-            SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
-    };
-
-    private static final String[] SEARCH_SUGGESTIONS_BASED_ON_NAME_COLUMNS = {
+    private static final String[] SEARCH_SUGGESTIONS_COLUMNS = {
             "_id",
             SearchManager.SUGGEST_COLUMN_TEXT_1,
             SearchManager.SUGGEST_COLUMN_TEXT_2,
             SearchManager.SUGGEST_COLUMN_ICON_1,
             SearchManager.SUGGEST_COLUMN_ICON_2,
             SearchManager.SUGGEST_COLUMN_INTENT_DATA,
+            SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
             SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
             SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA,
             SearchManager.SUGGEST_COLUMN_LAST_ACCESS_HINT,
@@ -113,15 +106,19 @@
         String text2;
         String icon1;
         String icon2;
+        String intentData;
+        String intentAction;
         String filter;
         String lastAccessTime;
 
         @SuppressWarnings({"unchecked"})
         public ArrayList asList(String[] projection) {
-            if (photoUri != null) {
-                icon1 = photoUri.toString();
-            } else {
-                icon1 = String.valueOf(com.android.internal.R.drawable.ic_contact_picture);
+            if (icon1 == null) {
+                if (photoUri != null) {
+                    icon1 = photoUri.toString();
+                } else {
+                    icon1 = String.valueOf(com.android.internal.R.drawable.ic_contact_picture);
+                }
             }
 
             if (presence != -1) {
@@ -130,15 +127,16 @@
 
             ArrayList<Object> list = new ArrayList<Object>();
             if (projection == null) {
-                list.add(contactId);
-                list.add(text1);
-                list.add(text2);
-                list.add(icon1);
-                list.add(icon2);
-                list.add(buildUri());
-                list.add(lookupKey);
-                list.add(filter);
-                list.add(lastAccessTime);
+                list.add(contactId); // _id
+                list.add(text1); // text1
+                list.add(text2); // text2
+                list.add(icon1); // icon1
+                list.add(icon2); // icon2
+                list.add(intentData == null ? buildUri() : intentData); // intent data
+                list.add(intentAction); // intentAction
+                list.add(lookupKey); // shortcut id
+                list.add(filter); // extra data
+                list.add(lastAccessTime); // last access hint
             } else {
                 for (int i = 0; i < projection.length; i++) {
                     addColumnValue(list, projection[i]);
@@ -159,7 +157,7 @@
             } else if (SearchManager.SUGGEST_COLUMN_ICON_2.equals(column)) {
                 list.add(icon2);
             } else if (SearchManager.SUGGEST_COLUMN_INTENT_DATA.equals(column)) {
-                list.add(buildUri());
+                list.add(intentData == null ? buildUri() : intentData);
             } else if (SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID.equals(column)) {
                 list.add(lookupKey);
             } else if (SearchManager.SUGGEST_COLUMN_SHORTCUT_ID.equals(column)) {
@@ -179,12 +177,24 @@
     }
 
     private final ContactsProvider2 mContactsProvider;
-    private final PhoneNumberUtil mPhoneNumberUtil;
+    private PhoneNumberUtil mPhoneNumberUtil;
+    private CountryDetector mCountryDetector;
+    private String mSimCountryIso;
 
     @SuppressWarnings("all")
     public GlobalSearchSupport(ContactsProvider2 contactsProvider) {
         mContactsProvider = contactsProvider;
+
         mPhoneNumberUtil = PhoneNumberUtil.getInstance();
+        mCountryDetector = (CountryDetector)
+                mContactsProvider.getContext().getSystemService(Context.COUNTRY_DETECTOR);
+        TelephonyManager telman = (TelephonyManager)
+                mContactsProvider.getContext().getSystemService(Context.TELEPHONY_SERVICE);
+        // assuming here that the SIM never changes while the phone is booted. ok?
+        mSimCountryIso = telman == null ? null : telman.getSimCountryIso();
+        if (mSimCountryIso != null) {
+            mSimCountryIso = mSimCountryIso.toUpperCase();
+        }
 
         // To ensure the data column position. This is dead code if properly configured.
         if (Organization.COMPANY != Data.DATA1 || Phone.NUMBER != Data.DATA1
@@ -194,9 +204,39 @@
         }
     }
 
+    private boolean isPossibleByPhoneNumberUtil(String query) {
+        String currentCountry = null;
+        Country current = mCountryDetector.detectCountry();
+        if (current != null) {
+            currentCountry = current.getCountryIso().toUpperCase();
+        }
+        if (currentCountry != null && mPhoneNumberUtil.isPossibleNumber(query, currentCountry)) {
+            return true;
+        }
+        if (mSimCountryIso != null && !TextUtils.equals(currentCountry, mSimCountryIso)) {
+            // use the SIM country if it's different, so we can add contacts for home numbers
+            // while roaming
+            return mPhoneNumberUtil.isPossibleNumber(query, mSimCountryIso);
+        }
+        return false;
+    }
+
+    private boolean isPhoneNumber(String query) {
+        if (TextUtils.isEmpty(query)) {
+            return false;
+        }
+        if (ContactsProvider2.countPhoneNumberDigits(query) > 2) {
+            // 3 or more digits matching the basic pattern
+            return true;
+        }
+        // more advanced check, for 1800-FLOWERS style numbers and the like
+        return isPossibleByPhoneNumberUtil(query);
+    }
+
     public Cursor handleSearchSuggestionsQuery(
             SQLiteDatabase db, Uri uri, String[] projection, String limit) {
         final String searchClause;
+
         final String selection;
         if (uri.getPathSegments().size() <= 1) {
             searchClause = null;
@@ -206,16 +246,13 @@
             selection = null;
         }
 
-        if (mContactsProvider.isPhone() && isPhoneNumber(searchClause)) {
-            return buildCursorForSearchSuggestionsBasedOnPhoneNumber(searchClause);
-        } else {
-            return buildCursorForSearchSuggestionsBasedOnFilter(
-                    db, projection, selection, searchClause, limit);
+        MatrixCursor cursor = new MatrixCursor(
+                projection == null ? SEARCH_SUGGESTIONS_COLUMNS : projection);
+        addSearchSuggestionsBasedOnFilter(cursor, db, projection, selection, searchClause, limit);
+        if (isPhoneNumber(searchClause)) {
+            addSearchSuggestionsBasedOnPhoneNumber(cursor, searchClause, projection);
         }
-    }
-
-    private boolean isPhoneNumber(String query) {
-        return mPhoneNumberUtil.isPossibleNumber(query, Locale.getDefault().getCountry());
+        return cursor;
     }
 
     /**
@@ -236,73 +273,61 @@
         } catch (IllegalArgumentException e) {
             contactId = -1L;
         }
-        return buildCursorForSearchSuggestionsBasedOnFilter(
+        MatrixCursor cursor = new MatrixCursor(
+                projection == null ? SEARCH_SUGGESTIONS_COLUMNS : projection);
+        return addSearchSuggestionsBasedOnFilter(cursor,
                 db, projection, ContactsColumns.CONCRETE_ID + "=" + contactId, filter, null);
     }
 
-    private boolean isVoiceCapable() {
-        // this copied from com.android.phone.PhoneApp.onCreate():
-
-        // "voice capable" flag.
-        // This flag currently comes from a resource (which is
-        // overrideable on a per-product basis):
-        return mContactsProvider.getContext().getResources()
-                .getBoolean(com.android.internal.R.bool.config_voice_capable);
-        // ...but this might eventually become a PackageManager "system
-        // feature" instead, in which case we'd do something like:
-        // return
-        //   getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_VOICE_CALLS);
-    }
-
-    private Cursor buildCursorForSearchSuggestionsBasedOnPhoneNumber(String searchClause) {
-        MatrixCursor cursor = new MatrixCursor(SEARCH_SUGGESTIONS_BASED_ON_PHONE_NUMBER_COLUMNS);
+    private Cursor addSearchSuggestionsBasedOnPhoneNumber(MatrixCursor cursor,
+            String searchClause, String[] projection) {
         Resources r = mContactsProvider.getContext().getResources();
         String s;
         int i;
 
-        if (isVoiceCapable()) {
-            ArrayList<Object> dialNumber = new ArrayList<Object>();
-            dialNumber.add(0);  // _id
+        if (mContactsProvider.isPhone() && mContactsProvider.isVoiceCapable()) {
+            SearchSuggestion dialNumber = new SearchSuggestion();
+            dialNumber.contactId = -1;
             s = r.getString(com.android.internal.R.string.dial_number_using, searchClause);
             i = s.indexOf('\n');
             if (i < 0) {
-                dialNumber.add(s);
-                dialNumber.add("");
+                dialNumber.text1 = s;
+                dialNumber.text2 = "";
             } else {
-                dialNumber.add(s.substring(0, i));
-                dialNumber.add(s.substring(i + 1));
+                dialNumber.text1 = s.substring(0, i);
+                dialNumber.text2 = s.substring(i + 1);
             }
-            dialNumber.add(String.valueOf(com.android.internal.R.drawable.call_contact));
-            dialNumber.add("tel:" + searchClause);
-            dialNumber.add(ContactsContract.Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED);
-            dialNumber.add(null);
-            cursor.addRow(dialNumber);
+            dialNumber.icon1 = String.valueOf(com.android.internal.R.drawable.call_contact);
+            dialNumber.intentData = "tel:" + searchClause;
+            dialNumber.intentAction =
+                    ContactsContract.Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED;
+            dialNumber.lookupKey = SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT; // shortcut id
+            cursor.addRow(dialNumber.asList(projection));
         }
 
-        ArrayList<Object> createContact = new ArrayList<Object>();
-        createContact.add(1);  // _id
+        SearchSuggestion createContact = new SearchSuggestion();
+        createContact.contactId = -2;
         s = r.getString(com.android.internal.R.string.create_contact_using, searchClause);
         i = s.indexOf('\n');
         if (i < 0) {
-            createContact.add(s);
-            createContact.add("");
+            createContact.text1 = s;
+            createContact.text2 = "";
         } else {
-            createContact.add(s.substring(0, i));
-            createContact.add(s.substring(i + 1));
+            createContact.text1 = s.substring(0, i);
+            createContact.text2 = s.substring(i + 1);
         }
-        createContact.add(String.valueOf(com.android.internal.R.drawable.create_contact));
-        createContact.add("tel:" + searchClause);
-        createContact.add(ContactsContract.Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED);
-        createContact.add(SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT);
-        cursor.addRow(createContact);
+        createContact.icon1 = String.valueOf(com.android.internal.R.drawable.create_contact);
+        createContact.intentData = "tel:" + searchClause;
+        createContact.intentAction =
+                ContactsContract.Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED;
+        createContact.lookupKey = SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT; // shortcut id
+        cursor.addRow(createContact.asList(projection));
 
         return cursor;
     }
 
-    private Cursor buildCursorForSearchSuggestionsBasedOnFilter(SQLiteDatabase db,
+    private Cursor addSearchSuggestionsBasedOnFilter(MatrixCursor cursor, SQLiteDatabase db,
             String[] projection, String selection, String filter, String limit) {
-        MatrixCursor cursor = new MatrixCursor(
-                projection != null ? projection : SEARCH_SUGGESTIONS_BASED_ON_NAME_COLUMNS);
         StringBuilder sb = new StringBuilder();
         final boolean haveFilter = !TextUtils.isEmpty(filter);
         sb.append("SELECT "
diff --git a/src/com/android/providers/contacts/InstrumentedCursorWrapper.java b/src/com/android/providers/contacts/InstrumentedCursorWrapper.java
deleted file mode 100644
index c412810..0000000
--- a/src/com/android/providers/contacts/InstrumentedCursorWrapper.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.providers.contacts;
-
-import com.google.android.collect.Lists;
-
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-import java.util.List;
-
-/**
- * Cursor wrapper that handles tracking time taken before query result came back and how long
- * the cursor was open before it was closed.
- */
-public class InstrumentedCursorWrapper extends CrossProcessCursorWrapper {
-
-    /**
-     * Static list of active cursors.
-     */
-    private static List<InstrumentedCursorWrapper> mActiveCursors = Lists.newArrayList();
-
-    /**
-     * Time (ms since epoch) when the cursor was created.
-     */
-    private long mCreationTime;
-
-    /**
-     * Milliseconds after creation at which the query completed (triggered by a getCount or
-     * any method that moves the cursor).
-     */
-    private long mTimeToQuery;
-
-    /**
-     * The URI being queried in this cursor.
-     */
-    private Uri mUri;
-
-    /**
-     * Log tag to use.
-     */
-    private String mTag;
-
-    public InstrumentedCursorWrapper(Cursor cursor, Uri uri, String tag) {
-        super(cursor);
-        mCreationTime = System.currentTimeMillis();
-        mUri = uri;
-        mTag = tag;
-        mActiveCursors.add(this);
-    }
-
-    @Override
-    public int getCount() {
-        int count = super.getCount();
-        logQueryTime();
-        return count;
-    }
-
-    @Override
-    public boolean moveToFirst() {
-        boolean result = super.moveToFirst();
-        logQueryTime();
-        return result;
-    }
-
-    @Override
-    public boolean moveToLast() {
-        boolean result = super.moveToLast();
-        logQueryTime();
-        return result;
-    }
-
-    @Override
-    public boolean move(int offset) {
-        boolean result = super.move(offset);
-        logQueryTime();
-        return result;
-    }
-
-    @Override
-    public boolean moveToPosition(int position) {
-        boolean result = super.moveToPosition(position);
-        logQueryTime();
-        return result;
-    }
-
-    @Override
-    public boolean moveToNext() {
-        boolean result = super.moveToNext();
-        logQueryTime();
-        return result;
-    }
-
-    @Override
-    public boolean moveToPrevious() {
-        boolean result = super.moveToPrevious();
-        logQueryTime();
-        return result;
-    }
-
-    @Override
-    public void close() {
-        super.close();
-        long timeToClose = System.currentTimeMillis() - mCreationTime;
-        Log.v(mTag, timeToClose + "ms to close for URI " + mUri
-                + " (" + (timeToClose - mTimeToQuery) + "ms since query complete)");
-        mActiveCursors.remove(this);
-        Log.v(mTag, mActiveCursors.size() + " cursors still open");
-    }
-
-    private void logQueryTime() {
-        if (mTimeToQuery == 0) {
-            mTimeToQuery = System.currentTimeMillis() - mCreationTime;
-            Log.v(mTag, mTimeToQuery + "ms to query URI " + mUri);
-        }
-    }
-}
diff --git a/src/com/android/providers/contacts/LegacyContactImporter.java b/src/com/android/providers/contacts/LegacyContactImporter.java
deleted file mode 100644
index 239f08d..0000000
--- a/src/com/android/providers/contacts/LegacyContactImporter.java
+++ /dev/null
@@ -1,1310 +0,0 @@
-/*
- * Copyright (C) 2009 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.providers.contacts;
-
-import com.android.providers.contacts.ContactsDatabaseHelper.DataColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.PhoneColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.PhoneLookupColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.RawContactsColumns;
-import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteException;
-import android.database.sqlite.SQLiteStatement;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Note;
-import android.provider.ContactsContract.CommonDataKinds.Organization;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.Photo;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.File;
-
-public class LegacyContactImporter {
-
-    public static final String TAG = "LegacyContactImporter";
-
-    private static final int MAX_ATTEMPTS = 5;
-    private static final int DELAY_BETWEEN_ATTEMPTS = 2000;
-
-    public static final String DEFAULT_ACCOUNT_TYPE = "com.google";
-    private static final String DATABASE_NAME = "contacts.db";
-
-    private static final int INSERT_BATCH_SIZE = 200;
-
-    /**
-     * Estimated increase in database size after import.
-     */
-    private static final long DATABASE_SIZE_MULTIPLIER = 4;
-
-    /**
-     * Estimated minimum database size in megabytes.
-     */
-    private static final long DATABASE_MIN_SIZE = 5;
-
-    private final Context mContext;
-    private final ContactsProvider2 mContactsProvider;
-    private final NameLookupBuilder mNameLookupBuilder;
-
-    private ContactsDatabaseHelper mDbHelper;
-    private ContentValues mValues = new ContentValues();
-    private ContentResolver mResolver;
-    private boolean mPhoneticNameAvailable = true;
-
-    private SQLiteDatabase mSourceDb;
-    private SQLiteDatabase mTargetDb;
-
-    private NameSplitter mNameSplitter;
-    private int mBatchCounter;
-
-    private int mContactCount;
-
-    private long mStructuredNameMimetypeId;
-    private long mNoteMimetypeId;
-    private long mOrganizationMimetypeId;
-    private long mPhoneMimetypeId;
-    private long mEmailMimetypeId;
-    private long mImMimetypeId;
-    private long mPostalMimetypeId;
-    private long mPhotoMimetypeId;
-    private long mGroupMembershipMimetypeId;
-
-    private long mEstimatedStorageRequirement = DATABASE_MIN_SIZE;
-
-    public LegacyContactImporter(Context context, ContactsProvider2 contactsProvider) {
-        mContext = context;
-        mContactsProvider = contactsProvider;
-        mResolver = mContactsProvider.getContext().getContentResolver();
-        mNameLookupBuilder = mContactsProvider.getNameLookupBuilder();
-    }
-
-    public boolean importContacts() throws Exception {
-        String path = mContext.getDatabasePath(DATABASE_NAME).getPath();
-        File file = new File(path);
-        if (!file.exists()) {
-            Log.i(TAG, "Legacy contacts database does not exist at " + path);
-            return true;
-        }
-
-        Log.w(TAG, "Importing contacts from " + path);
-
-        for (int i = 0; i < MAX_ATTEMPTS; i++) {
-            try {
-                mSourceDb = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
-                importContactsFromLegacyDb();
-                Log.i(TAG, "Imported legacy contacts: " + mContactCount);
-                mContactsProvider.notifyChange();
-                return true;
-
-            } catch (SQLiteException e) {
-                Log.e(TAG, "Database import exception. Will retry in " + DELAY_BETWEEN_ATTEMPTS
-                        + "ms", e);
-
-                // We could get a "database locked" exception here, in which
-                // case we should retry
-                Thread.sleep(DELAY_BETWEEN_ATTEMPTS);
-
-            } finally {
-                if (mSourceDb != null) {
-                    mSourceDb.close();
-                }
-            }
-        }
-
-        long oldDatabaseSize = file.length();
-        mEstimatedStorageRequirement = oldDatabaseSize * DATABASE_SIZE_MULTIPLIER / 1024 / 1024;
-        if (mEstimatedStorageRequirement < DATABASE_MIN_SIZE) {
-            mEstimatedStorageRequirement = DATABASE_MIN_SIZE;
-        }
-
-        return false;
-    }
-
-    public long getEstimatedStorageRequirement() {
-        return mEstimatedStorageRequirement;
-    }
-
-    private void importContactsFromLegacyDb() {
-        int version = mSourceDb.getVersion();
-
-        // Upgrade to version 78 was the latest that wiped out data.  Might as well follow suit
-        // and ignore earlier versions.
-        if (version < 78) {
-            return;
-        }
-
-        if (version < 80) {
-            mPhoneticNameAvailable = false;
-        }
-
-        mDbHelper = (ContactsDatabaseHelper)mContactsProvider.getDatabaseHelper();
-        mTargetDb = mDbHelper.getWritableDatabase();
-
-        mStructuredNameMimetypeId = mDbHelper.getMimeTypeId(StructuredName.CONTENT_ITEM_TYPE);
-        mNoteMimetypeId = mDbHelper.getMimeTypeId(Note.CONTENT_ITEM_TYPE);
-        mOrganizationMimetypeId = mDbHelper.getMimeTypeId(Organization.CONTENT_ITEM_TYPE);
-        mPhoneMimetypeId = mDbHelper.getMimeTypeId(Phone.CONTENT_ITEM_TYPE);
-        mEmailMimetypeId = mDbHelper.getMimeTypeId(Email.CONTENT_ITEM_TYPE);
-        mImMimetypeId = mDbHelper.getMimeTypeId(Im.CONTENT_ITEM_TYPE);
-        mPostalMimetypeId = mDbHelper.getMimeTypeId(StructuredPostal.CONTENT_ITEM_TYPE);
-        mPhotoMimetypeId = mDbHelper.getMimeTypeId(Photo.CONTENT_ITEM_TYPE);
-        mGroupMembershipMimetypeId =
-                mDbHelper.getMimeTypeId(GroupMembership.CONTENT_ITEM_TYPE);
-
-        mNameSplitter = mContactsProvider.getNameSplitter();
-
-        mTargetDb.beginTransaction();
-        try {
-            checkForImportFailureTest();
-
-            /*
-             * At this point there should be no data in the contacts provider, but in case
-             * some was inserted by mistake, we should remove it. The main reason for this
-             * is that we will be preserving original contact IDs and don't want to run into
-             * any collisions.
-             */
-            mContactsProvider.wipeData();
-
-            importGroups();
-            importPeople();
-            importOrganizations();
-            importPhones();
-            importContactMethods();
-            importPhotos();
-            importGroupMemberships();
-            updateDisplayNamesAndLookupKeys();
-
-            // Deleted contacts should be inserted after everything else, because
-            // the legacy table does not provide an _ID field - the _ID field
-            // will be autoincremented
-            importDeletedPeople();
-
-            mDbHelper.updateAllVisible();
-
-            mTargetDb.setTransactionSuccessful();
-        } finally {
-            mTargetDb.endTransaction();
-        }
-
-        importCalls();
-    }
-
-    /**
-     * This is used for simulating an import failure. Insert a row into the "settings"
-     * table with key='TEST' and then proceed with the upgrade.  Remove the record
-     * after verifying the failure handling.
-     */
-    private void checkForImportFailureTest() {
-        long isTest = DatabaseUtils.longForQuery(mSourceDb,
-                "SELECT COUNT(*) FROM settings WHERE key='TEST'", null);
-        if (isTest != 0) {
-            throw new SQLiteException("Testing import failure.");
-        }
-    }
-
-    private interface GroupsQuery {
-        String TABLE = "groups";
-
-        String[] COLUMNS = {
-                "_id", "name", "notes", "should_sync", "system_id", "_sync_account", "_sync_id",
-                "_sync_dirty",
-        };
-
-        static int ID = 0;
-        static int NAME = 1;
-        static int NOTES = 2;
-        static int SHOULD_SYNC = 3;            // TODO add this feature to Groups
-        static int SYSTEM_ID = 4;
-
-        static int _SYNC_ACCOUNT = 5;
-        static int _SYNC_ID = 6;
-        static int _SYNC_DIRTY = 7;
-    }
-
-    private interface GroupsInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.GROUPS + "(" +
-                Groups._ID + "," +
-                Groups.TITLE + "," +
-                Groups.NOTES + "," +
-                Groups.SYSTEM_ID + "," +
-                Groups.DIRTY + "," +
-                Groups.GROUP_VISIBLE + "," +
-                Groups.ACCOUNT_NAME + "," +
-                Groups.ACCOUNT_TYPE + "," +
-                Groups.SOURCE_ID +
-        ") VALUES (?,?,?,?,?,?,?,?,?)";
-
-        int ID = 1;
-        int TITLE = 2;
-        int NOTES = 3;
-        int SYSTEM_ID = 4;
-        int DIRTY = 5;
-        int GROUP_VISIBLE = 6;
-        int ACCOUNT_NAME = 7;
-        int ACCOUNT_TYPE = 8;
-        int SOURCE_ID = 9;
-    }
-
-    private void importGroups() {
-        SQLiteStatement insert = mTargetDb.compileStatement(GroupsInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(GroupsQuery.TABLE, GroupsQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertGroup(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertGroup(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(GroupsQuery.ID);
-
-        insert.bindLong(GroupsInsert.ID, id);
-        bindString(insert, GroupsInsert.TITLE, c.getString(GroupsQuery.NAME));
-        bindString(insert, GroupsInsert.NOTES, c.getString(GroupsQuery.NOTES));
-        bindString(insert, GroupsInsert.SYSTEM_ID, c.getString(GroupsQuery.SYSTEM_ID));
-        insert.bindLong(GroupsInsert.DIRTY, c.getLong(GroupsQuery._SYNC_DIRTY));
-        insert.bindLong(GroupsInsert.GROUP_VISIBLE, 1);
-
-        String account = c.getString(GroupsQuery._SYNC_ACCOUNT);
-        if (!TextUtils.isEmpty(account)) {
-            bindString(insert, GroupsInsert.ACCOUNT_NAME, account);
-            bindString(insert, GroupsInsert.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-            bindString(insert, GroupsInsert.SOURCE_ID, c.getString(GroupsQuery._SYNC_ID));
-        } else {
-            insert.bindNull(GroupsInsert.ACCOUNT_NAME);
-            insert.bindNull(GroupsInsert.ACCOUNT_TYPE);
-            insert.bindNull(GroupsInsert.SOURCE_ID);
-        }
-        insert(insert);
-    }
-
-    private interface PeopleQuery {
-        String TABLE = "people";
-
-        String NAME_SQL =
-                "(CASE WHEN (name IS NOT NULL AND name != '') "
-                    + "THEN name "
-                + "ELSE "
-                    + "(CASE WHEN primary_organization is NOT NULL THEN "
-                        + "(SELECT company FROM organizations WHERE "
-                            + "organizations._id = primary_organization) "
-                    + "ELSE "
-                        + "(CASE WHEN primary_phone IS NOT NULL THEN "
-                            +"(SELECT number FROM phones WHERE phones._id = primary_phone) "
-                        + "ELSE "
-                            + "(CASE WHEN primary_email IS NOT NULL THEN "
-                                + "(SELECT data FROM contact_methods WHERE "
-                                    + "contact_methods._id = primary_email) "
-                            + "ELSE "
-                                + "null "
-                            + "END) "
-                        + "END) "
-                    + "END) "
-                + "END) ";
-
-
-        String[] COLUMNS_WITH_DISPLAY_NAME_WITHOUT_PHONETIC_NAME = {
-                "_id", NAME_SQL, "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty",
-        };
-
-        String[] COLUMNS_WITH_DISPLAY_NAME_WITH_PHONETIC_NAME = {
-                "_id", NAME_SQL, "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty", "phonetic_name",
-        };
-
-        String[] COLUMNS_WITHOUT_PHONETIC_NAME = {
-                "_id", "name", "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty",
-        };
-
-        String[] COLUMNS_WITH_PHONETIC_NAME = {
-                "_id", "name", "notes", "times_contacted", "last_time_contacted", "starred",
-                "primary_phone", "primary_organization", "primary_email", "custom_ringtone",
-                "send_to_voicemail", "_sync_account", "_sync_id", "_sync_time", "_sync_local_id",
-                "_sync_dirty", "phonetic_name",
-        };
-
-        static int _ID = 0;
-        static int NAME = 1;
-        static int NOTES = 2;
-        static int TIMES_CONTACTED = 3;
-        static int LAST_TIME_CONTACTED = 4;
-        static int STARRED = 5;
-        static int PRIMARY_PHONE = 6;
-        static int PRIMARY_ORGANIZATION = 7;
-        static int PRIMARY_EMAIL = 8;
-        static int CUSTOM_RINGTONE = 9;
-        static int SEND_TO_VOICEMAIL = 10;
-
-        static int _SYNC_ACCOUNT = 11;
-        static int _SYNC_ID = 12;
-        static int _SYNC_TIME = 13;
-        static int _SYNC_LOCAL_ID = 14;
-        static int _SYNC_DIRTY = 15;
-
-        static int PHONETIC_NAME = 16;
-    }
-
-
-    private interface RawContactsInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.RAW_CONTACTS + "(" +
-                RawContacts._ID + "," +
-                RawContacts.CONTACT_ID + "," +
-                RawContacts.CUSTOM_RINGTONE + "," +
-                RawContacts.DIRTY + "," +
-                RawContacts.LAST_TIME_CONTACTED + "," +
-                RawContacts.SEND_TO_VOICEMAIL + "," +
-                RawContacts.STARRED + "," +
-                RawContacts.TIMES_CONTACTED + "," +
-                RawContacts.SYNC1 + "," +
-                RawContacts.SYNC2 + "," +
-                RawContacts.ACCOUNT_NAME + "," +
-                RawContacts.ACCOUNT_TYPE + "," +
-                RawContacts.SOURCE_ID + "," +
-                RawContactsColumns.DISPLAY_NAME +
-         ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
-
-        int ID = 1;
-        int CONTACT_ID = 2;
-        int CUSTOM_RINGTONE = 3;
-        int DIRTY = 4;
-        int LAST_TIME_CONTACTED = 5;
-        int SEND_TO_VOICEMAIL = 6;
-        int STARRED = 7;
-        int TIMES_CONTACTED = 8;
-        int SYNC1 = 9;
-        int SYNC2 = 10;
-        int ACCOUNT_NAME = 11;
-        int ACCOUNT_TYPE = 12;
-        int SOURCE_ID = 13;
-        int DISPLAY_NAME = 14;
-    }
-
-    private interface ContactsInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.CONTACTS + "(" +
-                Contacts._ID + "," +
-                Contacts.CUSTOM_RINGTONE + "," +
-                Contacts.LAST_TIME_CONTACTED + "," +
-                Contacts.SEND_TO_VOICEMAIL + "," +
-                Contacts.STARRED + "," +
-                Contacts.TIMES_CONTACTED + "," +
-                Contacts.NAME_RAW_CONTACT_ID +
-         ") VALUES (?,?,?,?,?,?,?)";
-
-        int ID = 1;
-        int CUSTOM_RINGTONE = 2;
-        int LAST_TIME_CONTACTED = 3;
-        int SEND_TO_VOICEMAIL = 4;
-        int STARRED = 5;
-        int TIMES_CONTACTED = 6;
-        int NAME_RAW_CONTACT_ID = 7;
-    }
-
-    private interface StructuredNameInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                StructuredName.DISPLAY_NAME + "," +
-                StructuredName.PREFIX + "," +
-                StructuredName.GIVEN_NAME + "," +
-                StructuredName.MIDDLE_NAME + "," +
-                StructuredName.FAMILY_NAME + "," +
-                StructuredName.SUFFIX + "," +
-                StructuredName.FULL_NAME_STYLE + "," +
-                StructuredName.PHONETIC_FAMILY_NAME + "," +
-                StructuredName.PHONETIC_MIDDLE_NAME + "," +
-                StructuredName.PHONETIC_GIVEN_NAME + "," +
-                StructuredName.PHONETIC_NAME_STYLE +
-         ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int DISPLAY_NAME = 3;
-        int PREFIX = 4;
-        int GIVEN_NAME = 5;
-        int MIDDLE_NAME = 6;
-        int FAMILY_NAME = 7;
-        int SUFFIX = 8;
-        int FULL_NAME_STYLE = 9;
-        int PHONETIC_FAMILY_NAME = 10;
-        int PHONETIC_MIDDLE_NAME = 11;
-        int PHONETIC_GIVEN_NAME = 12;
-        int PHONETIC_NAME_STYLE = 13;
-    }
-
-    private interface NoteInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Note.NOTE +
-         ") VALUES (?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int NOTE = 3;
-    }
-
-    private void importPeople() {
-        SQLiteStatement rawContactInsert = mTargetDb.compileStatement(RawContactsInsert.INSERT_SQL);
-        SQLiteStatement contactInsert = mTargetDb.compileStatement(ContactsInsert.INSERT_SQL);
-        SQLiteStatement structuredNameInsert =
-                mTargetDb.compileStatement(StructuredNameInsert.INSERT_SQL);
-        SQLiteStatement noteInsert = mTargetDb.compileStatement(NoteInsert.INSERT_SQL);
-        try {
-            String[] columns = mPhoneticNameAvailable
-                    ? PeopleQuery.COLUMNS_WITH_DISPLAY_NAME_WITH_PHONETIC_NAME
-                    : PeopleQuery.COLUMNS_WITH_DISPLAY_NAME_WITHOUT_PHONETIC_NAME;
-            Cursor c = mSourceDb.query(PeopleQuery.TABLE, columns, "name IS NULL", null, null,
-                    null, null);
-            try {
-                while (c.moveToNext()) {
-                    insertRawContact(c, rawContactInsert);
-                    insertContact(c, contactInsert);
-                    insertNote(c, noteInsert);
-                    mContactCount++;
-                }
-            } finally {
-                c.close();
-            }
-
-            columns = mPhoneticNameAvailable
-                    ? PeopleQuery.COLUMNS_WITH_PHONETIC_NAME
-                    : PeopleQuery.COLUMNS_WITHOUT_PHONETIC_NAME;
-            c = mSourceDb.query(PeopleQuery.TABLE, columns, "name IS NOT NULL", null, null, null,
-                    null);
-            try {
-                while (c.moveToNext()) {
-                    long id = insertRawContact(c, rawContactInsert);
-                    insertContact(c, contactInsert);
-                    insertStructuredName(c, structuredNameInsert);
-                    insertNote(c, noteInsert);
-                    mContactCount++;
-                }
-            } finally {
-                c.close();
-            }
-        } finally {
-            rawContactInsert.close();
-            contactInsert.close();
-            structuredNameInsert.close();
-            noteInsert.close();
-        }
-    }
-
-    private long insertRawContact(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(PeopleQuery._ID);
-        insert.bindLong(RawContactsInsert.ID, id);
-        insert.bindLong(RawContactsInsert.CONTACT_ID, id);
-        bindString(insert, RawContactsInsert.CUSTOM_RINGTONE,
-                c.getString(PeopleQuery.CUSTOM_RINGTONE));
-        bindString(insert, RawContactsInsert.DIRTY,
-                c.getString(PeopleQuery._SYNC_DIRTY));
-        insert.bindLong(RawContactsInsert.LAST_TIME_CONTACTED,
-                c.getLong(PeopleQuery.LAST_TIME_CONTACTED));
-        insert.bindLong(RawContactsInsert.SEND_TO_VOICEMAIL,
-                c.getLong(PeopleQuery.SEND_TO_VOICEMAIL));
-        insert.bindLong(RawContactsInsert.STARRED,
-                c.getLong(PeopleQuery.STARRED));
-        insert.bindLong(RawContactsInsert.TIMES_CONTACTED,
-                c.getLong(PeopleQuery.TIMES_CONTACTED));
-        bindString(insert, RawContactsInsert.SYNC1,
-                c.getString(PeopleQuery._SYNC_TIME));
-        bindString(insert, RawContactsInsert.SYNC2,
-                c.getString(PeopleQuery._SYNC_LOCAL_ID));
-        bindString(insert, RawContactsInsert.DISPLAY_NAME,
-                c.getString(PeopleQuery.NAME));
-
-        String account = c.getString(PeopleQuery._SYNC_ACCOUNT);
-        if (!TextUtils.isEmpty(account)) {
-            bindString(insert, RawContactsInsert.ACCOUNT_NAME, account);
-            bindString(insert, RawContactsInsert.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-            bindString(insert, RawContactsInsert.SOURCE_ID, c.getString(PeopleQuery._SYNC_ID));
-        } else {
-            insert.bindNull(RawContactsInsert.ACCOUNT_NAME);
-            insert.bindNull(RawContactsInsert.ACCOUNT_TYPE);
-            insert.bindNull(RawContactsInsert.SOURCE_ID);
-        }
-        insert(insert);
-        return id;
-    }
-
-    private void insertContact(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(PeopleQuery._ID);
-        insert.bindLong(ContactsInsert.ID, id);
-        bindString(insert, ContactsInsert.CUSTOM_RINGTONE,
-                c.getString(PeopleQuery.CUSTOM_RINGTONE));
-        insert.bindLong(ContactsInsert.LAST_TIME_CONTACTED,
-                c.getLong(PeopleQuery.LAST_TIME_CONTACTED));
-        insert.bindLong(ContactsInsert.SEND_TO_VOICEMAIL,
-                c.getLong(PeopleQuery.SEND_TO_VOICEMAIL));
-        insert.bindLong(ContactsInsert.STARRED,
-                c.getLong(PeopleQuery.STARRED));
-        insert.bindLong(ContactsInsert.TIMES_CONTACTED,
-                c.getLong(PeopleQuery.TIMES_CONTACTED));
-        insert.bindLong(ContactsInsert.NAME_RAW_CONTACT_ID, id);
-
-        insert(insert);
-    }
-
-    private void insertStructuredName(Cursor c, SQLiteStatement insert) {
-        String name = c.getString(PeopleQuery.NAME);
-        if (TextUtils.isEmpty(name)) {
-            return;
-        }
-
-        long id = c.getLong(PeopleQuery._ID);
-
-        insert.bindLong(StructuredNameInsert.RAW_CONTACT_ID, id);
-        insert.bindLong(StructuredNameInsert.MIMETYPE_ID, mStructuredNameMimetypeId);
-        bindString(insert, StructuredNameInsert.DISPLAY_NAME, name);
-
-        NameSplitter.Name splitName = new NameSplitter.Name();
-        mNameSplitter.split(splitName, name);
-
-        bindString(insert, StructuredNameInsert.PREFIX,
-                splitName.getPrefix());
-        bindString(insert, StructuredNameInsert.GIVEN_NAME,
-                splitName.getGivenNames());
-        bindString(insert, StructuredNameInsert.MIDDLE_NAME,
-                splitName.getMiddleName());
-        bindString(insert, StructuredNameInsert.FAMILY_NAME,
-                splitName.getFamilyName());
-        bindString(insert, StructuredNameInsert.SUFFIX,
-                splitName.getSuffix());
-        final String joined = mNameSplitter.join(splitName, true, true);
-        bindString(insert, StructuredNameInsert.DISPLAY_NAME, joined);
-
-        if (mPhoneticNameAvailable) {
-            String phoneticName = c.getString(PeopleQuery.PHONETIC_NAME);
-            if (phoneticName != null) {
-                int index = phoneticName.indexOf(' ');
-                if (index == -1) {
-                    splitName.phoneticFamilyName = phoneticName;
-                } else {
-                    splitName.phoneticFamilyName = phoneticName.substring(0, index).trim();
-                    splitName.phoneticGivenName = phoneticName.substring(index + 1).trim();
-                }
-            }
-        }
-
-        mNameSplitter.guessNameStyle(splitName);
-
-        int fullNameStyle = splitName.getFullNameStyle();
-        insert.bindLong(StructuredNameInsert.FULL_NAME_STYLE,
-                fullNameStyle);
-        bindString(insert, StructuredNameInsert.PHONETIC_FAMILY_NAME,
-                splitName.phoneticFamilyName);
-        bindString(insert, StructuredNameInsert.PHONETIC_MIDDLE_NAME,
-                splitName.phoneticMiddleName);
-        bindString(insert, StructuredNameInsert.PHONETIC_GIVEN_NAME,
-                splitName.phoneticGivenName);
-        insert.bindLong(StructuredNameInsert.PHONETIC_NAME_STYLE,
-                splitName.phoneticNameStyle);
-
-        long dataId = insert(insert);
-
-        mNameLookupBuilder.insertNameLookup(id, dataId, name,
-                mNameSplitter.getAdjustedFullNameStyle(fullNameStyle));
-
-        if (splitName.phoneticFamilyName != null
-                || splitName.phoneticMiddleName != null
-                || splitName.phoneticGivenName != null) {
-            mDbHelper.insertNameLookupForPhoneticName(id, dataId,
-                    splitName.phoneticFamilyName,
-                    splitName.phoneticMiddleName,
-                    splitName.phoneticGivenName);
-        }
-    }
-
-    private void insertNote(Cursor c, SQLiteStatement insert) {
-        String notes = c.getString(PeopleQuery.NOTES);
-
-        if (TextUtils.isEmpty(notes)) {
-            return;
-        }
-
-        long id = c.getLong(PeopleQuery._ID);
-        insert.bindLong(NoteInsert.RAW_CONTACT_ID, id);
-        insert.bindLong(NoteInsert.MIMETYPE_ID, mNoteMimetypeId);
-        bindString(insert, NoteInsert.NOTE, notes);
-        insert(insert);
-    }
-
-    private interface OrganizationsQuery {
-        String TABLE = "organizations";
-
-        String[] COLUMNS = {
-                "person", "company", "title", "isprimary", "type", "label",
-        };
-
-        static int PERSON = 0;
-        static int COMPANY = 1;
-        static int TITLE = 2;
-        static int ISPRIMARY = 3;
-        static int TYPE = 4;
-        static int LABEL = 5;
-    }
-
-    private interface OrganizationInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Organization.COMPANY + "," +
-                Organization.TITLE + "," +
-                Organization.TYPE + "," +
-                Organization.LABEL +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int COMPANY = 5;
-        int TITLE = 6;
-        int TYPE = 7;
-        int LABEL = 8;
-    }
-
-    private void importOrganizations() {
-        SQLiteStatement insert = mTargetDb.compileStatement(OrganizationInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(OrganizationsQuery.TABLE, OrganizationsQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertOrganization(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertOrganization(Cursor c, SQLiteStatement insert) {
-        long id = c.getLong(OrganizationsQuery.PERSON);
-        insert.bindLong(OrganizationInsert.RAW_CONTACT_ID, id);
-        insert.bindLong(OrganizationInsert.MIMETYPE_ID, mOrganizationMimetypeId);
-        bindString(insert, OrganizationInsert.IS_PRIMARY, c.getString(OrganizationsQuery.ISPRIMARY));
-        bindString(insert, OrganizationInsert.IS_SUPER_PRIMARY,
-                c.getString(OrganizationsQuery.ISPRIMARY));
-        bindString(insert, OrganizationInsert.COMPANY, c.getString(OrganizationsQuery.COMPANY));
-        bindString(insert, OrganizationInsert.TITLE, c.getString(OrganizationsQuery.TITLE));
-        bindString(insert, OrganizationInsert.TYPE, c.getString(OrganizationsQuery.TYPE));
-        bindString(insert, OrganizationInsert.LABEL, c.getString(OrganizationsQuery.LABEL));
-        insert(insert);
-    }
-
-    private interface ContactMethodsQuery {
-        String TABLE = "contact_methods";
-
-        String[] COLUMNS = {
-                "person", "kind", "data", "aux_data", "type", "label", "isprimary",
-        };
-
-        static int PERSON = 0;
-        static int KIND = 1;
-        static int DATA = 2;
-        static int AUX_DATA = 3;
-        static int TYPE = 4;
-        static int LABEL = 5;
-        static int ISPRIMARY = 6;
-    }
-
-    private interface EmailInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Email.DATA + "," +
-                Email.TYPE + "," +
-                Email.LABEL + "," +
-                Data.DATA14 +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int DATA = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int AUX_DATA = 8;
-    }
-
-    private interface ImInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Im.DATA + "," +
-                Im.TYPE + "," +
-                Im.LABEL + "," +
-                Data.DATA14 +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int DATA = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int AUX_DATA = 8;
-    }
-
-    private interface PostalInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                StructuredPostal.FORMATTED_ADDRESS + "," +
-                StructuredPostal.TYPE + "," +
-                StructuredPostal.LABEL + "," +
-                Data.DATA14 +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int DATA = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int AUX_DATA = 8;
-    }
-
-    private void importContactMethods() {
-        SQLiteStatement emailInsert = mTargetDb.compileStatement(EmailInsert.INSERT_SQL);
-        SQLiteStatement imInsert = mTargetDb.compileStatement(ImInsert.INSERT_SQL);
-        SQLiteStatement postalInsert = mTargetDb.compileStatement(PostalInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(ContactMethodsQuery.TABLE, ContactMethodsQuery.COLUMNS, null,
-                null, null, null, null);
-        try {
-            while (c.moveToNext()) {
-                int kind = c.getInt(ContactMethodsQuery.KIND);
-                switch (kind) {
-                    case android.provider.Contacts.KIND_EMAIL:
-                        insertEmail(c, emailInsert);
-                        break;
-
-                    case android.provider.Contacts.KIND_IM:
-                        insertIm(c, imInsert);
-                        break;
-
-                    case android.provider.Contacts.KIND_POSTAL:
-                        insertPostal(c, postalInsert);
-                        break;
-                }
-            }
-        } finally {
-            c.close();
-            emailInsert.close();
-            imInsert.close();
-            postalInsert.close();
-        }
-
-    }
-
-    private void insertEmail(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(ContactMethodsQuery.PERSON);
-        String email = c.getString(ContactMethodsQuery.DATA);
-
-        insert.bindLong(EmailInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(EmailInsert.MIMETYPE_ID, mEmailMimetypeId);
-        bindString(insert, EmailInsert.IS_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, EmailInsert.IS_SUPER_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, EmailInsert.DATA, email);
-        bindString(insert, EmailInsert.AUX_DATA, c.getString(ContactMethodsQuery.AUX_DATA));
-        bindString(insert, EmailInsert.TYPE, c.getString(ContactMethodsQuery.TYPE));
-        bindString(insert, EmailInsert.LABEL, c.getString(ContactMethodsQuery.LABEL));
-
-        long dataId = insert(insert);
-        mDbHelper.insertNameLookupForEmail(personId, dataId, email);
-    }
-
-    private void insertIm(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(ContactMethodsQuery.PERSON);
-
-        insert.bindLong(ImInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(ImInsert.MIMETYPE_ID, mImMimetypeId);
-        bindString(insert, ImInsert.IS_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, ImInsert.IS_SUPER_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, ImInsert.DATA, c.getString(ContactMethodsQuery.DATA));
-        bindString(insert, ImInsert.AUX_DATA, c.getString(ContactMethodsQuery.AUX_DATA));
-        bindString(insert, ImInsert.TYPE, c.getString(ContactMethodsQuery.TYPE));
-        bindString(insert, ImInsert.LABEL, c.getString(ContactMethodsQuery.LABEL));
-        insert(insert);
-    }
-
-    private void insertPostal(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(ContactMethodsQuery.PERSON);
-
-        insert.bindLong(PostalInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(PostalInsert.MIMETYPE_ID, mPostalMimetypeId);
-        bindString(insert, PostalInsert.IS_PRIMARY, c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, PostalInsert.IS_SUPER_PRIMARY,
-                c.getString(ContactMethodsQuery.ISPRIMARY));
-        bindString(insert, PostalInsert.DATA, c.getString(ContactMethodsQuery.DATA));
-        bindString(insert, PostalInsert.AUX_DATA, c.getString(ContactMethodsQuery.AUX_DATA));
-        bindString(insert, PostalInsert.TYPE, c.getString(ContactMethodsQuery.TYPE));
-        bindString(insert, PostalInsert.LABEL, c.getString(ContactMethodsQuery.LABEL));
-        insert(insert);
-    }
-
-    private interface PhonesQuery {
-        String TABLE = "phones";
-
-        String[] COLUMNS = {
-                "person", "type", "number", "label", "isprimary",
-        };
-
-        static int PERSON = 0;
-        static int TYPE = 1;
-        static int NUMBER = 2;
-        static int LABEL = 3;
-        static int ISPRIMARY = 4;
-    }
-
-    private interface PhoneInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Data.IS_PRIMARY + "," +
-                Data.IS_SUPER_PRIMARY + "," +
-                Phone.NUMBER + "," +
-                Phone.TYPE + "," +
-                Phone.LABEL + "," +
-                PhoneColumns.NORMALIZED_NUMBER +
-         ") VALUES (?,?,?,?,?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int IS_PRIMARY = 3;
-        int IS_SUPER_PRIMARY = 4;
-        int NUMBER = 5;
-        int TYPE = 6;
-        int LABEL = 7;
-        int NORMALIZED_NUMBER = 8;
-    }
-
-    private interface PhoneLookupInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.PHONE_LOOKUP + "(" +
-                PhoneLookupColumns.RAW_CONTACT_ID + "," +
-                PhoneLookupColumns.DATA_ID + "," +
-                PhoneLookupColumns.NORMALIZED_NUMBER + "," +
-                PhoneLookupColumns.MIN_MATCH +
-         ") VALUES (?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int DATA_ID = 2;
-        int NORMALIZED_NUMBER = 3;
-        int MIN_MATCH = 4;
-    }
-
-    private interface HasPhoneNumberUpdate {
-        String UPDATE_SQL = "UPDATE " + Tables.CONTACTS +
-                " SET " + Contacts.HAS_PHONE_NUMBER + "=1 WHERE " + Contacts._ID + "=?";
-
-        int CONTACT_ID = 1;
-    }
-
-    private void importPhones() {
-        SQLiteStatement phoneInsert = mTargetDb.compileStatement(PhoneInsert.INSERT_SQL);
-        SQLiteStatement phoneLookupInsert =
-                mTargetDb.compileStatement(PhoneLookupInsert.INSERT_SQL);
-        SQLiteStatement hasPhoneUpdate =
-                mTargetDb.compileStatement(HasPhoneNumberUpdate.UPDATE_SQL);
-        Cursor c = mSourceDb.query(PhonesQuery.TABLE, PhonesQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertPhone(c, phoneInsert, phoneLookupInsert, hasPhoneUpdate);
-            }
-        } finally {
-            c.close();
-            phoneInsert.close();
-            phoneLookupInsert.close();
-            hasPhoneUpdate.close();
-        }
-    }
-
-    private void insertPhone(Cursor c, SQLiteStatement phoneInsert,
-            SQLiteStatement phoneLookupInsert, SQLiteStatement hasPhoneUpdate) {
-        long lastUpdatedContact = -1;
-        long id = c.getLong(PhonesQuery.PERSON);
-        String number = c.getString(PhonesQuery.NUMBER);
-        String normalizedNumber = null;
-        if (number != null) {
-            normalizedNumber = PhoneNumberUtils.getStrippedReversed(number);
-        }
-        phoneInsert.bindLong(PhoneInsert.RAW_CONTACT_ID, id);
-        phoneInsert.bindLong(PhoneInsert.MIMETYPE_ID, mPhoneMimetypeId);
-        bindString(phoneInsert, PhoneInsert.IS_PRIMARY, c.getString(PhonesQuery.ISPRIMARY));
-        bindString(phoneInsert, PhoneInsert.IS_SUPER_PRIMARY, c.getString(PhonesQuery.ISPRIMARY));
-        bindString(phoneInsert, PhoneInsert.NUMBER, number);
-        bindString(phoneInsert, PhoneInsert.TYPE, c.getString(PhonesQuery.TYPE));
-        bindString(phoneInsert, PhoneInsert.LABEL, c.getString(PhonesQuery.LABEL));
-        bindString(phoneInsert, PhoneInsert.NORMALIZED_NUMBER, normalizedNumber);
-
-        long dataId = insert(phoneInsert);
-        if (normalizedNumber != null) {
-            phoneLookupInsert.bindLong(PhoneLookupInsert.RAW_CONTACT_ID, id);
-            phoneLookupInsert.bindLong(PhoneLookupInsert.DATA_ID, dataId);
-            phoneLookupInsert.bindString(PhoneLookupInsert.NORMALIZED_NUMBER, normalizedNumber);
-            phoneLookupInsert.bindString(PhoneLookupInsert.MIN_MATCH,
-                    PhoneNumberUtils.toCallerIDMinMatch(number));
-            insert(phoneLookupInsert);
-
-            if (lastUpdatedContact != id) {
-                lastUpdatedContact = id;
-                hasPhoneUpdate.bindLong(HasPhoneNumberUpdate.CONTACT_ID, id);
-                hasPhoneUpdate.execute();
-            }
-        }
-    }
-
-    private interface PhotosQuery {
-        String TABLE = "photos";
-
-        String[] COLUMNS = {
-                "person", "data", "_sync_id", "_sync_account"
-        };
-
-        static int PERSON = 0;
-        static int DATA = 1;
-        static int _SYNC_ID = 2;
-        static int _SYNC_ACCOUNT = 3;
-    }
-
-    private interface PhotoInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                Photo.PHOTO + "," +
-                Data.SYNC1 +
-         ") VALUES (?,?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int PHOTO = 3;
-        int SYNC1 = 4;
-    }
-
-    private interface PhotoIdUpdate {
-        String UPDATE_SQL = "UPDATE " + Tables.CONTACTS +
-                " SET " + Contacts.PHOTO_ID + "=? WHERE " + Contacts._ID + "=?";
-
-        int PHOTO_ID = 1;
-        int CONTACT_ID = 2;
-    }
-
-    private void importPhotos() {
-        SQLiteStatement insert = mTargetDb.compileStatement(PhotoInsert.INSERT_SQL);
-        SQLiteStatement photoIdUpdate = mTargetDb.compileStatement(PhotoIdUpdate.UPDATE_SQL);
-        Cursor c = mSourceDb.query(PhotosQuery.TABLE, PhotosQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertPhoto(c, insert, photoIdUpdate);
-            }
-        } finally {
-            c.close();
-            insert.close();
-            photoIdUpdate.close();
-        }
-    }
-
-    private void insertPhoto(Cursor c, SQLiteStatement insert, SQLiteStatement photoIdUpdate) {
-        if (c.isNull(PhotosQuery.DATA)) {
-            return;
-        }
-
-        long personId = c.getLong(PhotosQuery.PERSON);
-
-        insert.bindLong(PhotoInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(PhotoInsert.MIMETYPE_ID, mPhotoMimetypeId);
-        insert.bindBlob(PhotoInsert.PHOTO, c.getBlob(PhotosQuery.DATA));
-
-        String account = c.getString(PhotosQuery._SYNC_ACCOUNT);
-        if (!TextUtils.isEmpty(account)) {
-            bindString(insert, PhotoInsert.SYNC1, c.getString(PhotosQuery._SYNC_ID));
-        } else {
-            insert.bindNull(PhotoInsert.SYNC1);
-        }
-
-        long rowId = insert(insert);
-        photoIdUpdate.bindLong(PhotoIdUpdate.PHOTO_ID, rowId);
-        photoIdUpdate.bindLong(PhotoIdUpdate.CONTACT_ID, personId);
-        photoIdUpdate.execute();
-    }
-
-    private interface GroupMembershipQuery {
-        String TABLE = "groupmembership";
-
-        String[] COLUMNS = {
-                "person", "group_id", "group_sync_account", "group_sync_id"
-        };
-
-        static int PERSON_ID = 0;
-        static int GROUP_ID = 1;
-        static int GROUP_SYNC_ACCOUNT = 2;
-        static int GROUP_SYNC_ID = 3;
-    }
-
-    private interface GroupMembershipInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.DATA + "(" +
-                Data.RAW_CONTACT_ID + "," +
-                DataColumns.MIMETYPE_ID + "," +
-                GroupMembership.GROUP_ROW_ID +
-         ") VALUES (?,?,?)";
-
-        int RAW_CONTACT_ID = 1;
-        int MIMETYPE_ID = 2;
-        int GROUP_ROW_ID = 3;
-    }
-
-    private void importGroupMemberships() {
-        SQLiteStatement insert = mTargetDb.compileStatement(GroupMembershipInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(GroupMembershipQuery.TABLE, GroupMembershipQuery.COLUMNS, null,
-                null, null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertGroupMembership(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertGroupMembership(Cursor c, SQLiteStatement insert) {
-        long personId = c.getLong(GroupMembershipQuery.PERSON_ID);
-
-        long groupId = 0;
-        if (c.isNull(GroupMembershipQuery.GROUP_ID)) {
-            String account = c.getString(GroupMembershipQuery.GROUP_SYNC_ACCOUNT);
-            if (!TextUtils.isEmpty(account)) {
-                String syncId = c.getString(GroupMembershipQuery.GROUP_SYNC_ID);
-
-                Cursor cursor = mTargetDb.query(Tables.GROUPS,
-                        new String[]{Groups._ID}, Groups.SOURCE_ID + "=?", new String[]{syncId},
-                        null, null, null);
-                try {
-                    if (cursor.moveToFirst()) {
-                        groupId = cursor.getLong(0);
-                    }
-                } finally {
-                    cursor.close();
-                }
-
-                if (groupId == 0) {
-                    ContentValues values = new ContentValues();
-                    values.put(Groups.ACCOUNT_NAME, account);
-                    values.put(Groups.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-                    values.put(Groups.GROUP_VISIBLE, true);
-                    values.put(Groups.SOURCE_ID, syncId);
-                    groupId = mTargetDb.insert(Tables.GROUPS, null, values);
-                }
-            }
-        } else {
-            groupId = c.getLong(GroupMembershipQuery.GROUP_ID);
-        }
-
-        insert.bindLong(GroupMembershipInsert.RAW_CONTACT_ID, personId);
-        insert.bindLong(GroupMembershipInsert.MIMETYPE_ID, mGroupMembershipMimetypeId);
-        insert.bindLong(GroupMembershipInsert.GROUP_ROW_ID, groupId);
-        insert(insert);
-    }
-
-    private interface CallsQuery {
-        String TABLE = "calls";
-
-        String[] COLUMNS = {
-                "_id", "number", "date", "duration", "type", "new", "name", "numbertype",
-                "numberlabel"
-        };
-
-        static int ID = 0;
-        static int NUMBER = 1;
-        static int DATE = 2;
-        static int DURATION = 3;
-        static int TYPE = 4;
-        static int NEW = 5;
-        static int NAME = 6;
-        static int NUMBER_TYPE = 7;
-        static int NUMBER_LABEL = 8;
-    }
-
-    private void importCalls() {
-        Cursor c = mSourceDb.query(CallsQuery.TABLE, CallsQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertCall(c);
-            }
-        } finally {
-            c.close();
-        }
-    }
-
-    private void insertCall(Cursor c) {
-
-        // Cannot use batch operations here, because call log is serviced by a separate provider
-        mValues.clear();
-        mValues.put(Calls._ID, c.getLong(CallsQuery.ID));
-        mValues.put(Calls.NUMBER, c.getString(CallsQuery.NUMBER));
-        mValues.put(Calls.DATE, c.getLong(CallsQuery.DATE));
-        mValues.put(Calls.DURATION, c.getLong(CallsQuery.DURATION));
-        mValues.put(Calls.NEW, c.getLong(CallsQuery.NEW));
-        mValues.put(Calls.TYPE, c.getLong(CallsQuery.TYPE));
-        mValues.put(Calls.CACHED_NAME, c.getString(CallsQuery.NAME));
-        mValues.put(Calls.CACHED_NUMBER_LABEL, c.getString(CallsQuery.NUMBER_LABEL));
-        mValues.put(Calls.CACHED_NUMBER_TYPE, c.getString(CallsQuery.NUMBER_TYPE));
-
-        // TODO: confirm that we can use the CallLogProvider at this point, that it is guaranteed
-        // to have been registered.
-        mResolver.insert(Calls.CONTENT_URI, mValues);
-    }
-
-    private void updateDisplayNamesAndLookupKeys() {
-        // Compute display names, sort keys, lookup key, etc. for all Raw Cont
-        Cursor cursor = mResolver.query(RawContacts.CONTENT_URI,
-                new String[] { RawContacts._ID }, null, null, null);
-        try {
-            while (cursor.moveToNext()) {
-                long rawContactId = cursor.getLong(0);
-                mDbHelper.updateRawContactDisplayName(mTargetDb, rawContactId);
-                mContactsProvider.updateLookupKeyForRawContact(mTargetDb, rawContactId);
-            }
-        } finally {
-            cursor.close();
-        }
-    }
-
-    private interface DeletedPeopleQuery {
-        String TABLE = "_deleted_people";
-
-        String[] COLUMNS = {
-                "_sync_id", "_sync_account"
-        };
-
-        static int _SYNC_ID = 0;
-        static int _SYNC_ACCOUNT = 1;
-    }
-
-    private interface DeletedRawContactInsert {
-        String INSERT_SQL = "INSERT INTO " + Tables.RAW_CONTACTS + "(" +
-                RawContacts.ACCOUNT_NAME + "," +
-                RawContacts.ACCOUNT_TYPE + "," +
-                RawContacts.SOURCE_ID + "," +
-                RawContacts.DELETED + "," +
-                RawContacts.AGGREGATION_MODE +
-         ") VALUES (?,?,?,?,?)";
-
-
-        int ACCOUNT_NAME = 1;
-        int ACCOUNT_TYPE = 2;
-        int SOURCE_ID = 3;
-        int DELETED = 4;
-        int AGGREGATION_MODE = 5;
-    }
-
-    private void importDeletedPeople() {
-        SQLiteStatement insert = mTargetDb.compileStatement(DeletedRawContactInsert.INSERT_SQL);
-        Cursor c = mSourceDb.query(DeletedPeopleQuery.TABLE, DeletedPeopleQuery.COLUMNS, null, null,
-                null, null, null);
-        try {
-            while (c.moveToNext()) {
-                insertDeletedPerson(c, insert);
-            }
-        } finally {
-            c.close();
-            insert.close();
-        }
-    }
-
-    private void insertDeletedPerson(Cursor c, SQLiteStatement insert) {
-        String account = c.getString(DeletedPeopleQuery._SYNC_ACCOUNT);
-        if (account == null) {
-            return;
-        }
-
-        insert.bindString(DeletedRawContactInsert.ACCOUNT_NAME, account);
-        insert.bindString(DeletedRawContactInsert.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
-        bindString(insert, DeletedRawContactInsert.SOURCE_ID,
-                c.getString(DeletedPeopleQuery._SYNC_ID));
-        insert.bindLong(DeletedRawContactInsert.DELETED, 1);
-        insert.bindLong(DeletedRawContactInsert.AGGREGATION_MODE,
-                RawContacts.AGGREGATION_MODE_DISABLED);
-        insert(insert);
-    }
-
-    private void bindString(SQLiteStatement insert, int index, String string) {
-        if (string == null) {
-            insert.bindNull(index);
-        } else {
-            insert.bindString(index, string);
-        }
-    }
-
-    private long insert(SQLiteStatement insertStatement) {
-        long rowId = insertStatement.executeInsert();
-        if (rowId == 0) {
-            throw new RuntimeException("Insert failed");
-        }
-
-        mBatchCounter++;
-        if (mBatchCounter >= INSERT_BATCH_SIZE) {
-            mTargetDb.setTransactionSuccessful();
-            mTargetDb.endTransaction();
-            mTargetDb.beginTransaction();
-            mBatchCounter = 0;
-        }
-        return rowId;
-    }
-}
diff --git a/src/com/android/providers/contacts/MemoryCursor.java b/src/com/android/providers/contacts/MemoryCursor.java
new file mode 100644
index 0000000..23402a6
--- /dev/null
+++ b/src/com/android/providers/contacts/MemoryCursor.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.providers.contacts;
+
+import android.database.AbstractWindowedCursor;
+import android.database.Cursor;
+import android.database.CursorWindow;
+import android.database.DatabaseUtils;
+
+/**
+ * Implementation of an in-memory cursor backed by a cursor window.
+ */
+public class MemoryCursor extends AbstractWindowedCursor {
+
+    private final String[] mColumnNames;
+
+    public MemoryCursor(String name, String[] columnNames) {
+        setWindow(new CursorWindow(name));
+        mColumnNames = columnNames;
+    }
+
+    public void fillFromCursor(Cursor cursor) {
+        DatabaseUtils.cursorFillWindow(cursor, 0, getWindow());
+    }
+
+    @Override
+    public int getCount() {
+        return getWindow().getNumRows();
+    }
+
+    @Override
+    public String[] getColumnNames() {
+        return mColumnNames;
+    }
+}
diff --git a/src/com/android/providers/contacts/NameSplitter.java b/src/com/android/providers/contacts/NameSplitter.java
index 27e5056..fd5b096 100644
--- a/src/com/android/providers/contacts/NameSplitter.java
+++ b/src/com/android/providers/contacts/NameSplitter.java
@@ -15,6 +15,8 @@
  */
 package com.android.providers.contacts;
 
+import com.android.providers.contacts.util.NeededForTesting;
+
 import android.content.ContentValues;
 import android.provider.ContactsContract.FullNameStyle;
 import android.provider.ContactsContract.PhoneticNameStyle;
@@ -106,6 +108,7 @@
             this.suffix = suffix;
         }
 
+        @NeededForTesting
         public String getPrefix() {
             return prefix;
         }
@@ -122,6 +125,7 @@
             return familyName;
         }
 
+        @NeededForTesting
         public String getSuffix() {
             return suffix;
         }
diff --git a/src/com/android/providers/contacts/ProjectionMap.java b/src/com/android/providers/contacts/ProjectionMap.java
deleted file mode 100644
index f4c76d6..0000000
--- a/src/com/android/providers/contacts/ProjectionMap.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.providers.contacts;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A convenience wrapper for a projection map.  Makes it easier to create and use projection maps.
- */
-public class ProjectionMap extends HashMap<String, String> {
-
-    public static class Builder {
-
-        private ProjectionMap mMap = new ProjectionMap();
-
-        public Builder add(String column) {
-            mMap.putColumn(column, column);
-            return this;
-        }
-
-        public Builder add(String alias, String expression) {
-            mMap.putColumn(alias, expression + " AS " + alias);
-            return this;
-        }
-
-        public Builder addAll(ProjectionMap map) {
-            for (Map.Entry<String, String> entry : map.entrySet()) {
-                mMap.putColumn(entry.getKey(), entry.getValue());
-            }
-            return this;
-        }
-
-        public ProjectionMap build() {
-            String[] columns = new String[mMap.size()];
-            mMap.keySet().toArray(columns);
-            Arrays.sort(columns);
-            mMap.mColumns = columns;
-            return mMap;
-        }
-
-    }
-
-    private String[] mColumns;
-
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Returns a sorted array of all column names in the projection map.
-     */
-    public String[] getColumnNames() {
-        return mColumns;
-    }
-
-    private void putColumn(String alias, String column) {
-        super.put(alias, column);
-    }
-
-    @Override
-    public String put(String key, String value) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void putAll(Map<? extends String, ? extends String> map) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/com/android/providers/contacts/VoicemailContentProvider.java b/src/com/android/providers/contacts/VoicemailContentProvider.java
index ec1fa38..79d8f92 100644
--- a/src/com/android/providers/contacts/VoicemailContentProvider.java
+++ b/src/com/android/providers/contacts/VoicemailContentProvider.java
@@ -49,8 +49,6 @@
  */
 public class VoicemailContentProvider extends ContentProvider
         implements VoicemailTable.DelegateHelper {
-    private static final String TAG = "VoicemailContentProvider";
-
     private VoicemailPermissions mVoicemailPermissions;
     private VoicemailTable.Delegate mVoicemailContentTable;
     private VoicemailTable.Delegate mVoicemailStatusTable;
diff --git a/src/com/android/providers/contacts/VoicemailContentTable.java b/src/com/android/providers/contacts/VoicemailContentTable.java
index 4d23531..3b72653 100644
--- a/src/com/android/providers/contacts/VoicemailContentTable.java
+++ b/src/com/android/providers/contacts/VoicemailContentTable.java
@@ -19,6 +19,7 @@
 import static com.android.providers.contacts.util.DbQueryUtils.concatenateClauses;
 import static com.android.providers.contacts.util.DbQueryUtils.getEqualityClause;
 
+import com.android.common.content.ProjectionMap;
 import com.android.providers.contacts.VoicemailContentProvider.UriData;
 import com.android.providers.contacts.util.CloseUtils;
 
@@ -245,7 +246,7 @@
 
     /** Creates a clause to restrict the selection to only voicemail call type.*/
     private String getCallTypeClause() {
-        return getEqualityClause(Calls.TYPE, String.valueOf(Calls.VOICEMAIL_TYPE));
+        return getEqualityClause(Calls.TYPE, Calls.VOICEMAIL_TYPE);
     }
 
     private DatabaseModifier getDatabaseModifier(SQLiteDatabase db) {
diff --git a/src/com/android/providers/contacts/VoicemailStatusTable.java b/src/com/android/providers/contacts/VoicemailStatusTable.java
index 24714ed..a0a61ba 100644
--- a/src/com/android/providers/contacts/VoicemailStatusTable.java
+++ b/src/com/android/providers/contacts/VoicemailStatusTable.java
@@ -18,6 +18,7 @@
 
 import static com.android.providers.contacts.util.DbQueryUtils.concatenateClauses;
 
+import com.android.common.content.ProjectionMap;
 import com.android.providers.contacts.VoicemailContentProvider.UriData;
 
 import android.content.ContentUris;
diff --git a/src/com/android/providers/contacts/util/DbQueryUtils.java b/src/com/android/providers/contacts/util/DbQueryUtils.java
index 58c8bb1..c853a96 100644
--- a/src/com/android/providers/contacts/util/DbQueryUtils.java
+++ b/src/com/android/providers/contacts/util/DbQueryUtils.java
@@ -34,8 +34,13 @@
         return getClauseWithOperator(field, "=", value);
     }
 
+    /** Returns a WHERE clause asserting equality of a field to a value. */
+    public static String getEqualityClause(String field, long value) {
+        return getClauseWithOperator(field, "=", value);
+    }
+
     /** Returns a WHERE clause asserting in-equality of a field to a value. */
-    public static String getInequalityClause(String field, String value) {
+    public static String getInequalityClause(String field, long value) {
         return getClauseWithOperator(field, "!=", value);
     }
 
@@ -49,6 +54,16 @@
         return clause.toString();
     }
 
+    private static String getClauseWithOperator(String field, String operator, long value) {
+        StringBuilder clause = new StringBuilder();
+        clause.append("(");
+        clause.append(field);
+        clause.append(" ").append(operator).append(" ");
+        clause.append(value);
+        clause.append(")");
+        return clause.toString();
+    }
+
     /** Concatenates any number of clauses using "AND". */
     public static String concatenateClauses(String... clauses) {
         StringBuilder builder = new StringBuilder();
diff --git a/src/com/android/providers/contacts/util/NeededForTesting.java b/src/com/android/providers/contacts/util/NeededForTesting.java
new file mode 100644
index 0000000..0eb418e
--- /dev/null
+++ b/src/com/android/providers/contacts/util/NeededForTesting.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.contacts.util;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that the class, constructor, method or field is used by tests and therefore cannot be
+ * removed by tools like ProGuard.
+ */
+@Retention(RetentionPolicy.CLASS)
+@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD})
+public @interface NeededForTesting {}
diff --git a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
index 33a39ec..c008003 100644
--- a/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/BaseContactsProvider2Test.java
@@ -41,6 +41,7 @@
 import android.provider.ContactsContract.CommonDataKinds.Organization;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.Contacts;
@@ -337,6 +338,23 @@
         return resultUri;
     }
 
+    protected Uri insertSipAddress(long rawContactId, String sipAddress) {
+        return insertSipAddress(rawContactId, sipAddress, false);
+    }
+
+    protected Uri insertSipAddress(long rawContactId, String sipAddress, boolean primary) {
+        ContentValues values = new ContentValues();
+        values.put(Data.RAW_CONTACT_ID, rawContactId);
+        values.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE);
+        values.put(SipAddress.SIP_ADDRESS, sipAddress);
+        if (primary) {
+            values.put(Data.IS_PRIMARY, 1);
+        }
+
+        Uri resultUri = mResolver.insert(Data.CONTENT_URI, values);
+        return resultUri;
+    }
+
     protected Uri insertNickname(long rawContactId, String nickname) {
         ContentValues values = new ContentValues();
         values.put(Data.RAW_CONTACT_ID, rawContactId);
diff --git a/tests/src/com/android/providers/contacts/ContactAggregatorPerformanceTest.java b/tests/src/com/android/providers/contacts/ContactAggregatorPerformanceTest.java
deleted file mode 100644
index 013a706..0000000
--- a/tests/src/com/android/providers/contacts/ContactAggregatorPerformanceTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2009 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.providers.contacts;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.res.Resources;
-import android.os.Debug;
-import android.provider.ContactsContract;
-import android.test.AndroidTestCase;
-import android.test.IsolatedContext;
-import android.test.RenamingDelegatingContext;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.util.Log;
-
-/**
- * Performance test for {@link ContactAggregator}.
- *
- * Run the test like this:
- * <code>
- * adb push <large contacts2.db> \
- *         data/data/com.android.providers.contacts/databases/perf.contacts2.db
- * adb shell am instrument \
- *         -e class com.android.providers.contacts.ContactAggregatorPerformanceTest \
- *         -w com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
- * </code>
- */
-@LargeTest
-public class ContactAggregatorPerformanceTest extends AndroidTestCase {
-
-    private static final String TAG = "ContactAggregatorPerformanceTest";
-    private static final boolean TRACE = false;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    public void testPerformance() {
-        final Context targetContext = getContext();
-        MockContentResolver resolver = new MockContentResolver();
-        MockContext context = new MockContext() {
-            @Override
-            public Resources getResources() {
-                return targetContext.getResources();
-            }
-
-            @Override
-            public String getPackageName() {
-                return "no.package";
-            }
-
-            @Override
-            public ApplicationInfo getApplicationInfo() {
-                ApplicationInfo ai = new ApplicationInfo();
-                ai.packageName = "contactsTestPackage";
-                return ai;
-            }
-        };
-        RenamingDelegatingContext targetContextWrapper =
-                new RenamingDelegatingContext(context, targetContext, "perf.");
-        targetContextWrapper.makeExistingFilesAndDbsAccessible();
-        IsolatedContext providerContext = new IsolatedContext(resolver, targetContextWrapper);
-        SynchronousContactsProvider2 provider = new SynchronousContactsProvider2();
-        provider.setDataWipeEnabled(false);
-        provider.attachInfo(providerContext, null);
-        resolver.addProvider(ContactsContract.AUTHORITY, provider);
-
-        long rawContactCount = provider.getRawContactCount();
-        if (rawContactCount == 0) {
-            Log.w(TAG, "The test has not been set up. Use this command to copy a contact db"
-                    + " to the device:\nadb push <large contacts2.db> "
-                    + "data/data/com.android.providers.contacts/databases/perf.contacts2.db");
-            return;
-        }
-
-        provider.prepareForFullAggregation(500);
-        rawContactCount = provider.getRawContactCount();
-        long start = System.currentTimeMillis();
-        if (TRACE) {
-            Debug.startMethodTracing("aggregation");
-        }
-
-        // TODO
-//        provider.aggregate();
-
-        if (TRACE) {
-            Debug.stopMethodTracing();
-        }
-        long end = System.currentTimeMillis();
-        long contactCount = provider.getContactCount();
-
-        Log.i(TAG, String.format("Aggregated contacts in %d ms.\n" +
-                "Raw contacts: %d\n" +
-                "Aggregated contacts: %d\n" +
-                "Per raw contact: %.3f",
-                end-start,
-                rawContactCount,
-                contactCount,
-                ((double)(end-start)/rawContactCount)));
-
-        provider.getDatabaseHelper().close();
-    }
-}
-
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index cbb1c49..2d4fa64 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -36,12 +36,14 @@
 import android.os.AsyncTask;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.AggregationExceptions;
+import android.provider.ContactsContract.CommonDataKinds.Callable;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.CommonDataKinds.Im;
 import android.provider.ContactsContract.CommonDataKinds.Organization;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.ContactCounts;
@@ -556,6 +558,7 @@
                 Groups.SYNC4,
                 Groups.SUMMARY_COUNT,
                 Groups.SUMMARY_WITH_PHONES,
+                Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
         });
     }
 
@@ -917,15 +920,33 @@
     }
 
     public void testPhonesFilterQuery() {
-        long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1);
+        testPhonesFilterQueryInter(Phone.CONTENT_FILTER_URI);
+    }
+
+    /**
+     * A convenient method for {@link #testPhonesFilterQuery()} and
+     * {@link #testCallablesFilterQuery()}.
+     *
+     * This confirms if both URIs return identical results for phone-only contacts and
+     * appropriately different results for contacts with sip addresses.
+     *
+     * @param baseFilterUri Either {@link Phone#CONTENT_FILTER_URI} or
+     * {@link Callable#CONTENT_FILTER_URI}.
+     */
+    private void testPhonesFilterQueryInter(Uri baseFilterUri) {
+        assertTrue("Unsupported Uri (" + baseFilterUri + ")",
+                Phone.CONTENT_FILTER_URI.equals(baseFilterUri)
+                        || Callable.CONTENT_FILTER_URI.equals(baseFilterUri));
+
+        final long rawContactId1 = createRawContactWithName("Hot", "Tamale", ACCOUNT_1);
         insertPhoneNumber(rawContactId1, "1-800-466-4411");
 
-        long rawContactId2 = createRawContactWithName("Chilled", "Guacamole", ACCOUNT_2);
+        final long rawContactId2 = createRawContactWithName("Chilled", "Guacamole", ACCOUNT_2);
         insertPhoneNumber(rawContactId2, "1-800-466-5432");
         insertPhoneNumber(rawContactId2, "0@example.com", false, Phone.TYPE_PAGER);
         insertPhoneNumber(rawContactId2, "1@example.com", false, Phone.TYPE_PAGER);
 
-        Uri filterUri1 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "tamale");
+        final Uri filterUri1 = Uri.withAppendedPath(baseFilterUri, "tamale");
         ContentValues values = new ContentValues();
         values.put(Contacts.DISPLAY_NAME, "Hot Tamale");
         values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
@@ -934,16 +955,16 @@
         values.putNull(Phone.LABEL);
         assertStoredValuesWithProjection(filterUri1, values);
 
-        Uri filterUri2 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "1-800-GOOG-411");
+        final Uri filterUri2 = Uri.withAppendedPath(baseFilterUri, "1-800-GOOG-411");
         assertStoredValues(filterUri2, values);
 
-        Uri filterUri3 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "18004664");
+        final Uri filterUri3 = Uri.withAppendedPath(baseFilterUri, "18004664");
         assertStoredValues(filterUri3, values);
 
-        Uri filterUri4 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "encilada");
+        final Uri filterUri4 = Uri.withAppendedPath(baseFilterUri, "encilada");
         assertEquals(0, getCount(filterUri4, null, null));
 
-        Uri filterUri5 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "*");
+        final Uri filterUri5 = Uri.withAppendedPath(baseFilterUri, "*");
         assertEquals(0, getCount(filterUri5, null, null));
 
         ContentValues values1 = new ContentValues();
@@ -967,7 +988,42 @@
         values3.put(Phone.TYPE, Phone.TYPE_PAGER);
         values3.putNull(Phone.LABEL);
 
-        Uri filterUri6 = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, "Chilled");
+        final Uri filterUri6 = Uri.withAppendedPath(baseFilterUri, "Chilled");
+        assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} );
+
+        // Insert a SIP address. From here, Phone URI and Callable URI may return different results
+        // than each other.
+        insertSipAddress(rawContactId1, "sip_hot_tamale@example.com");
+        insertSipAddress(rawContactId1, "sip:sip_hot@example.com");
+
+        final Uri filterUri7 = Uri.withAppendedPath(baseFilterUri, "sip_hot");
+        final Uri filterUri8 = Uri.withAppendedPath(baseFilterUri, "sip_hot_tamale");
+        if (Callable.CONTENT_FILTER_URI.equals(baseFilterUri)) {
+            ContentValues values4 = new ContentValues();
+            values4.put(Contacts.DISPLAY_NAME, "Hot Tamale");
+            values4.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE);
+            values4.put(SipAddress.SIP_ADDRESS, "sip_hot_tamale@example.com");
+
+            ContentValues values5 = new ContentValues();
+            values5.put(Contacts.DISPLAY_NAME, "Hot Tamale");
+            values5.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE);
+            values5.put(SipAddress.SIP_ADDRESS, "sip:sip_hot@example.com");
+            assertStoredValues(filterUri1, new ContentValues[] {values, values4, values5});
+
+            assertStoredValues(filterUri7, new ContentValues[] {values4, values5});
+            assertStoredValues(filterUri8, values4);
+        } else {
+            // Sip address should not affect Phone URI.
+            assertStoredValuesWithProjection(filterUri1, values);
+            assertEquals(0, getCount(filterUri7, null, null));
+        }
+
+        // Sanity test. Run tests for "Chilled Guacamole" again and see nothing changes
+        // after the Sip address being inserted.
+        assertStoredValues(filterUri2, values);
+        assertStoredValues(filterUri3, values);
+        assertEquals(0, getCount(filterUri4, null, null));
+        assertEquals(0, getCount(filterUri5, null, null));
         assertStoredValues(filterUri6, new ContentValues[] {values1, values2, values3} );
     }
 
@@ -1171,6 +1227,43 @@
         assertNetworkNotified(true);
     }
 
+    /** Tests if {@link Callable#CONTENT_URI} returns both phones and sip addresses. */
+    public void testCallablesQuery() {
+        long rawContactId1 = createRawContactWithName("Meghan", "Knox");
+        long phoneId1 = ContentUris.parseId(insertPhoneNumber(rawContactId1, "18004664411"));
+        long contactId1 = queryContactId(rawContactId1);
+
+        long rawContactId2 = createRawContactWithName("John", "Doe");
+        long sipAddressId2 = ContentUris.parseId(
+                insertSipAddress(rawContactId2, "sip@example.com"));
+        long contactId2 = queryContactId(rawContactId2);
+
+        ContentValues values1 = new ContentValues();
+        values1.put(Data._ID, phoneId1);
+        values1.put(Data.RAW_CONTACT_ID, rawContactId1);
+        values1.put(RawContacts.CONTACT_ID, contactId1);
+        values1.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
+        values1.put(Phone.NUMBER, "18004664411");
+        values1.put(Phone.TYPE, Phone.TYPE_HOME);
+        values1.putNull(Phone.LABEL);
+        values1.put(Contacts.DISPLAY_NAME, "Meghan Knox");
+
+        ContentValues values2 = new ContentValues();
+        values2.put(Data._ID, sipAddressId2);
+        values2.put(Data.RAW_CONTACT_ID, rawContactId2);
+        values2.put(RawContacts.CONTACT_ID, contactId2);
+        values2.put(Data.MIMETYPE, SipAddress.CONTENT_ITEM_TYPE);
+        values2.put(SipAddress.SIP_ADDRESS, "sip@example.com");
+        values2.put(Contacts.DISPLAY_NAME, "John Doe");
+
+        assertEquals(2, getCount(Callable.CONTENT_URI, null, null));
+        assertStoredValues(Callable.CONTENT_URI, new ContentValues[] { values1, values2 });
+    }
+
+    public void testCallablesFilterQuery() {
+        testPhonesFilterQueryInter(Callable.CONTENT_FILTER_URI);
+    }
+
     public void testEmailsQuery() {
         ContentValues values = new ContentValues();
         values.put(RawContacts.CUSTOM_RINGTONE, "d");
@@ -2295,19 +2388,29 @@
 
         assertStoredValues(Groups.CONTENT_SUMMARY_URI, new ContentValues[] { v1, v2, v3 });
 
-        final Uri uri = Groups.CONTENT_SUMMARY_URI.buildUpon()
-                .appendQueryParameter(Groups.PARAM_RETURN_GROUP_COUNT_PER_ACCOUNT, "true")
-                .build();
-        v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1);
-        v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
-        v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
+        final Uri uri = Groups.CONTENT_SUMMARY_URI;
+
+        // TODO Once SUMMARY_GROUP_COUNT_PER_ACCOUNT is supported remove all the if(false).
+        if (false) {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 1);
+            v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
+            v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 2);
+        } else {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+            v2.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+            v3.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+        }
         assertStoredValues(uri, new ContentValues[] { v1, v2, v3 });
 
         // Introduce another group in account1, testing SUMMARY_GROUP_COUNT_PER_ACCOUNT correctly
         // reflects the change.
         final long groupId4 = createGroup(account1, "sourceId4", "title4");
-        v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
-                v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1);
+        if (false) {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
+                    v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT) + 1);
+        } else {
+            v1.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+        }
         ContentValues v4 = new ContentValues();
         v4.put(Groups._ID, groupId4);
         v4.put(Groups.TITLE, "title4");
@@ -2316,8 +2419,12 @@
         v4.put(Groups.ACCOUNT_TYPE, account1.type);
         v4.put(Groups.SUMMARY_COUNT, 0);
         v4.put(Groups.SUMMARY_WITH_PHONES, 0);
-        v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
-                v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT));
+        if (false) {
+            v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT,
+                    v1.getAsInteger(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT));
+        } else {
+            v4.put(Groups.SUMMARY_GROUP_COUNT_PER_ACCOUNT, 0);
+        }
         assertStoredValues(uri, new ContentValues[] { v1, v2, v3, v4 });
 
         // We change the tables dynamically according to the requested projection.
@@ -2763,6 +2870,19 @@
         assertStoredValues(filterUri, values);
     }
 
+    public void testCountPhoneNumberDigits() {
+        assertEquals(10, ContactsProvider2.countPhoneNumberDigits("86 (0) 5-55-12-34"));
+        assertEquals(10, ContactsProvider2.countPhoneNumberDigits("860 555-1234"));
+        assertEquals(3, ContactsProvider2.countPhoneNumberDigits("860"));
+        assertEquals(10, ContactsProvider2.countPhoneNumberDigits("8605551234"));
+        assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860555"));
+        assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860 555"));
+        assertEquals(6, ContactsProvider2.countPhoneNumberDigits("860-555"));
+        assertEquals(12, ContactsProvider2.countPhoneNumberDigits("+441234098765"));
+        assertEquals(0, ContactsProvider2.countPhoneNumberDigits("44+1234098765"));
+        assertEquals(0, ContactsProvider2.countPhoneNumberDigits("+441234098foo"));
+    }
+
     public void testSearchSnippetPhone() throws Exception {
         long rawContactId = createRawContact();
         long contactId = queryContactId(rawContactId);
diff --git a/tests/src/com/android/providers/contacts/GlobalSearchSupportTest.java b/tests/src/com/android/providers/contacts/GlobalSearchSupportTest.java
index 066c47e..9bfe9d6 100644
--- a/tests/src/com/android/providers/contacts/GlobalSearchSupportTest.java
+++ b/tests/src/com/android/providers/contacts/GlobalSearchSupportTest.java
@@ -113,46 +113,60 @@
         GoldenContact contact = new GoldenContactBuilder().name("Deer", "Dough").photo(
                 loadTestPhoto()).phone("1-800-4664-411").build();
         new SuggestionTesterBuilder(contact).query("1800").expectIcon1Uri(true).expectedText1(
-                "Deer Dough").expectedText2("1-800-4664-411").build().test();
+                "Deer Dough").expectedText2("1-800-4664-411").expectedCreateContactNumber("1800")
+                .build().test();
     }
 
-    public void testSearchSuggestionsByPhoneNumberOnPhone() throws Exception {
-        getContactsProvider().setIsPhone(true);
-
+    public void assertCreateContactSuggestion(Cursor c, String number) {
         ContentValues values = new ContentValues();
-
-        Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY)
-                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath("12345678").build();
-
-        Cursor c = mResolver.query(searchUri, null, null, null, null);
-        assertEquals(2, c.getCount());
-        c.moveToFirst();
-
-        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Dial number");
-        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345678");
-        values.put(SearchManager.SUGGEST_COLUMN_ICON_1,
-                String.valueOf(com.android.internal.R.drawable.call_contact));
-        values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
-                Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED);
-        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345678");
-        values.putNull(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID);
-        assertCursorValues(c, values);
-
-        c.moveToNext();
-        values.clear();
         values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Create contact");
-        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using 12345678");
+        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using "+ number);
         values.put(SearchManager.SUGGEST_COLUMN_ICON_1,
                 String.valueOf(com.android.internal.R.drawable.create_contact));
         values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
                 Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED);
-        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:12345678");
+        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:" + number);
         values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
                 SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT);
         assertCursorValues(c, values);
+    }
+
+    public void searchSuggestionsByPhoneNumberOnPhoneTest(String number) {
+        getContactsProvider().setIsPhone(true);
+        getContactsProvider().setIsVoiceCapable(true);
+
+        ContentValues values = new ContentValues();
+
+        Uri searchUri = new Uri.Builder().scheme("content").authority(ContactsContract.AUTHORITY)
+                .appendPath(SearchManager.SUGGEST_URI_PATH_QUERY).appendPath(number).build();
+
+        Cursor c = mResolver.query(searchUri, null, null, null, null);
+        assertEquals(2, c.getCount());
+        c.moveToFirst();
+        values.put(SearchManager.SUGGEST_COLUMN_TEXT_1, "Dial number");
+        values.put(SearchManager.SUGGEST_COLUMN_TEXT_2, "using " + number);
+        values.put(SearchManager.SUGGEST_COLUMN_ICON_1,
+                String.valueOf(com.android.internal.R.drawable.call_contact));
+        values.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
+                Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED);
+        values.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, "tel:" + number);
+        values.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
+                SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT);
+        assertCursorValues(c, values);
+
+        c.moveToNext();
+        assertCreateContactSuggestion(c, number);
         c.close();
     }
 
+    public void testSearchSuggestionsByPhoneNumberOnPhone() throws Exception {
+        searchSuggestionsByPhoneNumberOnPhoneTest("12345678");
+    }
+
+    public void testSearchSuggestionsByAlphnumericPhoneNumberOnPhone() throws Exception {
+        searchSuggestionsByPhoneNumberOnPhoneTest("1800-flowers");
+    }
+
     /**
      * Tests that the quick search suggestion returns the expected contact
      * information.
@@ -171,6 +185,8 @@
 
         private final String expectedText2;
 
+        private final String expectedCreateContactNumber;
+
         public SuggestionTester(SuggestionTesterBuilder builder) {
             contact = builder.contact;
             query = builder.query;
@@ -178,6 +194,7 @@
             expectedIcon2 = builder.expectedIcon2;
             expectedText1 = builder.expectedText1;
             expectedText2 = builder.expectedText2;
+            expectedCreateContactNumber = builder.expectedCreateContactNumber;
         }
 
         /**
@@ -205,7 +222,7 @@
                     .appendPath(query).build();
 
             Cursor c = mResolver.query(searchUri, null, null, null, null);
-            assertEquals(1, c.getCount());
+            assertEquals(expectedCreateContactNumber == null ? 1 : 2, c.getCount());
             c.moveToFirst();
 
             String icon1 = c.getString(c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1));
@@ -219,6 +236,12 @@
             // SearchManager does not declare a constant for _id
             ContentValues values = getContactValues();
             assertCursorValues(c, values);
+
+            if (expectedCreateContactNumber != null) {
+                c.moveToNext();
+                assertCreateContactSuggestion(c, expectedCreateContactNumber);
+            }
+
             c.close();
         }
 
@@ -337,6 +360,8 @@
 
         private String expectedText2;
 
+        private String expectedCreateContactNumber;
+
         public SuggestionTesterBuilder(GoldenContact contact) {
             this.contact = contact;
         }
@@ -393,5 +418,10 @@
             expectedText2 = value;
             return this;
         }
+
+        public SuggestionTesterBuilder expectedCreateContactNumber(String number) {
+            expectedCreateContactNumber = number;
+            return this;
+        }
     }
 }
diff --git a/tests/src/com/android/providers/contacts/GroupsTest.java b/tests/src/com/android/providers/contacts/GroupsTest.java
index 56b7100..ae95884 100644
--- a/tests/src/com/android/providers/contacts/GroupsTest.java
+++ b/tests/src/com/android/providers/contacts/GroupsTest.java
@@ -46,6 +46,7 @@
  *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
  * </code>
  */
+@MediumTest
 public class GroupsTest extends BaseContactsProvider2Test {
 
     private static final String GROUP_GREY = "Grey";
@@ -64,7 +65,6 @@
     private static final String PHONE_CHARLIE_1 = "555-4444";
     private static final String PHONE_CHARLIE_2 = "555-5555";
 
-    @LargeTest
     public void testGroupSummary() {
 
         // Clear any existing data before starting
@@ -144,7 +144,6 @@
         cursor.close();
     }
 
-    @MediumTest
     public void testGroupDirtySetOnChange() {
         Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI,
                 createGroup(mAccount, "gsid1", "title1"));
@@ -153,7 +152,6 @@
         assertDirty(uri, false);
     }
 
-    @MediumTest
     public void testMarkAsDirtyParameter() {
         Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI,
                 createGroup(mAccount, "gsid1", "title1"));
@@ -166,7 +164,6 @@
         assertDirty(uri, false);
     }
 
-    @MediumTest
     public void testGroupDirtyClearedWhenSetExplicitly() {
         Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI,
                 createGroup(mAccount, "gsid1", "title1"));
@@ -180,7 +177,6 @@
         assertDirty(uri, false);
     }
 
-    @MediumTest
     public void testGroupDeletion1() {
         long groupId = createGroup(mAccount, "g1", "gt1");
         Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
@@ -195,7 +191,6 @@
         assertEquals(0, getCount(uri, null, null));
     }
 
-    @MediumTest
     public void testGroupDeletion2() {
         long groupId = createGroup(mAccount, "g1", "gt1");
         Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
@@ -206,7 +201,6 @@
         assertEquals(0, getCount(uri, null, null));
     }
 
-    @MediumTest
     public void testGroupVersionUpdates() {
         Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI,
                 createGroup(mAccount, "gsid1", "title1"));
diff --git a/tests/src/com/android/providers/contacts/LegacyContactImporterPerformanceTest.java b/tests/src/com/android/providers/contacts/LegacyContactImporterPerformanceTest.java
deleted file mode 100644
index d78193b..0000000
--- a/tests/src/com/android/providers/contacts/LegacyContactImporterPerformanceTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2009 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.providers.contacts;
-
-import android.content.ContentProvider;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.os.Debug;
-import android.provider.CallLog;
-import android.provider.ContactsContract;
-import android.test.AndroidTestCase;
-import android.test.IsolatedContext;
-import android.test.RenamingDelegatingContext;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-
-import java.io.File;
-
-/**
- * Performance test for {@link ContactAggregator}. Run the test like this:
- * <code>
- * adb push <large contacts.db> \
- *         data/data/com.android.providers.contacts/databases/perf_imp.contacts.db
- * adb shell am instrument \
- *         -e class com.android.providers.contacts.LegacyContactImporterPerformanceTest \
- *         -w com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
- * </code>
- *
- * Note that this SHOULD be a large test, but had to be bumped down to medium due to a bug in the
- * SQLite cleanup code.
- */
-@MediumTest
-public class LegacyContactImporterPerformanceTest extends AndroidTestCase {
-
-    private static final String TAG = "LegacyContactImporterPerformanceTest";
-
-    private static final boolean TRACE = false;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    public void testPerformance() {
-        final Context targetContext = getContext();
-        MockContentResolver resolver = new MockContentResolver();
-        MockContext context = new MockContext() {
-            @Override
-            public Resources getResources() {
-                return targetContext.getResources();
-            }
-
-            @Override
-            public String getPackageName() {
-                return "no.package";
-            }
-
-            @Override
-            public ApplicationInfo getApplicationInfo() {
-                ApplicationInfo ai = new ApplicationInfo();
-                ai.packageName = "contactsTestPackage";
-                return ai;
-            }
-
-            @Override
-            public PackageManager getPackageManager() {
-                return new ContactsMockPackageManager();
-            }
-        };
-
-        RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(context,
-                targetContext, "perf_imp.");
-        targetContextWrapper.makeExistingFilesAndDbsAccessible();
-        IsolatedContext providerContext = new IsolatedContext(resolver, targetContextWrapper) {
-            @Override
-            public File getFilesDir() {
-                // TODO: Need to figure out something more graceful than this.
-                return new File("/data/data/com.android.providers.contacts.tests/files");
-            }
-        };
-        SynchronousContactsProvider2 provider = new SynchronousContactsProvider2();
-        provider.setDataWipeEnabled(false);
-        provider.attachInfo(providerContext, null);
-        resolver.addProvider(ContactsContract.AUTHORITY, provider);
-
-        ContentProvider callLogProvider = new TestCallLogProvider();
-        callLogProvider.attachInfo(providerContext, null);
-        resolver.addProvider(CallLog.AUTHORITY, callLogProvider);
-
-        LegacyContactImporter importer = new LegacyContactImporter(providerContext, provider);
-
-        provider.wipeData();
-
-        long start = System.currentTimeMillis();
-        if (TRACE) {
-            Debug.startMethodTracing("import");
-        }
-        provider.importLegacyContacts(importer);
-        if (TRACE) {
-            Debug.stopMethodTracing();
-        }
-        long end = System.currentTimeMillis();
-        long contactCount = provider.getRawContactCount();
-        Log.i(TAG, String.format("Imported contacts in %d ms.\n"
-                + "Contacts: %d\n"
-                + "Per contact: %.3f",
-                end - start,
-                contactCount,
-                ((double)(end - start) / contactCount)));
-    }
-
-    public static class TestCallLogProvider extends CallLogProvider {
-        private static ContactsDatabaseHelper mDbHelper;
-
-        @Override
-        protected ContactsDatabaseHelper getDatabaseHelper(final Context context) {
-            if (mDbHelper == null) {
-                mDbHelper = new ContactsDatabaseHelper(context);
-            }
-            return mDbHelper;
-        }
-    }
-}
diff --git a/tests/src/com/android/providers/contacts/LegacyContactImporterTest.java b/tests/src/com/android/providers/contacts/LegacyContactImporterTest.java
deleted file mode 100644
index 61108af..0000000
--- a/tests/src/com/android/providers/contacts/LegacyContactImporterTest.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2009 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.providers.contacts;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.provider.BaseColumns;
-import android.provider.CallLog;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.RawContacts;
-import android.test.mock.MockContext;
-import android.test.suitebuilder.annotation.MediumTest;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Unit tests for {@link LegacyContactImporter}.
- *
- * Run the test like this:
- * <code>
- * adb shell am instrument -e class com.android.providers.contacts.LegacyContactImporterTest -w \
- *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
- * </code>
- *
- * Note that this SHOULD be a large test, but had to be bumped down to medium due to a bug in the
- * SQLite cleanup code.
- */
-@MediumTest
-public class LegacyContactImporterTest extends BaseContactsProvider2Test {
-
-    private static class LegacyMockContext extends MockContext {
-
-        private String mFileName;
-
-        public LegacyMockContext(String fileName) {
-            mFileName = fileName;
-        }
-
-        @Override
-        public SQLiteDatabase openOrCreateDatabase(String file, int mode,
-                SQLiteDatabase.CursorFactory factory) {
-            return SQLiteDatabase.openDatabase(mFileName, factory, SQLiteDatabase.OPEN_READONLY);
-        }
-
-        @Override
-        public File getDatabasePath(String name) {
-            return new File(mFileName);
-        }
-    }
-
-    private LegacyMockContext createLegacyMockContext(String folder) throws IOException {
-        Context context = getTestContext();
-        File tempDb = new File(context.getFilesDir(), "legacy_contacts.db");
-        if (tempDb.exists()) {
-            tempDb.delete();
-        }
-        createSQLiteDatabaseFromDumpFile(tempDb.getPath(),
-                new File(folder, "legacy_contacts.sql").getPath());
-        return new LegacyMockContext(tempDb.getPath());
-    }
-
-    private void createSQLiteDatabaseFromDumpFile(String tempDbPath, String dumpFileAssetPath)
-        throws IOException {
-
-        final String[] ignoredTables = new String[] {"android_metadata", "sqlite_sequence"};
-
-        Context context = getTestContext();
-        SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(tempDbPath, null);
-        try {
-            String data = readAssetAsString(dumpFileAssetPath);
-            String[] commands = data.split(";\r|;\n|;\r\n");
-            for (String command : commands) {
-                boolean ignore = false;
-                for (String ignoredTable : ignoredTables) {
-                    if (command.contains(ignoredTable)) {
-                        ignore = true;
-                        break;
-                    }
-                }
-                if (!ignore) {
-                    database.execSQL(command);
-                }
-            }
-
-            assertTrue(
-                    "Database Version not set. Be sure to add " +
-                    "'PRAGMA user_version = <number>;' to the SQL Script",
-                    database.getVersion() != 0);
-        } finally {
-            database.close();
-        }
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        SynchronousContactsProvider2.resetOpenHelper();
-        super.setUp();
-        addProvider(TestCallLogProvider.class, CallLog.AUTHORITY);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        SynchronousContactsProvider2.resetOpenHelper();
-    }
-
-    public void testContactUpgrade1() throws Exception {
-        testAssetSet("test1");
-    }
-
-    public void testSyncedContactsUpgrade() throws Exception {
-        testAssetSet("testSynced");
-    }
-
-    public void testUnsyncedContactsUpgrade() throws Exception {
-        testAssetSet("testUnsynced");
-    }
-
-    private void testAssetSet(String folder) throws Exception {
-        ContactsProvider2 provider = (ContactsProvider2)getProvider();
-        LegacyContactImporter importer =
-                new LegacyContactImporter(createLegacyMockContext(folder), provider);
-        provider.importLegacyContacts(importer);
-
-        assertQueryResults(folder + "/expected_groups.txt", Groups.CONTENT_URI, new String[]{
-                Groups._ID,
-                Groups.ACCOUNT_NAME,
-                Groups.ACCOUNT_TYPE,
-                Groups.DIRTY,
-                Groups.GROUP_VISIBLE,
-                Groups.NOTES,
-                Groups.RES_PACKAGE,
-                Groups.SOURCE_ID,
-                Groups.SYSTEM_ID,
-                Groups.TITLE,
-                Groups.VERSION,
-                Groups.SYNC1,
-                Groups.SYNC2,
-                Groups.SYNC3,
-                Groups.SYNC4,
-        });
-
-        assertQueryResults(folder + "/expected_contacts.txt", Contacts.CONTENT_URI, new String[]{
-                Contacts._ID,
-                Contacts.DISPLAY_NAME_PRIMARY,
-                Contacts.SORT_KEY_PRIMARY,
-                Contacts.PHOTO_ID,
-                Contacts.TIMES_CONTACTED,
-                Contacts.LAST_TIME_CONTACTED,
-                Contacts.CUSTOM_RINGTONE,
-                Contacts.SEND_TO_VOICEMAIL,
-                Contacts.STARRED,
-                Contacts.IN_VISIBLE_GROUP,
-                Contacts.HAS_PHONE_NUMBER,
-                Contacts.IS_USER_PROFILE,
-                Contacts.LOOKUP_KEY,
-        });
-
-        assertQueryResults(folder + "/expected_raw_contacts.txt", RawContacts.CONTENT_URI,
-                new String[]{
-                    RawContacts._ID,
-                    RawContacts.ACCOUNT_NAME,
-                    RawContacts.ACCOUNT_TYPE,
-                    RawContacts.DELETED,
-                    RawContacts.DIRTY,
-                    RawContacts.SOURCE_ID,
-                    RawContacts.VERSION,
-                    RawContacts.SYNC1,
-                    RawContacts.SYNC2,
-                    RawContacts.SYNC3,
-                    RawContacts.SYNC4,
-                    RawContacts.DISPLAY_NAME_SOURCE,
-                    RawContacts.DISPLAY_NAME_PRIMARY,
-                    RawContacts.DISPLAY_NAME_ALTERNATIVE,
-                    RawContacts.SORT_KEY_PRIMARY,
-                    RawContacts.SORT_KEY_ALTERNATIVE,
-        });
-
-        assertQueryResults(folder + "/expected_data.txt", Data.CONTENT_URI, new String[]{
-                Data._ID,
-                Data.RAW_CONTACT_ID,
-                Data.MIMETYPE,
-                Data.DATA1,
-                Data.DATA2,
-                Data.DATA3,
-                Data.DATA4,
-                Data.DATA5,
-                Data.DATA6,
-                Data.DATA7,
-                Data.DATA8,
-                Data.DATA9,
-                Data.DATA10,
-                Data.DATA11,
-                Data.DATA12,
-                Data.DATA13,
-                Data.DATA14,
-                Data.DATA15,
-                Data.IS_PRIMARY,
-                Data.IS_SUPER_PRIMARY,
-                Data.DATA_VERSION,
-                Data.SYNC1,
-                Data.SYNC2,
-                Data.SYNC3,
-                Data.SYNC4,
-        });
-
-        assertQueryResults(folder + "/expected_calls.txt", Calls.CONTENT_URI, new String[]{
-                Calls._ID,
-                Calls.NUMBER,
-                Calls.DATE,
-                Calls.DURATION,
-                Calls.NEW,
-                Calls.TYPE,
-                Calls.CACHED_NAME,
-                Calls.CACHED_NUMBER_LABEL,
-                Calls.CACHED_NUMBER_TYPE,
-        });
-
-        provider.getDatabaseHelper().close();
-    }
-
-    private void assertQueryResults(String fileName, Uri uri, String[] projection)
-            throws Exception {
-        String expected = readAssetAsString(fileName).trim();
-        String actual = dumpCursorToString(uri, projection).trim();
-        assertEquals("Checking golden file " + fileName, expected, actual);
-    }
-
-    private String readAssetAsString(String fileName) throws IOException {
-        Context context = getTestContext();
-        InputStream input = context.getAssets().open(fileName);
-        ByteArrayOutputStream contents = new ByteArrayOutputStream();
-        int len;
-        byte[] data = new byte[1024];
-        do {
-            len = input.read(data);
-            if (len > 0) contents.write(data, 0, len);
-        } while (len == data.length);
-        return contents.toString();
-    }
-
-    private String dumpCursorToString(Uri uri, String[] projection) {
-        Cursor c = mResolver.query(uri, projection, null, null, BaseColumns._ID);
-        if (c == null) {
-            return "Null cursor";
-        }
-
-        String cursorDump = DatabaseUtils.dumpCursorToString(c);
-        c.close();
-        return insertLineNumbers(cursorDump);
-    }
-
-    private String insertLineNumbers(String multiline) {
-        String[] lines = multiline.split("\n");
-        StringBuilder sb = new StringBuilder();
-
-        // Ignore the first line that is a volatile header and the last line which is "<<<<<"
-        for (int i = 1; i < lines.length - 1; i++) {
-            sb.append(i).append(" ").append(lines[i]).append('\n');
-        }
-        return sb.toString();
-    }
-
-
-    public static class TestCallLogProvider extends CallLogProvider {
-        private static ContactsDatabaseHelper mDbHelper;
-
-        @Override
-        protected ContactsDatabaseHelper getDatabaseHelper(final Context context) {
-            if (mDbHelper == null) {
-                mDbHelper = new ContactsDatabaseHelper(context);
-            }
-            return mDbHelper;
-        }
-    }
-}
diff --git a/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java b/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java
index 49a930d..4fe3b56 100644
--- a/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java
+++ b/tests/src/com/android/providers/contacts/SynchronousContactsProvider2.java
@@ -35,6 +35,7 @@
     private Account mAccount;
     private boolean mNetworkNotified;
     private boolean mIsPhone = true;
+    private boolean mIsVoiceCapable = true;
 
     @Override
     protected ContactsDatabaseHelper getDatabaseHelper(final Context context) {
@@ -82,6 +83,15 @@
         return mIsPhone;
     }
 
+    public void setIsVoiceCapable(boolean flag) {
+        mIsVoiceCapable = flag;
+    }
+
+    @Override
+    public boolean isVoiceCapable() {
+        return mIsVoiceCapable;
+    }
+
     @Override
     public boolean onCreate() {
         boolean created = super.onCreate();
@@ -97,6 +107,11 @@
     }
 
     @Override
+    protected boolean shouldThrowExceptionForInitializationError() {
+        return true;
+    }
+
+    @Override
     protected void scheduleBackgroundTask(int task) {
         performBackgroundTask(task, null);
     }
@@ -188,11 +203,4 @@
 
         getContactDirectoryManagerForTest().scanAllPackages();
     }
-
-    @Override
-    protected boolean isLegacyContactImportNeeded() {
-
-        // We have an explicit test for data conversion - no need to do it every time
-        return false;
-    }
 }
diff --git a/tests/src/com/android/providers/contacts/util/DBQueryUtilsTest.java b/tests/src/com/android/providers/contacts/util/DBQueryUtilsTest.java
index 350e971..43f7c06 100644
--- a/tests/src/com/android/providers/contacts/util/DBQueryUtilsTest.java
+++ b/tests/src/com/android/providers/contacts/util/DBQueryUtilsTest.java
@@ -19,14 +19,13 @@
 import static com.android.providers.contacts.util.DbQueryUtils.checkForSupportedColumns;
 import static com.android.providers.contacts.util.DbQueryUtils.concatenateClauses;
 
+import com.android.common.content.ProjectionMap;
+import com.android.providers.contacts.EvenMoreAsserts;
+
 import android.content.ContentValues;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.providers.contacts.EvenMoreAsserts;
-import com.android.providers.contacts.ProjectionMap;
-import com.android.providers.contacts.util.DbQueryUtils;
-
 /**
  * Unit tests for the {@link DbQueryUtils} class.
  * Run the test like this:
@@ -38,10 +37,11 @@
 public class DBQueryUtilsTest extends AndroidTestCase {
     public void testGetEqualityClause() {
         assertEquals("(foo = 'bar')", DbQueryUtils.getEqualityClause("foo", "bar"));
+        assertEquals("(foo = 2)", DbQueryUtils.getEqualityClause("foo", 2));
     }
 
     public void testGetInEqualityClause() {
-        assertEquals("(foo != 'bar')", DbQueryUtils.getInequalityClause("foo", "bar"));
+        assertEquals("(foo != 2)", DbQueryUtils.getInequalityClause("foo", 2));
     }
 
     public void testConcatenateClauses() {