am 1c4ed485: am ff6c2154: am 0ee98dc5: am 91d9f0b6: am 79e1baec: am 60189cdc: Fix EMAIL_FILTER ranking for duplicate emails in different accounts
* commit '1c4ed485afd7ae16c2277e0b52ac2bac0b17334c':
Fix EMAIL_FILTER ranking for duplicate emails in different accounts
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 5889bc5..5db88a0 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -20,9 +20,9 @@
<string name="app_label" msgid="3389954322874982620">"የዕውቂያ ማከማቻ"</string>
<string name="provider_label" msgid="6012150850819899907">"እውቅያዎች"</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_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="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>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index d2fd0a6..90d7822 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="sharedUserLabel" msgid="8024311725474286801">"تطبيقات Android المركزية"</string>
+ <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="8640807392794309950">"جارٍ ترقية قاعدة بيانات جهات الاتصال."</string>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..d11f636
--- /dev/null
+++ b/res/values-az-rAZ/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
+ <string name="app_label" msgid="3389954322874982620">"Kontakt Yaddaşı"</string>
+ <string name="provider_label" msgid="6012150850819899907">"Kontaktlar"</string>
+ <string name="upgrade_msg" msgid="8640807392794309950">"Kontakt data bazası təkmilləşdirilir."</string>
+ <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Kontakt təkmilləşdirməsi əlavə yaddaş tələb edir."</string>
+ <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Kontakt üçün yaddaş təkmilləşdirilir."</string>
+ <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Təkmilləşdirməni tamamlamaq üçün toxunun."</string>
+ <string name="default_directory" msgid="93961630309570294">"Kontaktlar"</string>
+ <string name="local_invisible_directory" msgid="705244318477396120">"Digər"</string>
+ <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Bütün səsli məktublara giriş"</string>
+ <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Tətbiqə bu cihazın giriş əldə edə biləcəyi bütün səsli məktubları saxlamağa və əldə etməyə imkan verir."</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"Səsli mesaj göndərən: "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"Kontakt data bazasını kopyalayın"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"Siz 1) informasiyaya və daxili yaddaş ehtiyatındakı zəng jurnalına bağlı data bazanızın nüsxəsini hazırlamaq 2) və onu e-poçt ilə göndərmək üzrəsiniz. Onu cihazdan kənarda və ya alınmış e-məktubda uğurla kopyalayandan sonra nüsxəsini silməyi unutmayın."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"İndi silin"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"Başladın"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Faylınızı göndərmək üçün proqram seçin"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"Kontakt Db qoşulub"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"Qoşmada mənim bütün kontakt məlumatlarım olan kontakt data bazam var. Ehtiyatla idarə edin."</string>
+</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
new file mode 100644
index 0000000..d11f636
--- /dev/null
+++ b/res/values-az/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sharedUserLabel" msgid="8024311725474286801">"Android Core Apps"</string>
+ <string name="app_label" msgid="3389954322874982620">"Kontakt Yaddaşı"</string>
+ <string name="provider_label" msgid="6012150850819899907">"Kontaktlar"</string>
+ <string name="upgrade_msg" msgid="8640807392794309950">"Kontakt data bazası təkmilləşdirilir."</string>
+ <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Kontakt təkmilləşdirməsi əlavə yaddaş tələb edir."</string>
+ <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Kontakt üçün yaddaş təkmilləşdirilir."</string>
+ <string name="upgrade_out_of_memory_notification_text" msgid="8438179450336437626">"Təkmilləşdirməni tamamlamaq üçün toxunun."</string>
+ <string name="default_directory" msgid="93961630309570294">"Kontaktlar"</string>
+ <string name="local_invisible_directory" msgid="705244318477396120">"Digər"</string>
+ <string name="read_write_all_voicemail_label" msgid="4557216100818257560">"Bütün səsli məktublara giriş"</string>
+ <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Tətbiqə bu cihazın giriş əldə edə biləcəyi bütün səsli məktubları saxlamağa və əldə etməyə imkan verir."</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"Səsli mesaj göndərən: "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"Kontakt data bazasını kopyalayın"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"Siz 1) informasiyaya və daxili yaddaş ehtiyatındakı zəng jurnalına bağlı data bazanızın nüsxəsini hazırlamaq 2) və onu e-poçt ilə göndərmək üzrəsiniz. Onu cihazdan kənarda və ya alınmış e-məktubda uğurla kopyalayandan sonra nüsxəsini silməyi unutmayın."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"İndi silin"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"Başladın"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Faylınızı göndərmək üçün proqram seçin"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"Kontakt Db qoşulub"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"Qoşmada mənim bütün kontakt məlumatlarım olan kontakt data bazam var. Ehtiyatla idarə edin."</string>
+</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
deleted file mode 100644
index 171fbb6..0000000
--- a/res/values-be/strings.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <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="8640807392794309950">"Абнаўленне базы дадзеных кантактаў."</string>
- <string name="upgrade_out_of_memory_notification_ticker" msgid="7638747231223520477">"Для абнаўлення кантактаў патрабуецца больш памяці."</string>
- <string name="upgrade_out_of_memory_notification_title" msgid="8888171924684998531">"Каб абнавiць кантакты, патрабуецца больш памяцi"</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="8029809937805761356">"Дазваляе прыкладанню захоўваць і прайграваць усе даступныя для гэтай прылады паведамленні галасавой пошты."</string>
- <string name="voicemail_from_column" msgid="435732568832121444">"Галасавое паведамленне ад "</string>
- <string name="debug_dump_title" msgid="4916885724165570279">"Капiраваць базу дадзеных кантактаў"</string>
- <string name="debug_dump_database_message" msgid="406438635002392290">"Вы збіраецеся 1) зрабіць копію базы дадзеных, якая ўключае ў сябе ўсе звесткi пра кантакты і званкi на ўнутранай памяці, і 2) адправiць яго па электроннай пошце. Не забудзьцеся выдаліць копію, як толькі вы паспяхова скапіруеце іх на прыладу ці атрымаеце па электроннай пошце."</string>
- <string name="debug_dump_delete_button" msgid="7832879421132026435">"Выдаліць зараз"</string>
- <string name="debug_dump_start_button" msgid="2837506913757600001">"Пачаць"</string>
- <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Выберыце праграму для адпраўкі файла"</string>
- <string name="debug_dump_email_subject" msgid="108188398416385976">"Далучаны кантакты Dd"</string>
- <string name="debug_dump_email_body" msgid="4577749800871444318">"Далучана база дадзеных маiх кантактаў з усёй інфармацыяй. Працуйце з ёй уважліва."</string>
-</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..27342c9
--- /dev/null
+++ b/res/values-en-rIN/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="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>
+ <string name="debug_dump_title" msgid="4916885724165570279">"Copy contacts database"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"You are about to 1) make a copy of your database which includes all contacts related information and all call log to the internal storage, and 2) email it. Remember to delete the copy as soon as you have successfully copied it off the device or the email is received."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"Delete now"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"Start"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Choose a programme to send your file"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"Contacts Db attached"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"Attached is my contacts database with all my contacts information. Handle with care."</string>
+</resources>
diff --git a/res/values-et/strings.xml b/res/values-et-rEE/strings.xml
similarity index 100%
rename from res/values-et/strings.xml
rename to res/values-et-rEE/strings.xml
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..00ae19b
--- /dev/null
+++ b/res/values-fr-rCA/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="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>
+ <string name="debug_dump_title" msgid="4916885724165570279">"Copier la base de données de contacts"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"Vous êtes sur le point de 1) faire une copie de votre base de données (qui inclut toutes les données relatives aux contacts et l\'intégralité du journal d\'appels) dans la mémoire de stockage interne, puis de 2) l\'envoyer par courriel. N\'oubliez pas de supprimer la copie une fois qu\'elle a été dupliquée ou dès que le courriel a été reçu."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"Supprimer maintenant"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"Démarrer"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Choisissez un programme pour envoyer vos fichiers"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"Base de données de contacts ci-jointe"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"Veuillez trouver ci-joint ma base de données de contacts incluant toutes les coordonnées de mes contacts. Merci de la traiter avec précaution."</string>
+</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index cc50237..32feaf3 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -29,7 +29,7 @@
<string name="read_write_all_voicemail_description" msgid="8029809937805761356">"एप्लिकेशन को ऐसे सभी ध्वनिमेल संग्रहीत और पुनर्प्राप्त करने देता है जिन पर यह उपकरण पहुंच सकता है."</string>
<string name="voicemail_from_column" msgid="435732568832121444">"इनका ध्वनिमेल: "</string>
<string name="debug_dump_title" msgid="4916885724165570279">"संपर्क डेटाबेस की प्रतिलिपि बनाएं"</string>
- <string name="debug_dump_database_message" msgid="406438635002392290">"आप 1) आंतरिक संग्रहण में अपने उस डेटाबेस की प्रतिलिपि बनाने वाले हैं जिसमें सभी संपर्कों संबंधी जानकारी और सभी कॉल लॉग शामिल हैं, और 2) उसे ईमेल करने वाले हैं. जैसे ही आप उपकरण से इसकी प्रतिलिपि सफलतापूर्वक बना लें या ईमेल प्राप्त हो जाए तो प्रतिलिपि को हटाना न भूलें."</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"आप 1) मोबाइल संग्रहण में अपने उस डेटाबेस की प्रतिलिपि बनाने वाले हैं जिसमें सभी संपर्कों संबंधी जानकारी और सभी कॉल लॉग शामिल हैं, और 2) उसे ईमेल करने वाले हैं. जैसे ही आप उपकरण से इसकी प्रतिलिपि सफलतापूर्वक बना लें या ईमेल प्राप्त हो जाए तो प्रतिलिपि को हटाना न भूलें."</string>
<string name="debug_dump_delete_button" msgid="7832879421132026435">"अभी हटाएं"</string>
<string name="debug_dump_start_button" msgid="2837506913757600001">"प्रारंभ करें"</string>
<string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"अपनी फ़ाइल भेजने के लिए कोई प्रोग्राम चुनें"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..1de2d05
--- /dev/null
+++ b/res/values-hy-rAM/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="8029809937805761356">"Թույլ է տալիս ծրագրին պահել և առբերել այս սարքի համար մատչելի ձայնային փոստերը:"</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"Ձայնային փոստ "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"Պատճենել կոնտակտային տվյալների շտեմարաը"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"Դուք պատրաստվում եք 1) պատճենել ձեր տվյալների շտեմարանը ներքին պահոցում, որը կներառի բոլոր կոնտակտային տվյալները և բոլոր զանգերի գրանցումները, ապա 2) ուղարկել այն էլփոստով: Չմոռանաք սարքի վրա հաջողությամբ այդ ամենը պատճենելուց կամ էլփոստը ստանալուց հետո անհապաղ ջնջել պատճենը:"</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"Ջնջել հիմա"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"Մեկնարկել"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Ընտրեք ծրագիրը` ձեր ֆայլն ուղարկելու համար"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"Կոնտակտների Db-ն կցված է"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"Կից իմ կոնտակտների տվյալների շտեմարանն է` իմ բոլոր կոնտակտների տեղեկություններով: Վերաբերվեք խմաքով:"</string>
+</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 7a0eb82..2242fc5 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -26,13 +26,13 @@
<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="8029809937805761356">"מאפשר ליישום לאחסן ולאחזר את כל הודעות הדואר הקולי שלמכשיר זה יש גישה אליהן."</string>
+ <string name="read_write_all_voicemail_description" msgid="8029809937805761356">"מאפשר לאפליקציה לאחסן ולאחזר את כל הודעות הדואר הקולי שלמכשיר זה יש גישה אליהן."</string>
<string name="voicemail_from_column" msgid="435732568832121444">"הודעה קולית מאת "</string>
<string name="debug_dump_title" msgid="4916885724165570279">"העתקת מסד נתוני אנשי קשר"</string>
<string name="debug_dump_database_message" msgid="406438635002392290">"אתה עומד 1) ליצור עותק באחסון הפנימי של מסד הנתונים שכולל את כל המידע הקשור לאנשי הקשר וכל יומני השיחות, 2) לשלוח אותו בדוא\"ל. זכור למחוק את העותק מיד לאחר שתעתיק אותו בהצלחה מהמכשיר או כשהודעת הדוא\"ל מתקבלת."</string>
<string name="debug_dump_delete_button" msgid="7832879421132026435">"מחק עכשיו"</string>
<string name="debug_dump_start_button" msgid="2837506913757600001">"התחל"</string>
- <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"בחר תוכנית לשליחת הקובץ"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"בחר תכנית לשליחת הקובץ"</string>
<string name="debug_dump_email_subject" msgid="108188398416385976">"מסד נתוני אנשי קשר מצורף"</string>
<string name="debug_dump_email_body" msgid="4577749800871444318">"מצורף מסד הנתונים של אנשי הקשר שלי עם כל פרטי אנשי הקשר. שמור עליו היטב."</string>
</resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..fd46c67
--- /dev/null
+++ b/res/values-ka-rGE/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="8029809937805761356">"აპს ეძლევა ამ მოწყობილობისთვის ხელმისაწვდომი ყველა ხმოვანი ფოსტის შენახვისა და მოძიების საშუალება."</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"ხმოვანი ფოსტა "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"კონტაქტების მონაცემთა ბაზის კოპირება"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"თქვენ აპირებთ 1) შიდა მეხსიერებაში მონაცემთა ბაზის კოპირებას, რომელიც შეიცავს ყველა კონტაქტთან დაკავშირებულ ინფორმაციას და ზარების ჟურნალს და 2) მის გაგზავნას ელფოსტის საშუალებით. გახსოვდეთ, რომ კოპირების წარმატებით დასრულებისთანავე ან ელფოსტის მიღებისთანავე უნდა წაშალოთ მოწყობილობიდან ასლი."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"წაიშალოს ახლა"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"დაწყება"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"ფაილის გასაგზავნად აირჩიეთ პროგრამა"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"დართულია კონტაქტების მ.ბაზა"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"დართულია ჩემი კონტაქტების მონაცემთა ბაზა, რომელიც შეიცავს ინფორმაციას ყველა ჩემი კონტაქტის შესახებ. მოუფრთხილდი."</string>
+</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..733e689
--- /dev/null
+++ b/res/values-km-rKH/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="8029809937805761356">"ឱ្យកម្មវិធីទុក និងទៅយកសារជាសំឡេងទាំងអស់ដែលឧបករណ៍នេះអាចដំណើរការបាន។"</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"សារជាសំឡេងពី "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"ចម្លងមូលដ្ឋានទិន្នន័យទំនាក់ទំនង"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"អ្នកហៀបនឹង ១) ចម្លងមូលដ្ឋានទិន្នន័យរបស់អ្នកដែលរួមមានព័ត៌មានទំនាក់ទំនង និងកំណត់ហេតុហៅទាំងអស់ទៅកាន់ឧបករណ៍ផ្ទុកខាងក្នុង ២) ផ្ញើអ៊ីម៉ែលវា។ ចងចាំថាអ្នកត្រូវលុបច្បាប់ចម្លងភ្លាមៗ បន្ទាប់ពីបានចម្លងចេញពីឧបករណ៍ ឬបានទទួលអ៊ីមែល។"</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"លុបឥឡូវ"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"ចាប់ផ្ដើម"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"ជ្រើសកម្មវិធីដើម្បីផ្ញើឯកសាររបស់អ្នក"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"បានភ្ជាប់មូលដ្ឋានទិន្នន័យទំនាក់ទំនង"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"ឯកសារភ្ជាប់គឺជាមូលដ្ឋានទិន្នន័យទំនាក់ទំនងព្រមទាំងព័ត៌មានទំនាក់ទំនងទាំងអស់របស់ខ្ញុំ។ ប្រើវាដោយប្រុងប្រយ័ត្ន។"</string>
+</resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..357b3fc
--- /dev/null
+++ b/res/values-lo-rLA/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="8029809937805761356">"ອະນຸຍາດໃຫ້ແອັບຯສາມາດບັນທຶກ ແລະດຶງຂໍ້ມູນຂໍ້ຄວາມສຽງທັງໝົດ ທີ່ອຸປະກອນນີ້ສາມາດເຂົ້າເຖິງໄດ້."</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"ຂໍ້ຄວາມສຽງຈາກ "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"ສຳເນົາຖານຂໍ້ມູນລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"ທ່ານກຳລັງຈະ 1) ສ້າງສຳເນົາຂອງຖານຂໍ້ມູນເຊິ່ງຈະມີ ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບລາຍຊື່ຜູ່ຕິດຕໍ່ ແລະບັນທຶກການໂທທັງໝົດ ເພື່ອຈັດເກັບໃນບ່ອນຈັດເກັບຂໍ້ມູນພາຍໃນ ແລະ 2) ສົ່ງມັນໄປທາງອີເມວ. ຫຼັງຈາກທ່ານສຳເນົາຂໍ້ມູນທີ່ສ້າງອອກຈາກອຸປະກອນນີ້ ຫຼືສົ່ງມັນຜ່ານທາງອີເມວສຳເລັດແລ້ວ ຢ່າລືມລຶບມັນອອກໂດຍທັນທີ."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"ລຶບອອກດຽວນີ້"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"ເລີ່ມຕົ້ນ"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"ເລືອກໂປຣແກຣມເພື່ອສົ່ງໄຟລ໌ຂອງທ່ານ"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"ແນບໄຟລ໌ຖານຂໍ້ມູນລາຍຊື່ຜູ່ຕິດຕໍ່ແລ້ວ"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"ໄຟລ໌ທີ່ແນບມານຳ ແມ່ນຖານຂໍ້ມູນຂອງລາຍຊື່ຜູ່ຕິດຕໍ່ຂອງຂ້ອຍ. ກະລຸນາຈັດການດ້ວຍຄວາມລະມັດລະວັງ."</string>
+</resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..907d384
--- /dev/null
+++ b/res/values-mn-rMN/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sharedUserLabel" msgid="8024311725474286801">"Андройдын үндсэн апп-ууд"</string>
+ <string name="app_label" msgid="3389954322874982620">"Харилцагчдын сан"</string>
+ <string name="provider_label" msgid="6012150850819899907">"Харилцагчид"</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="8029809937805761356">"Энэ төхөөрөмжийн хандалт хийх боломжтой бүх дуут шууданг хадгалах буюу татахыг апп-д зөвшөөрнө."</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"Дуут шуудан илгээгч "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"Харилцагчдын мэдээллийн санг хуулах"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"Та 1) бүх харилцагчидтай холбоотой мэдээллүүд болон ярианы жагсаалтыг агуулсан өөрийн өгөгдлийн сангийн хуулбарыг дотоод санд хадгалах, мөн 2) имэйлдэх гэж байна. Та үүнийг төхөөрөмжөөсөө амжилттай хуулж дуусах буюу имэйлээр хүлээж авсны дараа устгах хэрэгтэйг санаарай."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"Одоо устгах"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"Эхлэх"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Өөрийн файлийг илгээх програмыг сонгоно уу"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"Харилцагчдын Db-г хавсаргав"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"Хавсралтад миний бүх харилцагчийн мэдээлэл бүхий өгөгдлийн сан байгаа. Болгоомжтой харьцана уу."</string>
+</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms-rMY/strings.xml
similarity index 100%
rename from res/values-ms/strings.xml
rename to res/values-ms-rMY/strings.xml
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 909e54e..8ab46d6 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -25,7 +25,7 @@
<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_label" msgid="4557216100818257560">"Lese alle talemeldinger"</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>
<string name="debug_dump_title" msgid="4916885724165570279">"Kopiér kontaktdatabasen"</string>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..17672ea
--- /dev/null
+++ b/res/values-ne-rNP/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sharedUserLabel" msgid="8024311725474286801">"एन्ड्रोइड कोर अनुप्रयोगहरू"</string>
+ <string name="app_label" msgid="3389954322874982620">"सम्पर्कहरू भण्डारण"</string>
+ <string name="provider_label" msgid="6012150850819899907">"सम्पर्कहरू"</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="8029809937805761356">"यो उपकरणले पहुँच गर्न सक्ने हरेक भ्वाइसमेलहरू यो अनुप्रयोगलाई भण्डारण गर्न र पुन:बहाली गर्न अनुमति दिन्छ।"</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"बाट भ्वाइसमेल "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"सम्पर्क डेटाबेस प्रतिलिप गर्नुहोस्"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"तपाईँले केही बेरमा १) आन्तरिक भण्डारणमा सम्पुर्ण सम्पर्क सम्बन्धी जानकारी र कल लग भएको डेटाबेसको एउटा प्रतिलिपी बनाउनुहोस्, र 2) उनीहरूलाई इमेल गर्नुहोस्। उपरकणमा प्रतिलिपीको नक्कल पार्ना साथ अथवा इमेल प्राप्त हुने बित्तिकै प्रतिलिपी मेटाउन ख्याल गर्नुहोस्।"</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"अहिले हटाउनुहोस्"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"सुरु गर्नुहोस्"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"आफ्नो फाइल पठाउनका लागि एउटा प्रोग्राम छान्नुहोस्।"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"सम्पर्क Db संलग्न गरिएको छ।"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"संलग्न मेरा सम्पुर्ण जानकारीको सम्पर्क डेटाबेस हो। सावधानीपूर्वक राख्नुहोस्।"</string>
+</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
new file mode 100644
index 0000000..17672ea
--- /dev/null
+++ b/res/values-ne/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="sharedUserLabel" msgid="8024311725474286801">"एन्ड्रोइड कोर अनुप्रयोगहरू"</string>
+ <string name="app_label" msgid="3389954322874982620">"सम्पर्कहरू भण्डारण"</string>
+ <string name="provider_label" msgid="6012150850819899907">"सम्पर्कहरू"</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="8029809937805761356">"यो उपकरणले पहुँच गर्न सक्ने हरेक भ्वाइसमेलहरू यो अनुप्रयोगलाई भण्डारण गर्न र पुन:बहाली गर्न अनुमति दिन्छ।"</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"बाट भ्वाइसमेल "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"सम्पर्क डेटाबेस प्रतिलिप गर्नुहोस्"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"तपाईँले केही बेरमा १) आन्तरिक भण्डारणमा सम्पुर्ण सम्पर्क सम्बन्धी जानकारी र कल लग भएको डेटाबेसको एउटा प्रतिलिपी बनाउनुहोस्, र 2) उनीहरूलाई इमेल गर्नुहोस्। उपरकणमा प्रतिलिपीको नक्कल पार्ना साथ अथवा इमेल प्राप्त हुने बित्तिकै प्रतिलिपी मेटाउन ख्याल गर्नुहोस्।"</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"अहिले हटाउनुहोस्"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"सुरु गर्नुहोस्"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"आफ्नो फाइल पठाउनका लागि एउटा प्रोग्राम छान्नुहोस्।"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"सम्पर्क Db संलग्न गरिएको छ।"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"संलग्न मेरा सम्पुर्ण जानकारीको सम्पर्क डेटाबेस हो। सावधानीपूर्वक राख्नुहोस्।"</string>
+</resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..5dfc184
--- /dev/null
+++ b/res/values-si-rLK/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="8029809937805761356">"උපාංගයට ප්රවේශ කළ හැකි සියලු හඬ තැපැල් ගබඩා කිරීම සහ ලබාගැනීමට යෙදුමට අවසර ලබාදේ."</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"හඬ තැපෑල ලැබෙන්නේ "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"සම්බන්ධතා දත්ත සමුදාය පිටපත් කරන්න"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"ඔබ සදන්නේ 1) සම්බන්ධතා ආශ්රිත තොරතුරු සහ සියලු ඇමතුම් ලොගයේ තිබෙන ඔබගේ දත්ත සමුදායේ පිටපතක් අභ්යන්තර ආචයනයට ගැනීමට, සහ 2) එය ඊ-තැපැල් කිරීමටයි. ඔබ සාර්ථකව උපාංගයෙන් පිටපත් කර විට හෝ ඊ-තැපෑල ලැබුණු විට පිටපත මකා දැමීමට මතක තබාගන්න."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"දැන් මකන්න"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"ආරම්භ කරන්න"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"ඔබගේ ගොනුව යැවීමට ක්රමලේඛයක් තෝරන්න"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"සම්බන්ධතා Db අමුණා ඇත"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"අමුණා ඇත්තේ මගේ සම්බන්ධතා තොරතුරු සියල්ල තිබෙන සම්බන්ධතා දත්ත සමුදායයි. ප්රවේශමෙන් පාවිච්චි කරන්න."</string>
+</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
new file mode 100644
index 0000000..5dfc184
--- /dev/null
+++ b/res/values-si/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="8029809937805761356">"උපාංගයට ප්රවේශ කළ හැකි සියලු හඬ තැපැල් ගබඩා කිරීම සහ ලබාගැනීමට යෙදුමට අවසර ලබාදේ."</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"හඬ තැපෑල ලැබෙන්නේ "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"සම්බන්ධතා දත්ත සමුදාය පිටපත් කරන්න"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"ඔබ සදන්නේ 1) සම්බන්ධතා ආශ්රිත තොරතුරු සහ සියලු ඇමතුම් ලොගයේ තිබෙන ඔබගේ දත්ත සමුදායේ පිටපතක් අභ්යන්තර ආචයනයට ගැනීමට, සහ 2) එය ඊ-තැපැල් කිරීමටයි. ඔබ සාර්ථකව උපාංගයෙන් පිටපත් කර විට හෝ ඊ-තැපෑල ලැබුණු විට පිටපත මකා දැමීමට මතක තබාගන්න."</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"දැන් මකන්න"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"ආරම්භ කරන්න"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"ඔබගේ ගොනුව යැවීමට ක්රමලේඛයක් තෝරන්න"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"සම්බන්ධතා Db අමුණා ඇත"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"අමුණා ඇත්තේ මගේ සම්බන්ධතා තොරතුරු සියල්ල තිබෙන සම්බන්ධතා දත්ත සමුදායයි. ප්රවේශමෙන් පාවිච්චි කරන්න."</string>
+</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 05d46fa..4550db0 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -29,7 +29,7 @@
<string name="read_write_all_voicemail_description" msgid="8029809937805761356">"Inaruhusu programu kuhifadhi na kutoa mawasiliano yote ya sauti ambayo kifaa hiki kinaweza kufikia."</string>
<string name="voicemail_from_column" msgid="435732568832121444">"Barua ya sauti kutoka "</string>
<string name="debug_dump_title" msgid="4916885724165570279">"Nakili hifadhidata ya anwani"</string>
- <string name="debug_dump_database_message" msgid="406438635002392290">"Unakaribia 1) kuunda nakala ya hifadhidata yako ambayo inajumuisha maelezo yote yanayohusiana na anwani na kumbukumbu zote za simu katika hifadhi ya ndani, na 2) uitume kwa barua pepe. Kumbuka kufuta nakala pindi tu unapoinakili kwa ufanisi kutoka kwenye kifaa au barua pepe imepokewa."</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"Unaelekea 1) kuunda nakala ya hifadhidata yako ambayo inajumuisha maelezo yote yanayohusiana na anwani na kumbukumbu zote za simu katika hifadhi ya ndani, na 2) uitume kwa barua pepe. Kumbuka kufuta nakala pindi tu utakapomaliza kuinakili kutoka kwenye kifaa au barua pepe itakapopokewa."</string>
<string name="debug_dump_delete_button" msgid="7832879421132026435">"Futa sasa"</string>
<string name="debug_dump_start_button" msgid="2837506913757600001">"Anza"</string>
<string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"Chagua programu ili kutuma faili yako"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..0d5e401
--- /dev/null
+++ b/res/values-zh-rHK/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <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="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="8029809937805761356">"允許應用程式儲存及擷取這部裝置可存取的所有留言。"</string>
+ <string name="voicemail_from_column" msgid="435732568832121444">"留言來自 "</string>
+ <string name="debug_dump_title" msgid="4916885724165570279">"複製通訊錄資料庫"</string>
+ <string name="debug_dump_database_message" msgid="406438635002392290">"您即將要 1) 把您的資料庫 (包括所有聯絡人相關資料及所有通話記錄) 複製到內部儲存空間,然後 2) 以電郵寄出。當您成功從裝置複製這個資料庫的副本或收到電子郵件後,別忘記立即刪除這個副本。"</string>
+ <string name="debug_dump_delete_button" msgid="7832879421132026435">"立即刪除"</string>
+ <string name="debug_dump_start_button" msgid="2837506913757600001">"開始"</string>
+ <string name="debug_dump_email_sender_picker" msgid="3534420908672176460">"選擇要傳送檔案的程式"</string>
+ <string name="debug_dump_email_subject" msgid="108188398416385976">"附上通訊錄資料庫"</string>
+ <string name="debug_dump_email_body" msgid="4577749800871444318">"附上我的通訊錄資料庫,其中包括我所有的聯絡人資料,請謹慎處理。"</string>
+</resources>
diff --git a/src/com/android/providers/contacts/ContactLocaleUtils.java b/src/com/android/providers/contacts/ContactLocaleUtils.java
index c63f7fc..3d3ae82 100644
--- a/src/com/android/providers/contacts/ContactLocaleUtils.java
+++ b/src/com/android/providers/contacts/ContactLocaleUtils.java
@@ -49,7 +49,8 @@
public static final Locale LOCALE_ARABIC = new Locale("ar");
public static final Locale LOCALE_GREEK = new Locale("el");
public static final Locale LOCALE_HEBREW = new Locale("he");
- // Ukrainian labels are superset of Russian
+ // Serbian and Ukrainian labels are complementary supersets of Russian
+ public static final Locale LOCALE_SERBIAN = new Locale("sr");
public static final Locale LOCALE_UKRAINIAN = new Locale("uk");
public static final Locale LOCALE_THAI = new Locale("th");
@@ -80,8 +81,9 @@
// which way to label it (so eg Chinese cannot be added because
// the labeling of a Chinese character varies between Simplified,
// Traditional, and Japanese locales). Use English only for all
- // Latin based alphabets. Ukrainian is chosen for Cyrillic because
- // its alphabet is a superset of Russian.
+ // Latin based alphabets. Ukrainian and Serbian are chosen for
+ // Cyrillic because their alphabets are complementary supersets
+ // of Russian.
mAlphabeticIndex = new AlphabeticIndex(locale)
.setMaxLabelCount(300)
.addLabels(Locale.ENGLISH)
@@ -92,6 +94,7 @@
.addLabels(LOCALE_HEBREW)
.addLabels(LOCALE_GREEK)
.addLabels(LOCALE_UKRAINIAN)
+ .addLabels(LOCALE_SERBIAN)
.getImmutableIndex();
mAlphabeticIndexBucketCount = mAlphabeticIndex.getBucketCount();
mNumberBucketIndex = mAlphabeticIndexBucketCount - 1;
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index d0b696c..13b21b5 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -69,6 +69,7 @@
import android.provider.ContactsContract;
import android.provider.ContactsContract.AggregationExceptions;
import android.provider.ContactsContract.Authorization;
+import android.provider.ContactsContract.CommonDataKinds.Callable;
import android.provider.ContactsContract.CommonDataKinds.Contactables;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
@@ -87,6 +88,7 @@
import android.provider.ContactsContract.Contacts.AggregationSuggestions;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.DataUsageFeedback;
+import android.provider.ContactsContract.DeletedContacts;
import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.DisplayPhoto;
import android.provider.ContactsContract.Groups;
@@ -112,6 +114,7 @@
import com.android.common.content.ProjectionMap;
import com.android.common.content.SyncStateContentProviderHelper;
import com.android.common.io.MoreCloseables;
+import com.android.internal.util.ArrayUtils;
import com.android.providers.contacts.ContactLookupKey.LookupKeySegment;
import com.android.providers.contacts.ContactsDatabaseHelper.AccountsColumns;
import com.android.providers.contacts.ContactsDatabaseHelper.AggregatedPresenceColumns;
@@ -180,7 +183,6 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
@@ -933,8 +935,8 @@
.build();
private static final ProjectionMap sDeletedContactsProjectionMap = ProjectionMap.builder()
- .add(ContactsContract.DeletedContacts.CONTACT_ID)
- .add(ContactsContract.DeletedContacts.CONTACT_DELETED_TIMESTAMP)
+ .add(DeletedContacts.CONTACT_ID)
+ .add(DeletedContacts.CONTACT_DELETED_TIMESTAMP)
.build();
/**
@@ -1116,94 +1118,132 @@
static {
// Contacts URI matching table
final UriMatcher matcher = sUriMatcher;
- matcher.addURI(ContactsContract.AUTHORITY, "contacts", CONTACTS);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#", CONTACTS_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/data", CONTACTS_ID_DATA);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/entities", CONTACTS_ID_ENTITIES);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/suggestions",
- AGGREGATION_SUGGESTIONS);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/suggestions/*",
- AGGREGATION_SUGGESTIONS);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/photo", CONTACTS_ID_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/display_photo",
- CONTACTS_ID_DISPLAY_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/stream_items",
- CONTACTS_ID_STREAM_ITEMS);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/filter", CONTACTS_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/filter/*", CONTACTS_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*", CONTACTS_LOOKUP);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/data", CONTACTS_LOOKUP_DATA);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/photo",
- CONTACTS_LOOKUP_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/#", CONTACTS_LOOKUP_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/#/data",
- CONTACTS_LOOKUP_ID_DATA);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/#/photo",
- CONTACTS_LOOKUP_ID_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/display_photo",
- CONTACTS_LOOKUP_DISPLAY_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/#/display_photo",
- CONTACTS_LOOKUP_ID_DISPLAY_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/entities",
- CONTACTS_LOOKUP_ENTITIES);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/#/entities",
- CONTACTS_LOOKUP_ID_ENTITIES);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/stream_items",
- CONTACTS_LOOKUP_STREAM_ITEMS);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/lookup/*/#/stream_items",
- CONTACTS_LOOKUP_ID_STREAM_ITEMS);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/as_vcard/*", CONTACTS_AS_VCARD);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/as_multi_vcard/*",
- CONTACTS_AS_MULTI_VCARD);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/strequent/", CONTACTS_STREQUENT);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/strequent/filter/*",
- CONTACTS_STREQUENT_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/group/*", CONTACTS_GROUP);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/frequent", CONTACTS_FREQUENT);
- matcher.addURI(ContactsContract.AUTHORITY, "contacts/delete_usage", CONTACTS_DELETE_USAGE);
- 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_ID_DATA);
- matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/display_photo",
+ String path = Contacts.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, CONTACTS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#",CONTACTS_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/data", CONTACTS_ID_DATA);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/entities", CONTACTS_ID_ENTITIES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/suggestions",
+ AGGREGATION_SUGGESTIONS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/suggestions/*",
+ AGGREGATION_SUGGESTIONS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/photo", CONTACTS_ID_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/display_photo",
+ CONTACTS_ID_DISPLAY_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/stream_items",
+ CONTACTS_ID_STREAM_ITEMS);
+
+ path = Contacts.CONTENT_FILTER_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, CONTACTS_FILTER);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", CONTACTS_FILTER);
+
+ path = Contacts.CONTENT_LOOKUP_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", CONTACTS_LOOKUP);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/data", CONTACTS_LOOKUP_DATA);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/photo", CONTACTS_LOOKUP_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/#", CONTACTS_LOOKUP_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/#/data", CONTACTS_LOOKUP_ID_DATA);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/#/photo", CONTACTS_LOOKUP_ID_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/display_photo",
+ CONTACTS_LOOKUP_DISPLAY_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/#/display_photo",
+ CONTACTS_LOOKUP_ID_DISPLAY_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/entities", CONTACTS_LOOKUP_ENTITIES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/#/entities",
+ CONTACTS_LOOKUP_ID_ENTITIES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/stream_items",
+ CONTACTS_LOOKUP_STREAM_ITEMS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*/#/stream_items",
+ CONTACTS_LOOKUP_ID_STREAM_ITEMS);
+
+ matcher.addURI(ContactsContract.AUTHORITY, Contacts.CONTENT_VCARD_URI.getPath() + "/*",
+ CONTACTS_AS_VCARD);
+
+ matcher.addURI(ContactsContract.AUTHORITY,
+ Contacts.CONTENT_MULTI_VCARD_URI.getPath() + "/*", CONTACTS_AS_MULTI_VCARD);
+
+ matcher.addURI(ContactsContract.AUTHORITY, Contacts.CONTENT_STREQUENT_URI.getPath(),
+ CONTACTS_STREQUENT);
+
+ matcher.addURI(ContactsContract.AUTHORITY,
+ Contacts.CONTENT_STREQUENT_FILTER_URI.getPath() + "/*", CONTACTS_STREQUENT_FILTER);
+
+ matcher.addURI(ContactsContract.AUTHORITY, Contacts.CONTENT_GROUP_URI.getPath() + "/*",
+ CONTACTS_GROUP);
+
+ matcher.addURI(ContactsContract.AUTHORITY, Contacts.CONTENT_FREQUENT_URI.getPath(),
+ CONTACTS_FREQUENT);
+
+ matcher.addURI(ContactsContract.AUTHORITY, DataUsageFeedback.DELETE_USAGE_URI.getPath(),
+ CONTACTS_DELETE_USAGE);
+
+ path = RawContacts.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, RAW_CONTACTS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", RAW_CONTACTS_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/data", RAW_CONTACTS_ID_DATA);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/display_photo",
RAW_CONTACTS_ID_DISPLAY_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/entity", RAW_CONTACT_ID_ENTITY);
- matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/stream_items",
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/entity", RAW_CONTACT_ID_ENTITY);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/stream_items",
RAW_CONTACTS_ID_STREAM_ITEMS);
- matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/stream_items/#",
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/stream_items/#",
RAW_CONTACTS_ID_STREAM_ITEMS_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "raw_contact_entities", RAW_CONTACT_ENTITIES);
+ path = RawContactsEntity.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, RAW_CONTACT_ENTITIES);
- matcher.addURI(ContactsContract.AUTHORITY, "data", DATA);
- matcher.addURI(ContactsContract.AUTHORITY, "data/#", DATA_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "data/phones", PHONES);
- matcher.addURI(ContactsContract.AUTHORITY, "data/phones/#", PHONES_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "data/phones/filter", PHONES_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "data/phones/filter/*", PHONES_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "data/emails", EMAILS);
- matcher.addURI(ContactsContract.AUTHORITY, "data/emails/#", EMAILS_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "data/emails/lookup", EMAILS_LOOKUP);
- matcher.addURI(ContactsContract.AUTHORITY, "data/emails/lookup/*", EMAILS_LOOKUP);
- matcher.addURI(ContactsContract.AUTHORITY, "data/emails/filter", EMAILS_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "data/emails/filter/*", EMAILS_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "data/postals", POSTALS);
- matcher.addURI(ContactsContract.AUTHORITY, "data/postals/#", POSTALS_ID);
+ path = Data.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, DATA);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", DATA_ID);
+
+ path = Phone.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, PHONES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", PHONES_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/filter", PHONES_FILTER);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/filter/*", PHONES_FILTER);
+
+ path = Email.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, EMAILS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", EMAILS_ID);
+
+ path = Email.CONTENT_LOOKUP_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, EMAILS_LOOKUP);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", EMAILS_LOOKUP);
+
+ path = Email.CONTENT_FILTER_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, EMAILS_FILTER);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", EMAILS_FILTER);
+
+ path = StructuredPostal.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, POSTALS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", POSTALS_ID);
+
+ path = DataUsageFeedback.FEEDBACK_URI.getPath();
/** "*" 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, path + "/*", DATA_USAGE_FEEDBACK_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "data/contactables/", CONTACTABLES);
- matcher.addURI(ContactsContract.AUTHORITY, "data/contactables/filter", CONTACTABLES_FILTER);
- matcher.addURI(ContactsContract.AUTHORITY, "data/contactables/filter/*",
- CONTACTABLES_FILTER);
+ path = Callable.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, CALLABLES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", CALLABLES_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "groups", GROUPS);
- matcher.addURI(ContactsContract.AUTHORITY, "groups/#", GROUPS_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "groups_summary", GROUPS_SUMMARY);
+ path = Callable.CONTENT_FILTER_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, CALLABLES_FILTER);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", CALLABLES_FILTER);
+
+ path = Contactables.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, CONTACTABLES);
+
+ path = Contactables.CONTENT_FILTER_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, CONTACTABLES_FILTER);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", CONTACTABLES_FILTER);
+
+ path = Groups.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, GROUPS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", GROUPS_ID);
+
+ path = Groups.CONTENT_SUMMARY_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, GROUPS_SUMMARY);
matcher.addURI(ContactsContract.AUTHORITY, SyncStateContentProviderHelper.PATH, SYNCSTATE);
matcher.addURI(ContactsContract.AUTHORITY, SyncStateContentProviderHelper.PATH + "/#",
@@ -1214,16 +1254,18 @@
"profile/" + SyncStateContentProviderHelper.PATH + "/#",
PROFILE_SYNCSTATE_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "phone_lookup/*", PHONE_LOOKUP);
- matcher.addURI(ContactsContract.AUTHORITY, "aggregation_exceptions",
- AGGREGATION_EXCEPTIONS);
- matcher.addURI(ContactsContract.AUTHORITY, "aggregation_exceptions/*",
- AGGREGATION_EXCEPTION_ID);
+ path = PhoneLookup.CONTENT_FILTER_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", PHONE_LOOKUP);
- matcher.addURI(ContactsContract.AUTHORITY, "settings", SETTINGS);
+ path = AggregationExceptions.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, AGGREGATION_EXCEPTIONS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/*", AGGREGATION_EXCEPTION_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "status_updates", STATUS_UPDATES);
- matcher.addURI(ContactsContract.AUTHORITY, "status_updates/#", STATUS_UPDATES_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, Settings.CONTENT_URI.getPath(), SETTINGS);
+
+ path = StatusUpdates.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, STATUS_UPDATES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", STATUS_UPDATES_ID);
matcher.addURI(ContactsContract.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY,
SEARCH_SUGGESTIONS);
@@ -1232,47 +1274,59 @@
matcher.addURI(ContactsContract.AUTHORITY, SearchManager.SUGGEST_URI_PATH_SHORTCUT + "/*",
SEARCH_SHORTCUT);
- matcher.addURI(ContactsContract.AUTHORITY, "provider_status", PROVIDER_STATUS);
+ matcher.addURI(ContactsContract.AUTHORITY, ProviderStatus.CONTENT_URI.getPath(),
+ PROVIDER_STATUS);
- matcher.addURI(ContactsContract.AUTHORITY, "directories", DIRECTORIES);
- matcher.addURI(ContactsContract.AUTHORITY, "directories/#", DIRECTORIES_ID);
+ path = Directory.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, DIRECTORIES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", DIRECTORIES_ID);
matcher.addURI(ContactsContract.AUTHORITY, "complete_name", COMPLETE_NAME);
- matcher.addURI(ContactsContract.AUTHORITY, "profile", PROFILE);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/entities", PROFILE_ENTITIES);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/data", PROFILE_DATA);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/data/#", PROFILE_DATA_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/photo", PROFILE_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/display_photo", PROFILE_DISPLAY_PHOTO);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/as_vcard", PROFILE_AS_VCARD);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/raw_contacts", PROFILE_RAW_CONTACTS);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/raw_contacts/#",
- PROFILE_RAW_CONTACTS_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/raw_contacts/#/data",
- PROFILE_RAW_CONTACTS_ID_DATA);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/raw_contacts/#/entity",
- PROFILE_RAW_CONTACTS_ID_ENTITIES);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/status_updates",
+ path = Profile.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, PROFILE);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/entities", PROFILE_ENTITIES);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/data", PROFILE_DATA);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/data/#", PROFILE_DATA_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/photo", PROFILE_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/display_photo", PROFILE_DISPLAY_PHOTO);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/status_updates",
PROFILE_STATUS_UPDATES);
- matcher.addURI(ContactsContract.AUTHORITY, "profile/raw_contact_entities",
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/raw_contact_entities",
PROFILE_RAW_CONTACT_ENTITIES);
- matcher.addURI(ContactsContract.AUTHORITY, "stream_items", STREAM_ITEMS);
- matcher.addURI(ContactsContract.AUTHORITY, "stream_items/photo", STREAM_ITEMS_PHOTOS);
- matcher.addURI(ContactsContract.AUTHORITY, "stream_items/#", STREAM_ITEMS_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "stream_items/#/photo", STREAM_ITEMS_ID_PHOTOS);
- matcher.addURI(ContactsContract.AUTHORITY, "stream_items/#/photo/#",
+ path = Profile.CONTENT_VCARD_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, PROFILE_AS_VCARD);
+
+ path = Profile.CONTENT_RAW_CONTACTS_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, PROFILE_RAW_CONTACTS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", PROFILE_RAW_CONTACTS_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/data", PROFILE_RAW_CONTACTS_ID_DATA);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/entity",
+ PROFILE_RAW_CONTACTS_ID_ENTITIES);
+
+ path = StreamItems.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, STREAM_ITEMS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/photo", STREAM_ITEMS_PHOTOS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", STREAM_ITEMS_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/photo", STREAM_ITEMS_ID_PHOTOS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#/photo/#",
STREAM_ITEMS_ID_PHOTOS_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "stream_items_limit", STREAM_ITEMS_LIMIT);
- matcher.addURI(ContactsContract.AUTHORITY, "display_photo/#", DISPLAY_PHOTO_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "photo_dimensions", PHOTO_DIMENSIONS);
+ matcher.addURI(ContactsContract.AUTHORITY, StreamItems.CONTENT_LIMIT_URI.getPath(),
+ STREAM_ITEMS_LIMIT);
- matcher.addURI(ContactsContract.AUTHORITY, "deleted_contacts", DELETED_CONTACTS);
- matcher.addURI(ContactsContract.AUTHORITY, "deleted_contacts/#", DELETED_CONTACTS_ID);
+ matcher.addURI(ContactsContract.AUTHORITY, DisplayPhoto.CONTENT_URI.getPath() + "/#",
+ DISPLAY_PHOTO_ID);
- matcher.addURI(ContactsContract.AUTHORITY, "pinned_position_update",
+ matcher.addURI(ContactsContract.AUTHORITY,
+ DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI.getPath(), PHOTO_DIMENSIONS);
+
+ path = DeletedContacts.CONTENT_URI.getPath();
+ matcher.addURI(ContactsContract.AUTHORITY, path, DELETED_CONTACTS);
+ matcher.addURI(ContactsContract.AUTHORITY, path + "/#", DELETED_CONTACTS_ID);
+
+ matcher.addURI(ContactsContract.AUTHORITY, PinnedPositions.UPDATE_URI.getPath(),
PINNED_POSITION_UPDATE);
}
@@ -4795,10 +4849,14 @@
" FROM " + Tables.RAW_CONTACTS +
" WHERE " + RawContactsColumns.ACCOUNT_ID + " = ?1" +
" AND " + RawContactsColumns.CONCRETE_CONTACT_ID +
+ " IS NOT NULL" +
+ " AND " + RawContactsColumns.CONCRETE_CONTACT_ID +
" NOT IN (" +
" SELECT " + RawContactsColumns.CONCRETE_CONTACT_ID +
" FROM " + Tables.RAW_CONTACTS +
" WHERE " + RawContactsColumns.ACCOUNT_ID + " != ?1"
+ + " AND " + RawContactsColumns.CONCRETE_CONTACT_ID +
+ " IS NOT NULL"
+ ")", accountIdParams);
try {
while (cursor.moveToNext()) {
@@ -5428,8 +5486,9 @@
qb.setProjectionMap(sStrequentStarredProjectionMap);
starredInnerQuery = qb.buildQuery(subProjection,
- Contacts.STARRED + "=1", Contacts._ID, null,
- Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC", null);
+ DbQueryUtils.concatenateClauses(selection, Contacts.STARRED + "=1"),
+ Contacts._ID, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC",
+ null);
// Reset the builder, and build the second query for frequents contacts
qb = new SQLiteQueryBuilder();
@@ -6147,13 +6206,10 @@
selectionArgs = mDbHelper.get().buildSipContactQuery(sb, sipAddress);
selection = sb.toString();
} else {
- // Use this flag to track whether sortOrder was originally empty
- boolean sortOrderIsEmpty = false;
if (TextUtils.isEmpty(sortOrder)) {
// Default the sort order to something reasonable so we get consistent
// results when callers don't request an ordering
sortOrder = " length(lookup.normalized_number) DESC";
- sortOrderIsEmpty = true;
}
String number = uri.getPathSegments().size() > 1
@@ -6166,29 +6222,46 @@
qb, normalizedNumber, numberE164);
qb.setProjectionMap(sPhoneLookupProjectionMap);
+ // removeNonStarMatchesFromCursor() requires the cursor to contain
+ // PhoneLookup.NUMBER. Therefore, if the projection explicitly omits it, extend
+ // the projection.
+ String[] projectionWithNumber = projection;
+ if (projection != null
+ && !ArrayUtils.contains(projection,PhoneLookup.NUMBER)) {
+ projectionWithNumber = ArrayUtils.appendElement(String.class, projection,
+ PhoneLookup.NUMBER);
+ }
+
// Peek at the results of the first query (which attempts to use fully
// normalized and internationalized numbers for comparison). If no results
// were returned, fall back to using the SQLite function
// phone_number_compare_loose.
qb.setStrict(true);
boolean foundResult = false;
- Cursor cursor = query(db, qb, projection, selection, selectionArgs,
+ Cursor cursor = query(db, qb, projectionWithNumber, selection, selectionArgs,
sortOrder, groupBy, null, limit, cancellationSignal);
try {
if (cursor.getCount() > 0) {
foundResult = true;
- return cursor;
+ return PhoneLookupWithStarPrefix
+ .removeNonStarMatchesFromCursor(number, cursor);
} else {
// Use fallback lookup method
qb = new SQLiteQueryBuilder();
+ qb.setProjectionMap(sPhoneLookupProjectionMap);
+ qb.setStrict(true);
// use the raw number instead of the normalized number because
// phone_number_compare_loose in SQLite works only with non-normalized
// numbers
mDbHelper.get().buildFallbackPhoneLookupAndContactQuery(qb, number);
- qb.setProjectionMap(sPhoneLookupProjectionMap);
+ final Cursor fallbackCursor = query(db, qb, projectionWithNumber,
+ selection, selectionArgs, sortOrder, groupBy, having, limit,
+ cancellationSignal);
+ return PhoneLookupWithStarPrefix
+ .removeNonStarMatchesFromCursor(number, fallbackCursor);
}
} finally {
if (!foundResult) {
@@ -6371,7 +6444,7 @@
String id = uri.getLastPathSegment();
qb.setTables(Tables.DELETED_CONTACTS);
qb.setProjectionMap(sDeletedContactsProjectionMap);
- qb.appendWhere(ContactsContract.DeletedContacts.CONTACT_ID + "=?");
+ qb.appendWhere(DeletedContacts.CONTACT_ID + "=?");
selectionArgs = insertSelectionArg(selectionArgs, id);
break;
}
diff --git a/src/com/android/providers/contacts/PhoneLookupWithStarPrefix.java b/src/com/android/providers/contacts/PhoneLookupWithStarPrefix.java
new file mode 100644
index 0000000..a05dd05
--- /dev/null
+++ b/src/com/android/providers/contacts/PhoneLookupWithStarPrefix.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2014 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.internal.annotations.VisibleForTesting;
+
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.provider.ContactsContract.PhoneLookup;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * Helper class for PHONE_LOOKUP's that involve numbers with "*" prefixes.
+ */
+/* package-protected */ final class PhoneLookupWithStarPrefix {
+ private static final String TAG = "PhoneLookupWSP";
+
+ /**
+ * Returns a cursor with a subset of the rows passed into this function. If {@param number}
+ * starts with a "*" then only rows from {@param cursor} that have a number equal to
+ * {@param number} will be returned. If {@param number} doesn't start with a "*", then
+ * only rows from {@param cursor} that have numbers without starting "*" characters
+ * will be returned.
+ *
+ * This function is used to resolve b/13195334.
+ *
+ * @param number unnormalized phone number.
+ * @param cursor this function takes ownership of the cursor. The calling scope MUST NOT
+ * use or close() the cursor passed into this function. The cursor must contain
+ * PhoneLookup.NUMBER.
+ *
+ * @return a cursor that the calling context owns
+ */
+ public static Cursor removeNonStarMatchesFromCursor(String number, Cursor cursor) {
+
+ // Close cursors that we don't return.
+ Cursor unreturnedCursor = cursor;
+
+ try {
+ if (TextUtils.isEmpty(number)) {
+ unreturnedCursor = null;
+ return cursor;
+ }
+
+ final String queryPhoneNumberNormalized = normalizeNumberWithStar(number);
+ if (!queryPhoneNumberNormalized.startsWith("*")
+ && !matchingNumberStartsWithStar(cursor)) {
+ cursor.moveToPosition(-1);
+ unreturnedCursor = null;
+ return cursor;
+ }
+
+ final MatrixCursor matrixCursor = new MatrixCursor(cursor.getColumnNames());
+
+ // Close cursors that we don't return.
+ Cursor unreturnedMatrixCursor = matrixCursor;
+
+ try {
+ cursor.moveToPosition(-1);
+ while (cursor.moveToNext()) {
+ final int numberIndex = cursor.getColumnIndex(PhoneLookup.NUMBER);
+ final String matchingNumberNormalized
+ = normalizeNumberWithStar(cursor.getString(numberIndex));
+ if (!matchingNumberNormalized.startsWith("*")
+ && !queryPhoneNumberNormalized.startsWith("*")
+ || matchingNumberNormalized.equals(queryPhoneNumberNormalized)) {
+ // Copy row from cursor into matrixCursor
+ final MatrixCursor.RowBuilder b = matrixCursor.newRow();
+ for (int column = 0; column < cursor.getColumnCount(); column++) {
+ b.add(cursor.getColumnName(column), cursorValue(cursor, column));
+ }
+ }
+ }
+ unreturnedMatrixCursor = null;
+ return matrixCursor;
+ } finally {
+ if (unreturnedMatrixCursor != null) {
+ unreturnedMatrixCursor.close();
+ }
+ }
+ } finally {
+ if (unreturnedCursor != null) {
+ unreturnedCursor.close();
+ }
+ }
+ }
+
+ @VisibleForTesting
+ static String normalizeNumberWithStar(String phoneNumber) {
+ if (TextUtils.isEmpty(phoneNumber)) {
+ return phoneNumber;
+ }
+ if (phoneNumber.startsWith("*")) {
+ // Use PhoneNumberUtils.normalizeNumber() to normalize the rest of the number after
+ // the leading "*". Strip out the "+" since "+"s are only allowed as leading
+ // characters. NOTE: This statement has poor performance. Fortunately, it won't be
+ // called very often.
+ return "*" + PhoneNumberUtils.normalizeNumber(
+ phoneNumber.substring(1).replace("+", ""));
+ }
+ return PhoneNumberUtils.normalizeNumber(phoneNumber);
+ }
+
+ /**
+ * @return whether {@param cursor} contain any numbers that start with "*"
+ */
+ private static boolean matchingNumberStartsWithStar(Cursor cursor) {
+ cursor.moveToPosition(-1);
+ while (cursor.moveToNext()) {
+ final int numberIndex = cursor.getColumnIndex(PhoneLookup.NUMBER);
+ final String phoneNumber = normalizeNumberWithStar(cursor.getString(numberIndex));
+ if (phoneNumber.startsWith("*")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static Object cursorValue(Cursor cursor, int column) {
+ switch(cursor.getType(column)) {
+ case Cursor.FIELD_TYPE_BLOB:
+ return cursor.getBlob(column);
+ case Cursor.FIELD_TYPE_INTEGER:
+ return cursor.getInt(column);
+ case Cursor.FIELD_TYPE_FLOAT:
+ return cursor.getFloat(column);
+ case Cursor.FIELD_TYPE_STRING:
+ return cursor.getString(column);
+ case Cursor.FIELD_TYPE_NULL:
+ return null;
+ default:
+ Log.d(TAG, "Invalid value in cursor: " + cursor.getType(column));
+ return null;
+ }
+ }
+}
diff --git a/src/com/android/providers/contacts/ProfileAwareUriMatcher.java b/src/com/android/providers/contacts/ProfileAwareUriMatcher.java
index 051c60e..ee5ec03 100644
--- a/src/com/android/providers/contacts/ProfileAwareUriMatcher.java
+++ b/src/com/android/providers/contacts/ProfileAwareUriMatcher.java
@@ -67,7 +67,13 @@
// Do a second tokenization pass to determine whether the URI may apply to profiles.
if (path != null) {
- String[] tokens = PATH_SPLIT_PATTERN.split(path);
+ String newPath = path;
+ // Strip leading slash if present.
+ if (path.length() > 0 && path.charAt(0) == '/') {
+ newPath = path.substring(1);
+ }
+ String[] tokens = PATH_SPLIT_PATTERN.split(newPath);
+
if (tokens != null) {
// Keep track of whether we've passed a "lookup" token in the path; wildcards after
diff --git a/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java b/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
index ea4ef0f..1120981 100644
--- a/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
+++ b/tests/src/com/android/providers/contacts/ContactLocaleUtilsTest.java
@@ -37,6 +37,9 @@
private static final String KANJI_NAME = "\u65e5";
private static final String ARABIC_NAME = "\u0646\u0648\u0631"; /* Noor */
private static final String CHINESE_NAME = "\u675C\u9D51";
+ private static final String SERBIAN_NAME = "\u0408\u0435\u043B\u0435\u043D\u0430";
+ private static final String UKRAINIAN_NAME = "\u0407";
+ private static final String UKRAINIAN_NAME_2 = "\u0490";
private static final String CHINESE_LATIN_MIX_NAME_1 = "D\u675C\u9D51";
private static final String CHINESE_LATIN_MIX_NAME_2 = "MARY \u675C\u9D51";
private static final String[] CHINESE_NAME_KEY = {"\u9D51", "\u675C\u9D51", "JUAN", "DUJUAN",
@@ -93,11 +96,15 @@
private static final String JAPANESE_MISC = "\u4ed6";
private static final Locale LOCALE_ARABIC = new Locale("ar");
+ private static final Locale LOCALE_SERBIAN = new Locale("sr");
+ private static final Locale LOCALE_UKRAINIAN = new Locale("uk");
private boolean hasChineseCollator;
private boolean hasJapaneseCollator;
private boolean hasKoreanCollator;
private boolean hasArabicCollator;
private boolean hasGermanCollator;
+ private boolean hasSerbianCollator;
+ private boolean hasUkrainianCollator;
@Override
protected void setUp() throws Exception {
@@ -114,6 +121,10 @@
hasArabicCollator = true;
} else if (locale[i].equals(Locale.GERMANY)) {
hasGermanCollator = true;
+ } else if (locale[i].equals(LOCALE_SERBIAN)) {
+ hasSerbianCollator = true;
+ } else if (locale[i].equals(LOCALE_UKRAINIAN)) {
+ hasUkrainianCollator = true;
}
}
}
@@ -143,6 +154,16 @@
assertEquals("D", getLabel(CHINESE_LATIN_MIX_NAME_1));
assertEquals("B", getLabel("Bob Smith"));
+ if (hasArabicCollator) {
+ assertEquals("\u0646", getLabel(ARABIC_NAME));
+ }
+ if (hasSerbianCollator) {
+ assertEquals("\u0408", getLabel(SERBIAN_NAME));
+ }
+ if (hasUkrainianCollator) {
+ assertEquals("\u0407", getLabel(UKRAINIAN_NAME));
+ }
+
assertNull(getNameLookupKeys(LATIN_NAME, FullNameStyle.UNDEFINED));
verifyLabels(getLabels(), LABELS_EN_US);
}
@@ -253,6 +274,30 @@
verifyLabels(getLabels(), LABELS_AR);
}
+ public void testSerbianContactLocaleUtils() throws Exception {
+ if (!hasSerbianCollator) {
+ return;
+ }
+
+ ContactLocaleUtils.setLocale(LOCALE_SERBIAN);
+ assertEquals("\u0408", getLabel(SERBIAN_NAME));
+ assertEquals("B", getLabel("Bob Smith"));
+ }
+
+ public void testUkrainianContactLocaleUtils() throws Exception {
+ if (!hasUkrainianCollator) {
+ return;
+ }
+
+ ContactLocaleUtils.setLocale(LOCALE_UKRAINIAN);
+ assertEquals("\u0407", getLabel(UKRAINIAN_NAME));
+ // ICU 52 has a bug whereby this letter has a bucket created only if
+ // Ukrainian is the primary language. Once this is fixed also test this
+ // label when in English locale.
+ assertEquals("\u0490", getLabel(UKRAINIAN_NAME_2));
+ assertEquals("B", getLabel("Bob Smith"));
+ }
+
public void testGermanContactLocaleUtils() throws Exception {
if (!hasGermanCollator) {
return;
diff --git a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
index 4cdf2b3..9f0dfd8 100644
--- a/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
+++ b/tests/src/com/android/providers/contacts/ContactsProvider2Test.java
@@ -1353,6 +1353,131 @@
assertEquals(0, getCount(lookupUri2, null, null));
}
+ public void testPhoneLookupStarUseCases() {
+ // Create two raw contacts with numbers "*123" and "12 3". This is a real life example
+ // from b/13195334.
+ final ContentValues values = new ContentValues();
+ Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values);
+ long rawContactId = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId, "Emergency", /* familyName =*/ null);
+ insertPhoneNumber(rawContactId, "*123");
+
+ rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values);
+ rawContactId = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId, "Voicemail", /* familyName =*/ null);
+ insertPhoneNumber(rawContactId, "12 3");
+
+ // Verify: "123" returns the "Voicemail" raw contact id. It should not match
+ // a phone number that starts with a "*".
+ Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "123");
+ values.clear();
+ values.put(PhoneLookup.DISPLAY_NAME, "Voicemail");
+ assertStoredValues(lookupUri, null, null, new ContentValues[] {values});
+
+ lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "(1) 23");
+ values.clear();
+ values.put(PhoneLookup.DISPLAY_NAME, "Voicemail");
+ assertStoredValues(lookupUri, null, null, new ContentValues[] {values});
+
+ // Verify: "*123" returns the "Emergency" raw contact id.
+ lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "*1-23");
+ values.clear();
+ values.put(PhoneLookup.DISPLAY_NAME, "Emergency");
+ assertStoredValues(lookupUri, null, null, new ContentValues[] {values});
+ }
+
+ public void testPhoneLookupReturnsNothingRatherThanStar() {
+ // Create Emergency raw contact with "*123456789" number.
+ final ContentValues values = new ContentValues();
+ final Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values);
+ final long rawContactId1 = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId1, "Emergency",
+ /* familyName =*/ null);
+ insertPhoneNumber(rawContactId1, "*123456789");
+
+ // Lookup should return no results. It does not ignore stars even when no other matches.
+ final Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "123456789");
+ assertEquals(0, getCount(lookupUri, null, null));
+ }
+
+ public void testPhoneLookupReturnsNothingRatherThanMissStar() {
+ // Create Voice Mail raw contact with "123456789" number.
+ final ContentValues values = new ContentValues();
+ final Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values);
+ final long rawContactId1 = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId1, "Voice mail",
+ /* familyName =*/ null);
+ insertPhoneNumber(rawContactId1, "123456789");
+
+ // Lookup should return no results. It does not ignore stars even when no other matches.
+ final Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "*123456789");
+ assertEquals(0, getCount(lookupUri, null, null));
+ }
+
+ public void testPhoneLookupStarNoFallbackMatch() {
+ final ContentValues values = new ContentValues();
+ final Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values);
+ final long rawContactId1 = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId1, "Voice mail",
+ /* familyName =*/ null);
+ insertPhoneNumber(rawContactId1, "*011123456789");
+
+ // The numbers "+123456789" and "*011123456789" are a "fallback" match. The + is equivalent
+ // to "011". This lookup should return no results. Lookup does not ignore
+ // stars, even when doing a fallback lookup.
+ final Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "+123456789");
+ assertEquals(0, getCount(lookupUri, null, null));
+ }
+
+ public void testPhoneLookupStarNotBreakFallbackMatching() {
+ // Create a raw contact with a phone number starting with "011"
+ Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues());
+ long rawContactId = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId, "No star",
+ /* familyName =*/ null);
+ insertPhoneNumber(rawContactId, "011123456789");
+
+ // Create a raw contact with a phone number starting with "*011"
+ rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, new ContentValues());
+ rawContactId = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId, "Has star",
+ /* familyName =*/ null);
+ insertPhoneNumber(rawContactId, "*011123456789");
+
+ // A phone number starting with "+" can (fallback) match the same phone number starting
+ // with "001". Verify that this fallback matching still occurs in the presence of
+ // numbers starting with "*"s.
+ final Uri lookupUri1 = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
+ "+123456789");
+ final ContentValues values = new ContentValues();
+ values.put(PhoneLookup.DISPLAY_NAME, "No star");
+ assertStoredValues(lookupUri1, null, null, new ContentValues[] {values});
+ }
+
+ public void testPhoneLookupExplicitProjection() {
+ final ContentValues values = new ContentValues();
+ final Uri rawContactUri = mResolver.insert(RawContacts.CONTENT_URI, values);
+ final long rawContactId1 = ContentUris.parseId(rawContactUri);
+ DataUtil.insertStructuredName(mResolver, rawContactId1, "Voice mail",
+ /* familyName =*/ null);
+ insertPhoneNumber(rawContactId1, "+1234567");
+
+ // Performing a query with a non-null projection with or without PhoneLookup.Number inside
+ // it should not cause a crash.
+ Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "1234567");
+ String[] projection = new String[] {PhoneLookup.DISPLAY_NAME};
+ mResolver.query(lookupUri, projection, null, null, null);
+ projection = new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.NUMBER};
+ mResolver.query(lookupUri, projection, null, null, null);
+
+ // Shouldn't crash for a fallback query either
+ lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, "*0111234567");
+ projection = new String[] {PhoneLookup.DISPLAY_NAME};
+ mResolver.query(lookupUri, projection, null, null, null);
+ projection = new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.NUMBER};
+ mResolver.query(lookupUri, projection, null, null, null);
+ }
+
public void testPhoneLookupUseCases() {
ContentValues values = new ContentValues();
Uri rawContactUri;
diff --git a/tests/src/com/android/providers/contacts/PhoneLookupWithStarPrefixTest.java b/tests/src/com/android/providers/contacts/PhoneLookupWithStarPrefixTest.java
new file mode 100644
index 0000000..cd86a42
--- /dev/null
+++ b/tests/src/com/android/providers/contacts/PhoneLookupWithStarPrefixTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.test.suitebuilder.annotation.SmallTest;
+
+@LargeTest
+public class PhoneLookupWithStarPrefixTest extends AndroidTestCase {
+
+ @SmallTest
+ public void testNormalizeNumberWithStar() {
+ assertEquals("6502910000", PhoneLookupWithStarPrefix.normalizeNumberWithStar(
+ "650 2910000"));
+ assertEquals("1234567", PhoneLookupWithStarPrefix.normalizeNumberWithStar("12,3#4*567"));
+ assertEquals("8004664114", PhoneLookupWithStarPrefix.normalizeNumberWithStar(
+ "800-GOOG-114"));
+ assertEquals("+16502910000", PhoneLookupWithStarPrefix.normalizeNumberWithStar(
+ "+1 650 2910000"));
+ assertEquals("*16502910000", PhoneLookupWithStarPrefix.normalizeNumberWithStar(
+ "*1 650 2910000"));
+ assertEquals("*123", PhoneLookupWithStarPrefix.normalizeNumberWithStar("*1-23"));
+ assertEquals("*123", PhoneLookupWithStarPrefix.normalizeNumberWithStar("*+1-23"));
+ }
+
+}