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() {