Merge branch 'lineage-21.0' of https://github.com/LineageOS/android_packages_apps_Contacts into leaf-3.2
Change-Id: I9488ec833190264087fe9a3da269c168c6771c9b
diff --git a/Android.bp b/Android.bp
index de90412..36923ab 100644
--- a/Android.bp
+++ b/Android.bp
@@ -25,6 +25,7 @@
srcs: [
"src/**/*.java",
+ "src/**/*.kt",
"src-bind/**/*.java",
],
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 34f68b0..e98eed4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -20,14 +20,15 @@
android:versionName="1.7.34">
<uses-sdk
- android:minSdkVersion="33"
- android:targetSdkVersion="33"/>
+ android:minSdkVersion="34"
+ android:targetSdkVersion="34"/>
<original-package android:name="com.android.contacts"/>
<!-- Contacts permission listed first because order determines
order that permissions are requested with some OEMs -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
+ <uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
@@ -56,6 +57,8 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.HIDE_OVERLAY_WINDOWS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
+ <!-- Required in U to run Service.startForeground() under DATA_SYNC type -->
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
<uses-feature
android:name="android.hardware.telephony"
@@ -631,6 +634,17 @@
android:name="android.nfc.disable_beam_default"
android:value="true"/>
+ <provider
+ android:name="com.android.contacts.sdn.SdnProvider"
+ android:authorities="@string/contacts_sdn_provider_authority"
+ android:enabled="true"
+ android:exported="true"
+ android:readPermission="android.permission.BIND_DIRECTORY_SEARCH">
+ <meta-data
+ android:name="android.content.ContactDirectory"
+ android:value="true" />
+ </provider>
+
</application>
<!-- Allows the contacts app to see the activities and services needed
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 1642b82..ae0b789 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Kennisgewings"</string>
<string name="yes_button" msgid="1120514817091581293">"Ja"</string>
<string name="no_button" msgid="8965841385742548947">"Nee"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Diensverskafferdiensnommers"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 03a8fab..ddf5208 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"ማሳወቂያዎች"</string>
<string name="yes_button" msgid="1120514817091581293">"አዎ"</string>
<string name="no_button" msgid="8965841385742548947">"አይ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"የአገልግሎት አቅራቢ አገልግሎት ቁጥሮች"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 0e830e9..c5d57d4 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"الإشعارات"</string>
<string name="yes_button" msgid="1120514817091581293">"نعم"</string>
<string name="no_button" msgid="8965841385742548947">"لا"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"أرقام خدمات مشغّلي شبكة الجوّال"</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 18c1684..0c5ccfe 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"জাননীসমূহ"</string>
<string name="yes_button" msgid="1120514817091581293">"হয়"</string>
<string name="no_button" msgid="8965841385742548947">"নহয়"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"বাহকৰ সেৱাৰ নম্বৰ"</string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index fc47eb1..f56c54a 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Bildirişlər"</string>
<string name="yes_button" msgid="1120514817091581293">"Hə"</string>
<string name="no_button" msgid="8965841385742548947">"Yox"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operatorun xidmət nömrələri"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index a976a43..bb23865 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Obaveštenja"</string>
<string name="yes_button" msgid="1120514817091581293">"Da"</string>
<string name="no_button" msgid="8965841385742548947">"Ne"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Uslužni brojevi mobilnog operatera"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index fdf5078..5aaf751 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Апавяшчэнні"</string>
<string name="yes_button" msgid="1120514817091581293">"Так"</string>
<string name="no_button" msgid="8965841385742548947">"Не"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Сэрвісныя нумары аператара"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 157236e..1ca635b 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Известия"</string>
<string name="yes_button" msgid="1120514817091581293">"Да"</string>
<string name="no_button" msgid="8965841385742548947">"Не"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Номера за обслужване от оператора"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 9e2c696..e974eae 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"বিজ্ঞপ্তি"</string>
<string name="yes_button" msgid="1120514817091581293">"হ্যাঁ"</string>
<string name="no_button" msgid="8965841385742548947">"না"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"পরিষেবা প্রদানকারীর অপারেটরের নম্বর"</string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 937dac0..f9f4af6 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Obavještenja"</string>
<string name="yes_button" msgid="1120514817091581293">"Da"</string>
<string name="no_button" msgid="8965841385742548947">"Ne"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Uslužni brojevi mobilnog operatera"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 2eaabd1..8536460 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -455,11 +455,11 @@
<string name="call_subject_limit" msgid="5679166729627777474">"<xliff:g id="COUNT">%1$s</xliff:g>/<xliff:g id="LIMIT">%2$s</xliff:g>"</string>
<string name="call_subject_type_and_number" msgid="134754147019287616">"<xliff:g id="TYPE">%1$s</xliff:g> • <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="about_build_version" msgid="5870642814752351712">"Versió de la compilació"</string>
- <string name="about_open_source_licenses" msgid="1617836621315557445">"Llicències de programari lliure"</string>
+ <string name="about_open_source_licenses" msgid="1617836621315557445">"Llicències de codi obert"</string>
<string name="about_open_source_licenses_summary" msgid="4843627659117423491">"Detalls de la llicència de programari lliure"</string>
<string name="about_privacy_policy" msgid="4581488375200402678">"Política de privadesa"</string>
<string name="about_terms_of_service" msgid="7419670771785057738">"Condicions del servei"</string>
- <string name="activity_title_licenses" msgid="6434398894019119709">"Llicències de programari lliure"</string>
+ <string name="activity_title_licenses" msgid="6434398894019119709">"Llicències de codi obert"</string>
<string name="url_open_error_toast" msgid="4885855620824048385">"No s\'ha pogut obrir l\'URL."</string>
<string name="account_filter_view_checked" msgid="4740544238806346376">"S\'ha marcat <xliff:g id="ACCOUNT_INFO">%s</xliff:g>"</string>
<string name="account_filter_view_not_checked" msgid="5782705545786455847">"No s\'ha marcat <xliff:g id="ACCOUNT_INFO">%s</xliff:g>"</string>
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificacions"</string>
<string name="yes_button" msgid="1120514817091581293">"Sí"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Números de servei de l\'operador"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index f59107f..6d2480e 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Oznámení"</string>
<string name="yes_button" msgid="1120514817091581293">"Ano"</string>
<string name="no_button" msgid="8965841385742548947">"Ne"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Čísla služeb operátorů"</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 32c126e..730dcf5 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifikationer"</string>
<string name="yes_button" msgid="1120514817091581293">"Ja"</string>
<string name="no_button" msgid="8965841385742548947">"Nej"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Mobilselskabs servicenumre"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 99820d1..f65caad 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Benachrichtigungen"</string>
<string name="yes_button" msgid="1120514817091581293">"Ja"</string>
<string name="no_button" msgid="8965841385742548947">"Nein"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Servicenummern des Mobilfunkanbieters"</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index bc1826c..f4c70d9 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Ειδοποιήσεις"</string>
<string name="yes_button" msgid="1120514817091581293">"Ναι"</string>
<string name="no_button" msgid="8965841385742548947">"Όχι"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Αριθμοί εταιρείας κινητής τηλεφωνίας"</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 26c26f4..53ba496 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifications"</string>
<string name="yes_button" msgid="1120514817091581293">"Yes"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operator service numbers"</string>
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 7a2e95e..579ad61 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifications"</string>
<string name="yes_button" msgid="1120514817091581293">"Yes"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Carrier service numbers"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 26c26f4..53ba496 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifications"</string>
<string name="yes_button" msgid="1120514817091581293">"Yes"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operator service numbers"</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 26c26f4..53ba496 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifications"</string>
<string name="yes_button" msgid="1120514817091581293">"Yes"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operator service numbers"</string>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index b5dc952..b87d768 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifications"</string>
<string name="yes_button" msgid="1120514817091581293">"Yes"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Carrier service numbers"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 5135ef4..11bbacd 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificaciones."</string>
<string name="yes_button" msgid="1120514817091581293">"Sí"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Números de servicio del operador"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 8f316e8..b79c848 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificaciones"</string>
<string name="yes_button" msgid="1120514817091581293">"Sí"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Números de servicios del operador"</string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 0f52a23..e770e49 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Märguanded"</string>
<string name="yes_button" msgid="1120514817091581293">"Jah"</string>
<string name="no_button" msgid="8965841385742548947">"Ei"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operaatori klienditeeninduse numbrid"</string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 85aadbf..df7f2f5 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Jakinarazpenak"</string>
<string name="yes_button" msgid="1120514817091581293">"Bai"</string>
<string name="no_button" msgid="8965841385742548947">"Ez"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operadorearen zerbitzu-zenbakiak"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 0dd668d..55fd8a8 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"اعلانها"</string>
<string name="yes_button" msgid="1120514817091581293">"بله"</string>
<string name="no_button" msgid="8965841385742548947">"نه"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"شمارههای سرویس شرکت مخابراتی"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 7f24eb3..d3176e6 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Ilmoitukset"</string>
<string name="yes_button" msgid="1120514817091581293">"Kyllä"</string>
<string name="no_button" msgid="8965841385742548947">"Ei"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operaattorin palvelunumerot"</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 021f981..e051d63 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Avis"</string>
<string name="yes_button" msgid="1120514817091581293">"Oui"</string>
<string name="no_button" msgid="8965841385742548947">"Non"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Numéros de service du fournisseur"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 83cd256..b893399 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifications"</string>
<string name="yes_button" msgid="1120514817091581293">"Oui"</string>
<string name="no_button" msgid="8965841385742548947">"Non"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Numéros de service de l\'opérateur"</string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index f1d8c95..2188631 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificacións"</string>
<string name="yes_button" msgid="1120514817091581293">"Si"</string>
<string name="no_button" msgid="8965841385742548947">"Non"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Números de servizo do operador"</string>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 47fce4d..52e02b6 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -221,8 +221,8 @@
<string name="editor_delete_view_description_short" msgid="6471032197042328181">"<xliff:g id="DATA_KIND">%s</xliff:g> કાઢી નાખો"</string>
<string name="menu_assistant" msgid="3980364519724237934">"સૂચનો"</string>
<string name="menu_assistant_new_badge" msgid="1992049406019853898">"નવું"</string>
- <string name="navigation_drawer_open" msgid="3428713515765555712">"નેવિગેશન ડ્રોઅર ખોલો"</string>
- <string name="navigation_drawer_close" msgid="3052989100471689722">"નેવિગેશન ડ્રોઅર બંધ કરો"</string>
+ <string name="navigation_drawer_open" msgid="3428713515765555712">"નૅવિગેશન ડ્રોઅર ખોલો"</string>
+ <string name="navigation_drawer_close" msgid="3052989100471689722">"નૅવિગેશન ડ્રોઅર બંધ કરો"</string>
<string name="navigation_drawer_label" msgid="8391863484838783638">"<xliff:g id="LABEL_NAME">%s</xliff:g> લેબલ"</string>
<string name="menu_title_groups" msgid="3722199658759568221">"લેબલ્સ"</string>
<string name="menu_title_filters" msgid="349866121417914494">"એકાઉન્ટ્સ"</string>
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"સૂચનાઓ"</string>
<string name="yes_button" msgid="1120514817091581293">"હા"</string>
<string name="no_button" msgid="8965841385742548947">"ના"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"મોબાઇલ ઑપરેટરના ફોન નંબર"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 268493f..e705659 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"सूचनाएं"</string>
<string name="yes_button" msgid="1120514817091581293">"हां"</string>
<string name="no_button" msgid="8965841385742548947">"नहीं"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"मोबाइल और इंटरनेट सेवा वाली कंपनी के नंबर"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 6557812..aa85f37 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Obavijesti"</string>
<string name="yes_button" msgid="1120514817091581293">"Da"</string>
<string name="no_button" msgid="8965841385742548947">"Ne"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Servisni brojevi operatera"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 3d562b7..75d0cc7 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Értesítések"</string>
<string name="yes_button" msgid="1120514817091581293">"Igen"</string>
<string name="no_button" msgid="8965841385742548947">"Nem"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Szolgáltatói számok"</string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 9762b8c..2c80970 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Ծանուցումներ"</string>
<string name="yes_button" msgid="1120514817091581293">"Այո"</string>
<string name="no_button" msgid="8965841385742548947">"Ոչ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Օպերատորի ծառայության հեռախոսահամարներ"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 731f79a..aeaa7a1 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifikasi"</string>
<string name="yes_button" msgid="1120514817091581293">"Ya"</string>
<string name="no_button" msgid="8965841385742548947">"Tidak"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Nomor layanan operator"</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 87cb54e..73a167c 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Tilkynningar"</string>
<string name="yes_button" msgid="1120514817091581293">"Já"</string>
<string name="no_button" msgid="8965841385742548947">"Nei"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Þjónustunúmer símafyrirtækis"</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 7517bda..d6a94a4 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notifiche"</string>
<string name="yes_button" msgid="1120514817091581293">"Sì"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Numeri di servizio degli operatori"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index cdefb2e..b1d0300 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"הודעות"</string>
<string name="yes_button" msgid="1120514817091581293">"כן"</string>
<string name="no_button" msgid="8965841385742548947">"לא"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"מספרי השירות של ספק הסלולר"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 7d7cac5..a5d50d2 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"通知"</string>
<string name="yes_button" msgid="1120514817091581293">"はい"</string>
<string name="no_button" msgid="8965841385742548947">"いいえ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"携帯通信会社のサービス番号"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 2a2152e..d6a3fcb 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"შეტყობინებები"</string>
<string name="yes_button" msgid="1120514817091581293">"დიახ"</string>
<string name="no_button" msgid="8965841385742548947">"არა"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"ოპერატორის სერვისის ნომრები"</string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 4563946..4ef74c7 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Хабарландырулар"</string>
<string name="yes_button" msgid="1120514817091581293">"Иә"</string>
<string name="no_button" msgid="8965841385742548947">"Жоқ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Оператордың қызмет көрсету нөмірлері"</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index b788464..9543cdb 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"ការជូនដំណឹង"</string>
<string name="yes_button" msgid="1120514817091581293">"បាទ/ចាស"</string>
<string name="no_button" msgid="8965841385742548947">"ទេ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"លេខក្រុមហ៊ុនសេវាទូរសព្ទ"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 6eefd87..de6b148 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -84,8 +84,8 @@
<string name="deleteConfirmation" msgid="3727809366015979585">"ಈ ಸಂಪರ್ಕವನ್ನು ಅಳಿಸುವುದೇ?"</string>
<string name="deleteConfirmation_positive_button" msgid="1604511403421785160">"ಅಳಿಸಿ"</string>
<string name="invalidContactMessage" msgid="6204402264821083362">"ಸಂಪರ್ಕವು ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ."</string>
- <string name="createContactShortcutSuccessful_NoName" msgid="532242135930208299">"ಸಂಪರ್ಕವನ್ನು ಮುಖಪುಟ ಪರದೆಗೆ ಸೇರಿಸಲಾಗಿದೆ."</string>
- <string name="createContactShortcutSuccessful" msgid="6980032407920515698">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಮುಖಪುಟ ಪರದೆಗೆ ಸೇರಿಸಲಾಗಿದೆ."</string>
+ <string name="createContactShortcutSuccessful_NoName" msgid="532242135930208299">"ಸಂಪರ್ಕವನ್ನು ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಸೇರಿಸಲಾಗಿದೆ."</string>
+ <string name="createContactShortcutSuccessful" msgid="6980032407920515698">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಸೇರಿಸಲಾಗಿದೆ."</string>
<string name="photoPickerNotFoundText" msgid="6535222297923110991">"ಸಾಧನದಲ್ಲಿ ಯಾವುದೇ ಚಿತ್ರಗಳು ಲಭ್ಯವಿಲ್ಲ."</string>
<string name="attach_photo_dialog_title" msgid="7948754072673745235">"ಸಂಪರ್ಕ ಫೋಟೋ"</string>
<string name="customLabelPickerTitle" msgid="816694850254307154">"ಕಸ್ಟಮ್ ಲೇಬಲ್ ಹೆಸರು"</string>
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"ಅಧಿಸೂಚನೆಗಳು"</string>
<string name="yes_button" msgid="1120514817091581293">"ಹೌದು"</string>
<string name="no_button" msgid="8965841385742548947">"ಇಲ್ಲ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"ವಾಹಕ ಸೇವೆಗಳ ಸಂಖ್ಯೆಗಳು"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 5554707..0cc708f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"알림"</string>
<string name="yes_button" msgid="1120514817091581293">"예"</string>
<string name="no_button" msgid="8965841385742548947">"아니요"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"이동통신사 서비스 전화번호"</string>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 990f24e..bb9aacf 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Билдирмелер"</string>
<string name="yes_button" msgid="1120514817091581293">"Ооба"</string>
<string name="no_button" msgid="8965841385742548947">"Жок"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Оператордун кызмат номерлери"</string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 3af69d8..4e67e81 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"ການແຈ້ງເຕືອນ"</string>
<string name="yes_button" msgid="1120514817091581293">"ແມ່ນ"</string>
<string name="no_button" msgid="8965841385742548947">"ບໍ່"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"ໝາຍເລກບໍລິການຂອງຜູ້ໃຫ້ບໍລິການ"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index ab8972e..2913fbc 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Pranešimai"</string>
<string name="yes_button" msgid="1120514817091581293">"Taip"</string>
<string name="no_button" msgid="8965841385742548947">"Ne"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operatoriaus paslaugų numeriai"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index f7406b4..dcad525 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Paziņojumi"</string>
<string name="yes_button" msgid="1120514817091581293">"Jā"</string>
<string name="no_button" msgid="8965841385742548947">"Nē"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operatora dienesta tālruņa numuri"</string>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 1124e11..ee154db 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Известувања"</string>
<string name="yes_button" msgid="1120514817091581293">"Да"</string>
<string name="no_button" msgid="8965841385742548947">"Не"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Броеви за услуги на операторот"</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 02e4bc6..dff410a 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"അറിയിപ്പുകൾ"</string>
<string name="yes_button" msgid="1120514817091581293">"അതെ"</string>
<string name="no_button" msgid="8965841385742548947">"ഇല്ല"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Carrier Service നമ്പറുകൾ"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 6de8f8a..d8b5f47 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Мэдэгдэл"</string>
<string name="yes_button" msgid="1120514817091581293">"Тийм"</string>
<string name="no_button" msgid="8965841385742548947">"Үгүй"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Оператор компанийн үйлчилгээний дугаар"</string>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index ac65941..3f34d92 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"सूचना"</string>
<string name="yes_button" msgid="1120514817091581293">"होय"</string>
<string name="no_button" msgid="8965841385742548947">"नाही"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"वाहक सेवा नंबर"</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 4941c4c..6b01637 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Pemberitahuan"</string>
<string name="yes_button" msgid="1120514817091581293">"Ya"</string>
<string name="no_button" msgid="8965841385742548947">"Tidak"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Nombor perkhidmatan operator"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index b8dfd3a..cfee366 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"အကြောင်းကြားချက်များ"</string>
<string name="yes_button" msgid="1120514817091581293">"Yes"</string>
<string name="no_button" msgid="8965841385742548947">"No"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"မိုဘိုင်းဖုန်းကုမ္ပဏီနံပါတ်များ"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 017fbf6..6ea2fea 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Varsler"</string>
<string name="yes_button" msgid="1120514817091581293">"Ja"</string>
<string name="no_button" msgid="8965841385742548947">"Nei"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operatørtjenestenumre"</string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index ba033aa..caed805 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"सूचनाहरू"</string>
<string name="yes_button" msgid="1120514817091581293">"हुन्छ"</string>
<string name="no_button" msgid="8965841385742548947">"हुँदैन"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"मोबाइल सेवा प्रदायकका सर्भिस नम्बरहरू"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d19567a..c703deb 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Meldingen"</string>
<string name="yes_button" msgid="1120514817091581293">"Ja"</string>
<string name="no_button" msgid="8965841385742548947">"Nee"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Providerservicenummers"</string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 90da046..127af0b 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"ବିଜ୍ଞପ୍ତି"</string>
<string name="yes_button" msgid="1120514817091581293">"ହଁ"</string>
<string name="no_button" msgid="8965841385742548947">"ନାହିଁ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"କ୍ୟାରିଅର୍ ସେବା ନମ୍ବର"</string>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 790bec6..7a73e5e 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"ਸੂਚਨਾਵਾਂ"</string>
<string name="yes_button" msgid="1120514817091581293">"ਹਾਂ"</string>
<string name="no_button" msgid="8965841385742548947">"ਨਹੀਂ"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"ਕੈਰੀਅਰ ਸੇਵਾ ਨੰਬਰ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index b179715..92e3c11 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Powiadomienia"</string>
<string name="yes_button" msgid="1120514817091581293">"Tak"</string>
<string name="no_button" msgid="8965841385742548947">"Nie"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Numery obsługi klienta u operatora"</string>
</resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index a39207b..046d238 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificações"</string>
<string name="yes_button" msgid="1120514817091581293">"Sim"</string>
<string name="no_button" msgid="8965841385742548947">"Não"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Números de serviço da operadora"</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 2fb9814..5d52e4b 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificações"</string>
<string name="yes_button" msgid="1120514817091581293">"Sim"</string>
<string name="no_button" msgid="8965841385742548947">"Não"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Números de serviço do operador"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a39207b..046d238 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificações"</string>
<string name="yes_button" msgid="1120514817091581293">"Sim"</string>
<string name="no_button" msgid="8965841385742548947">"Não"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Números de serviço da operadora"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 3f29e11..5f80c46 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Notificări"</string>
<string name="yes_button" msgid="1120514817091581293">"Da"</string>
<string name="no_button" msgid="8965841385742548947">"Nu"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Numere pentru servicii ale operatorului"</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ccfdcd3..ddd7c72 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Уведомления"</string>
<string name="yes_button" msgid="1120514817091581293">"Да"</string>
<string name="no_button" msgid="8965841385742548947">"Нет"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Сервисные номера оператора"</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index af04fa2..c578fd4 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"දැනුම් දීම්"</string>
<string name="yes_button" msgid="1120514817091581293">"ඔව්"</string>
<string name="no_button" msgid="8965841385742548947">"නැත"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"වාහක සේවා අංක"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 8ec5369..be5af84 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Upozornenia"</string>
<string name="yes_button" msgid="1120514817091581293">"Áno"</string>
<string name="no_button" msgid="8965841385742548947">"Nie"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Služobné čísla operátorov"</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 1c5c3d3..399bce5 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Obvestila"</string>
<string name="yes_button" msgid="1120514817091581293">"Da"</string>
<string name="no_button" msgid="8965841385742548947">"Ne"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operaterjeve številke za storitve"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index c92cd37..989fca1 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -191,7 +191,7 @@
<string name="action_menu_add_new_contact_button" msgid="1201339383074001291">"Krijo një kontakt të ri"</string>
<string name="expanding_entry_card_view_see_more" msgid="6636033205952561590">"Shiko më shumë"</string>
<string name="expanding_entry_card_view_see_less" msgid="6399603072579278030">"Shiko më pak"</string>
- <string name="about_card_title" msgid="6635849009952435700">"Informacion rreth"</string>
+ <string name="about_card_title" msgid="6635849009952435700">"Informacione"</string>
<string name="toast_making_personal_copy" msgid="9053129410039312386">"Po krijon një kopje personale..."</string>
<string name="date_time_set" msgid="8526160894146496334">"Cakto"</string>
<string name="header_im_entry" msgid="3581797653862294826">"IM"</string>
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Njoftime"</string>
<string name="yes_button" msgid="1120514817091581293">"Po"</string>
<string name="no_button" msgid="8965841385742548947">"Jo"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Numrat e shërbimit të operatorit celular"</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index f1558ac..7b1e0c7 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Обавештења"</string>
<string name="yes_button" msgid="1120514817091581293">"Да"</string>
<string name="no_button" msgid="8965841385742548947">"Не"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Услужни бројеви мобилног оператера"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 057492c..9499a95 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Meddelanden"</string>
<string name="yes_button" msgid="1120514817091581293">"Ja"</string>
<string name="no_button" msgid="8965841385742548947">"Nej"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operatörens tjänstenummer"</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index ba2b71a..8e4a158 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Arifa"</string>
<string name="yes_button" msgid="1120514817091581293">"Ndiyo"</string>
<string name="no_button" msgid="8965841385742548947">"La"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Nambari za mtoa huduma"</string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index ae2829a..0f81b40 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"அறிவிப்புகள்"</string>
<string name="yes_button" msgid="1120514817091581293">"ஆம்"</string>
<string name="no_button" msgid="8965841385742548947">"இல்லை"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"மொபைல் நிறுவனத்தின் சேவை எண்கள்"</string>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index a65218d..057f809 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"నోటిఫికేషన్లు"</string>
<string name="yes_button" msgid="1120514817091581293">"అవును"</string>
<string name="no_button" msgid="8965841385742548947">"కాదు"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"క్యారియర్ సర్వీస్ నంబర్లు"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 4b6dbfa..455831d 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"การแจ้งเตือน"</string>
<string name="yes_button" msgid="1120514817091581293">"ใช่"</string>
<string name="no_button" msgid="8965841385742548947">"ไม่"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"หมายเลขบริการของผู้ให้บริการ"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index d2e4531..9b67c94 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Mga Notification"</string>
<string name="yes_button" msgid="1120514817091581293">"Oo"</string>
<string name="no_button" msgid="8965841385742548947">"Hindi"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Mga numero ng serbisyo ng carrier"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 3f74c89..98a87be 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Bildirimler"</string>
<string name="yes_button" msgid="1120514817091581293">"Evet"</string>
<string name="no_button" msgid="8965841385742548947">"Hayır"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operatör hizmet numaraları"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 43a099a..38aa8b7 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Сповіщення"</string>
<string name="yes_button" msgid="1120514817091581293">"Так"</string>
<string name="no_button" msgid="8965841385742548947">"Ні"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Сервісні номери оператора"</string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 3ba641b..3262dc4 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"اطلاعات"</string>
<string name="yes_button" msgid="1120514817091581293">"ہاں"</string>
<string name="no_button" msgid="8965841385742548947">"نہیں"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"کیرئیر سروس نمبرز"</string>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 4cfcc20..9ebea94 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Bildirishnomalar"</string>
<string name="yes_button" msgid="1120514817091581293">"Ha"</string>
<string name="no_button" msgid="8965841385742548947">"Yo‘q"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Operator xizmat raqamlari"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 7c1c724..3ffa0d8 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Thông báo"</string>
<string name="yes_button" msgid="1120514817091581293">"Có"</string>
<string name="no_button" msgid="8965841385742548947">"Không"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Số dịch vụ của nhà mạng"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 55c18be..cd687b9 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"通知"</string>
<string name="yes_button" msgid="1120514817091581293">"是"</string>
<string name="no_button" msgid="8965841385742548947">"否"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"运营商服务号码"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index b0d1a20..bdb619c 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"通知"</string>
<string name="yes_button" msgid="1120514817091581293">"是"</string>
<string name="no_button" msgid="8965841385742548947">"否"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"流動網絡供應商服務電話號碼"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 80b8941..7ce4c85 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"通知"</string>
<string name="yes_button" msgid="1120514817091581293">"是"</string>
<string name="no_button" msgid="8965841385742548947">"否"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"電信業者服務電話號碼"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index e578e4b..fa5d2ed 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -492,4 +492,5 @@
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"Izaziso"</string>
<string name="yes_button" msgid="1120514817091581293">"Yebo"</string>
<string name="no_button" msgid="8965841385742548947">"Cha"</string>
+ <string name="sdn_contacts_directory_search_label" msgid="9146122809408008443">"Izinombolo zesevisi zenkampani yenethiwekhi"</string>
</resources>
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index 2dd0e73..c4c0152 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -28,6 +28,10 @@
<!-- File Authority for AOSP Contacts files -->
<string name="contacts_file_provider_authority">com.android.contacts.files</string>
+
+ <!-- SDN Authority for carrier SDN -->
+ <string name="contacts_sdn_provider_authority">com.android.contacts.sdn</string>
+
<!-- Flag indicating whether Contacts app is allowed to import contacts -->
<bool name="config_allow_import_from_vcf_file">true</bool>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d87be0b..b608e12 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1549,4 +1549,7 @@
<!-- Text of Negative Button in dialog -->
<string name="no_button">No</string>
+ <!-- The label to display as a section header in the contact list for an SDN directory [CHAR LIMIT=40] -->
+ <string name="sdn_contacts_directory_search_label">Carrier service numbers</string>
+
</resources>
\ No newline at end of file
diff --git a/src/com/android/contacts/activities/RequestPermissionsActivity.java b/src/com/android/contacts/activities/RequestPermissionsActivity.java
index ebcd9b3..7994e98 100644
--- a/src/com/android/contacts/activities/RequestPermissionsActivity.java
+++ b/src/com/android/contacts/activities/RequestPermissionsActivity.java
@@ -70,6 +70,7 @@
permissions.add(permission.CALL_PHONE);
permissions.add(permission.READ_PHONE_NUMBERS);
permissions.add(permission.READ_PHONE_STATE);
+ permissions.add(permission.READ_CALL_LOG);
}
sRequiredPermissions = permissions.toArray(new String[0]);
}
diff --git a/src/com/android/contacts/sdn/SdnProvider.kt b/src/com/android/contacts/sdn/SdnProvider.kt
new file mode 100644
index 0000000..4dd3578
--- /dev/null
+++ b/src/com/android/contacts/sdn/SdnProvider.kt
@@ -0,0 +1,296 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.sdn
+
+import android.content.ContentProvider
+import android.content.ContentValues
+import android.content.Context.TELECOM_SERVICE
+import android.content.UriMatcher
+import android.database.Cursor
+import android.database.MatrixCursor
+import android.net.Uri
+import android.provider.ContactsContract
+import android.provider.ContactsContract.CommonDataKinds.Phone
+import android.provider.ContactsContract.CommonDataKinds.StructuredName
+import android.provider.ContactsContract.Contacts
+import android.provider.ContactsContract.Data
+import android.provider.ContactsContract.Directory
+import android.provider.ContactsContract.RawContacts
+import android.telecom.TelecomManager
+import android.util.Log
+import com.android.contacts.R
+
+/** Provides a way to show SDN data in search suggestions and caller id lookup. */
+class SdnProvider : ContentProvider() {
+
+ private lateinit var sdnRepository: SdnRepository
+ private lateinit var uriMatcher: UriMatcher
+
+ override fun onCreate(): Boolean {
+ Log.i(TAG, "onCreate")
+ val sdnProviderAuthority = requireContext().getString(R.string.contacts_sdn_provider_authority)
+
+ uriMatcher =
+ UriMatcher(UriMatcher.NO_MATCH).apply {
+ addURI(sdnProviderAuthority, "directories", DIRECTORIES)
+ addURI(sdnProviderAuthority, "contacts/filter/*", FILTER)
+ addURI(sdnProviderAuthority, "data/phones/filter/*", FILTER)
+ addURI(sdnProviderAuthority, "contacts/lookup/*/entities", CONTACT_LOOKUP)
+ addURI(
+ sdnProviderAuthority,
+ "contacts/lookup/*/#/entities",
+ CONTACT_LOOKUP_WITH_CONTACT_ID,
+ )
+ addURI(sdnProviderAuthority, "phone_lookup/*", PHONE_LOOKUP)
+ }
+ sdnRepository = SdnRepository(requireContext())
+ return true
+ }
+
+ override fun query(
+ uri: Uri,
+ projection: Array<out String>?,
+ selection: String?,
+ selectionArgs: Array<out String>?,
+ sortOrder: String?,
+ ): Cursor? {
+ if (projection == null) return null
+
+ val match = uriMatcher.match(uri)
+
+ if (match == DIRECTORIES) {
+ return handleDirectories(projection)
+ }
+
+ if (
+ !isCallerAllowed(uri.getQueryParameter(Directory.CALLER_PACKAGE_PARAM_KEY)) ||
+ !sdnRepository.isSdnPresent()
+ ) {
+ return null
+ }
+
+ val accountName = uri.getQueryParameter(RawContacts.ACCOUNT_NAME)
+ val accountType = uri.getQueryParameter(RawContacts.ACCOUNT_TYPE)
+ if (ACCOUNT_NAME != accountName || ACCOUNT_TYPE != accountType) {
+ Log.e(TAG, "Received an invalid account")
+ return null
+ }
+
+ return when (match) {
+ FILTER -> handleFilter(projection, uri)
+ CONTACT_LOOKUP -> handleLookup(projection, uri.pathSegments[2])
+ CONTACT_LOOKUP_WITH_CONTACT_ID ->
+ handleLookup(projection, uri.pathSegments[2], uri.pathSegments[3])
+ PHONE_LOOKUP -> handlePhoneLookup(projection, uri.pathSegments[1])
+ else -> null
+ }
+ }
+
+ override fun getType(uri: Uri) = Contacts.CONTENT_ITEM_TYPE
+
+ override fun insert(uri: Uri, values: ContentValues?): Uri? {
+ throw UnsupportedOperationException("Insert is not supported.")
+ }
+
+ override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
+ throw UnsupportedOperationException("Delete is not supported.")
+ }
+
+ override fun update(
+ uri: Uri,
+ values: ContentValues?,
+ selection: String?,
+ selectionArgs: Array<out String>?,
+ ): Int {
+ throw UnsupportedOperationException("Update is not supported.")
+ }
+
+ private fun handleDirectories(projection: Array<out String>): Cursor {
+ // logger.atInfo().log("Creating directory cursor")
+
+ return MatrixCursor(projection).apply {
+ addRow(
+ projection.map { column ->
+ when (column) {
+ Directory.ACCOUNT_NAME -> ACCOUNT_NAME
+ Directory.ACCOUNT_TYPE -> ACCOUNT_TYPE
+ Directory.DISPLAY_NAME -> ACCOUNT_NAME
+ Directory.TYPE_RESOURCE_ID -> R.string.sdn_contacts_directory_search_label
+ Directory.EXPORT_SUPPORT -> Directory.EXPORT_SUPPORT_NONE
+ Directory.SHORTCUT_SUPPORT -> Directory.SHORTCUT_SUPPORT_NONE
+ Directory.PHOTO_SUPPORT -> Directory.PHOTO_SUPPORT_THUMBNAIL_ONLY
+ else -> null
+ }
+ },
+ )
+ }
+ }
+
+ private fun handleFilter(projection: Array<out String>, uri: Uri): Cursor? {
+ val filter = uri.lastPathSegment ?: return null
+ val cursor = MatrixCursor(projection)
+
+ val results =
+ sdnRepository.fetchSdn().filter {
+ it.serviceName.contains(filter, ignoreCase = true) || it.serviceNumber.contains(filter)
+ }
+
+ if (results.isEmpty()) return cursor
+
+ val maxResult = getQueryLimit(uri)
+
+ results.take(maxResult).forEachIndexed { index, data ->
+ cursor.addRow(
+ projection.map { column ->
+ when (column) {
+ Contacts._ID -> index
+ Contacts.DISPLAY_NAME -> data.serviceName
+ Data.DATA1 -> data.serviceNumber
+ Contacts.LOOKUP_KEY -> data.lookupKey()
+ else -> null
+ }
+ },
+ )
+ }
+
+ return cursor
+ }
+
+ private fun handleLookup(
+ projection: Array<out String>,
+ lookupKey: String?,
+ contactIdFromUri: String? = "1",
+ ): Cursor? {
+ if (lookupKey.isNullOrEmpty()) {
+ Log.i(TAG, "handleLookup did not receive a lookup key")
+ return null
+ }
+
+ val cursor = MatrixCursor(projection)
+ val contactId =
+ try {
+ contactIdFromUri?.toLong() ?: 1L
+ } catch (_: NumberFormatException) {
+ 1L
+ }
+
+ val result = sdnRepository.fetchSdn().find { it.lookupKey() == lookupKey } ?: return cursor
+
+ // Adding first row for name
+ cursor.addRow(
+ projection.map { column ->
+ when (column) {
+ Contacts.Entity.CONTACT_ID -> contactId
+ Contacts.Entity.RAW_CONTACT_ID -> contactId
+ Contacts.Entity.DATA_ID -> 1
+ Data.MIMETYPE -> StructuredName.CONTENT_ITEM_TYPE
+ StructuredName.DISPLAY_NAME -> result.serviceName
+ StructuredName.GIVEN_NAME -> result.serviceName
+ Contacts.DISPLAY_NAME -> result.serviceName
+ Contacts.DISPLAY_NAME_ALTERNATIVE -> result.serviceName
+ RawContacts.ACCOUNT_NAME -> ACCOUNT_NAME
+ RawContacts.ACCOUNT_TYPE -> ACCOUNT_TYPE
+ RawContacts.RAW_CONTACT_IS_READ_ONLY -> 1
+ Contacts.LOOKUP_KEY -> result.lookupKey()
+ else -> null
+ }
+ }
+ )
+
+ // Adding second row for number
+ cursor.addRow(
+ projection.map { column ->
+ when (column) {
+ Contacts.Entity.CONTACT_ID -> contactId
+ Contacts.Entity.RAW_CONTACT_ID -> contactId
+ Contacts.Entity.DATA_ID -> 2
+ Data.MIMETYPE -> Phone.CONTENT_ITEM_TYPE
+ Phone.NUMBER -> result.serviceNumber
+ Data.IS_PRIMARY -> 1
+ Phone.TYPE -> Phone.TYPE_MAIN
+ else -> null
+ }
+ }
+ )
+
+ return cursor
+ }
+
+ private fun handlePhoneLookup(
+ projection: Array<out String>,
+ phoneNumber: String?,
+ ): Cursor? {
+ if (phoneNumber.isNullOrEmpty()) {
+ Log.i(TAG, "handlePhoneLookup did not receive a phoneNumber")
+ return null
+ }
+
+ val cursor = MatrixCursor(projection)
+
+ val result = sdnRepository.fetchSdn().find { it.serviceNumber == phoneNumber } ?: return cursor
+
+ cursor.addRow(
+ projection.map { column ->
+ when (column) {
+ Contacts.DISPLAY_NAME -> result.serviceName
+ Phone.NUMBER -> result.serviceNumber
+ else -> null
+ }
+ },
+ )
+
+ return cursor
+ }
+
+ private fun isCallerAllowed(callingPackage: String?): Boolean {
+ if (callingPackage.isNullOrEmpty()) {
+ Log.i(TAG, "Calling package is null or empty.")
+ return false
+ }
+
+ if (callingPackage == requireContext().packageName) {
+ return true
+ }
+
+ // Check if the calling package is default dialer app or not
+ val context = context ?: return false
+ val tm = context.getSystemService(TELECOM_SERVICE) as TelecomManager
+ return tm.defaultDialerPackage == callingPackage
+ }
+
+ private fun getQueryLimit(uri: Uri): Int {
+ return try {
+ uri.getQueryParameter(ContactsContract.LIMIT_PARAM_KEY)?.toInt() ?: DEFAULT_MAX_RESULTS
+ } catch (e: NumberFormatException) {
+ DEFAULT_MAX_RESULTS
+ }
+ }
+
+ companion object {
+ private val TAG = SdnProvider::class.java.simpleName
+
+ private const val DIRECTORIES = 0
+ private const val FILTER = 1
+ private const val CONTACT_LOOKUP = 2
+ private const val CONTACT_LOOKUP_WITH_CONTACT_ID = 3
+ private const val PHONE_LOOKUP = 4
+
+ private const val ACCOUNT_NAME = "Carrier service numbers"
+ private const val ACCOUNT_TYPE = "com.android.contacts.sdn"
+
+ private const val DEFAULT_MAX_RESULTS = 20
+ }
+}
diff --git a/src/com/android/contacts/sdn/SdnRepository.kt b/src/com/android/contacts/sdn/SdnRepository.kt
new file mode 100644
index 0000000..0759127
--- /dev/null
+++ b/src/com/android/contacts/sdn/SdnRepository.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.sdn
+
+import android.Manifest.permission
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.pm.PackageManager
+import android.telephony.CarrierConfigManager
+import android.telephony.SubscriptionManager
+import android.util.Log
+import com.android.contacts.model.SimCard
+import com.android.contacts.util.PermissionsUtil
+import com.android.contacts.util.PhoneNumberHelper
+
+/** Repository to fetch Sdn data from [CarrierConfigManager]. */
+class SdnRepository constructor(private val context: Context) {
+
+ fun isSdnPresent(): Boolean {
+ if (
+ !hasTelephony() ||
+ !PermissionsUtil.hasPermission(context, permission.READ_PHONE_STATE) ||
+ !PermissionsUtil.hasPermission(context, permission.READ_PHONE_NUMBERS) ||
+ !PermissionsUtil.hasPermission(context, permission.READ_CALL_LOG)
+ ) {
+ return false
+ }
+
+ val simCardList = getSimCardInformation()
+
+ for (simCard in simCardList) {
+ if (fetchSdnFromCarrierConfig(simCard).isNotEmpty()) {
+ Log.i(TAG, "Found SDN list from CarrierConfig")
+ return true
+ }
+ }
+ return false
+ }
+
+ fun fetchSdn(): List<Sdn> {
+ val simCardList = getSimCardInformation()
+
+ return simCardList
+ .flatMap { fetchSdnFromCarrierConfig(it) }
+ .distinct()
+ .sortedBy { it.serviceName }
+ }
+
+ // Permission check isn't recognized by the linter.
+ @SuppressLint("MissingPermission")
+ fun getSimCardInformation(): List<SimCard> {
+ val subscriptionManager = context.getSystemService(SubscriptionManager::class.java)
+ return subscriptionManager?.activeSubscriptionInfoList?.filterNotNull()?.mapNotNull {
+ if (it.subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+ null
+ } else {
+ SimCard.create(it)
+ }
+ }
+ ?: emptyList()
+ }
+
+ @Suppress("Deprecation", "MissingPermission")
+ private fun fetchSdnFromCarrierConfig(simCard: SimCard): List<Sdn> {
+ val carrierConfigManager = context.getSystemService(CarrierConfigManager::class.java)
+ val carrierConfig =
+ carrierConfigManager?.getConfigForSubId(simCard.subscriptionId) ?: return emptyList()
+ val nameList: List<String> =
+ carrierConfig
+ .getStringArray(CarrierConfigManager.KEY_CARRIER_SERVICE_NAME_STRING_ARRAY)
+ ?.map { it?.trim() ?: "" }
+ ?: return emptyList()
+ val numberList: List<String> =
+ carrierConfig
+ .getStringArray(CarrierConfigManager.KEY_CARRIER_SERVICE_NUMBER_STRING_ARRAY)
+ ?.map { it?.trim() ?: "" }
+ ?: return emptyList()
+ if (nameList.isEmpty() || nameList.size != numberList.size) return emptyList()
+
+ val sdnList = mutableListOf<Sdn>()
+ nameList.zip(numberList).forEach { (sdnServiceName, sdnNumber) ->
+ if (sdnServiceName.isNotBlank() && PhoneNumberHelper.isDialablePhoneNumber(sdnNumber)) {
+ sdnList.add(Sdn(sdnServiceName, sdnNumber))
+ }
+ }
+ return sdnList
+ }
+
+ private fun hasTelephony(): Boolean {
+ return context.packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+ }
+
+ companion object {
+ private val TAG = SdnRepository::class.java.simpleName
+ }
+}
+
+/** Hold the Service dialing number information to be displayed in SdnActivity. */
+data class Sdn(
+ val serviceName: String,
+ val serviceNumber: String,
+) {
+
+ /** Generate lookup key that will help identify SDN when Opening QuickContact. */
+ fun lookupKey(): String {
+ return "non-sim-sdn-" + hashCode()
+ }
+}
diff --git a/src/com/android/contacts/util/PhoneNumberHelper.java b/src/com/android/contacts/util/PhoneNumberHelper.java
index eb070b2..2f1a5b0 100644
--- a/src/com/android/contacts/util/PhoneNumberHelper.java
+++ b/src/com/android/contacts/util/PhoneNumberHelper.java
@@ -16,6 +16,7 @@
package com.android.contacts.util;
import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
import android.util.Log;
/**
@@ -95,4 +96,24 @@
}
return number.substring(0, delimiterIndex);
}
+
+ /** Returns true if the given string is dialable by the user from Phone/Dialer app. */
+ public static boolean isDialablePhoneNumber(String str) {
+ if (TextUtils.isEmpty(str)) {
+ return false;
+ }
+
+ for (int i = 0, count = str.length(); i < count; i++) {
+ if (!(PhoneNumberUtils.isDialable(str.charAt(i))
+ || str.charAt(i) == ' '
+ || str.charAt(i) == '-'
+ || str.charAt(i) == '('
+ || str.charAt(i) == ')'
+ || str.charAt(i) == '.'
+ || str.charAt(i) == '/')) {
+ return false;
+ }
+ }
+ return true;
+ }
}
diff --git a/src/com/android/contacts/vcard/ExportProcessor.java b/src/com/android/contacts/vcard/ExportProcessor.java
index 0b96ea1..fd5134c 100755
--- a/src/com/android/contacts/vcard/ExportProcessor.java
+++ b/src/com/android/contacts/vcard/ExportProcessor.java
@@ -81,6 +81,12 @@
mExportRequest = exportRequest;
mJobId = jobId;
mCallingActivity = callingActivity;
+ try {
+ mResolver.takePersistableUriPermission(exportRequest.destUri,
+ Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+ } catch (SecurityException e) {
+ Log.w(LOG_TAG, "SecurityException error", e);
+ }
}
@Override
diff --git a/src/com/android/contacts/vcard/NotificationImportExportListener.java b/src/com/android/contacts/vcard/NotificationImportExportListener.java
index 3b4dc5e..cc60668 100755
--- a/src/com/android/contacts/vcard/NotificationImportExportListener.java
+++ b/src/com/android/contacts/vcard/NotificationImportExportListener.java
@@ -112,6 +112,7 @@
final String description = mContext.getString(R.string.importing_vcard_description,
entry.getDisplayName());
+ ContactsNotificationChannelsUtil.createDefaultChannel(mContext);
return constructProgressNotification(mContext.getApplicationContext(),
VCardService.TYPE_IMPORT, description, tickerText, jobId, request.displayName,
totalCount, currentCount);
diff --git a/tests/Android.bp b/tests/Android.bp
index 647fee7..2912673 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -29,7 +29,7 @@
"androidx.test.ext.junit",
"hamcrest-library",
"mockito-target-minus-junit4",
- "ub-uiautomator",
+ "androidx.test.uiautomator_uiautomator",
],
libs: [
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index f22f92c..9ccfa3f 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -20,6 +20,7 @@
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
+ <uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
diff --git a/tests/src/com/android/contacts/NoPermissionsLaunchSmokeTest.java b/tests/src/com/android/contacts/NoPermissionsLaunchSmokeTest.java
index fac9c85..59f8147 100644
--- a/tests/src/com/android/contacts/NoPermissionsLaunchSmokeTest.java
+++ b/tests/src/com/android/contacts/NoPermissionsLaunchSmokeTest.java
@@ -8,15 +8,15 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.support.test.uiautomator.By;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.UiObject2;
-import android.support.test.uiautomator.Until;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
import androidx.test.filters.Suppress;
import androidx.test.runner.AndroidJUnit4;
+import androidx.test.uiautomator.By;
+import androidx.test.uiautomator.UiDevice;
+import androidx.test.uiautomator.UiObject2;
+import androidx.test.uiautomator.Until;
import org.junit.Before;
import org.junit.Test;
@@ -54,6 +54,7 @@
assumeTrue(!hasPermission(mTargetContext, Manifest.permission.GET_ACCOUNTS));
assumeTrue(!hasPermission(mTargetContext, Manifest.permission.READ_PHONE_STATE));
assumeTrue(!hasPermission(mTargetContext, Manifest.permission.CALL_PHONE));
+ assumeTrue(!hasPermission(mTargetContext, Manifest.permission.READ_CALL_LOG));
// remove state that might exist outside of the app
// (e.g. launcher shortcuts and scheduled jobs)
@@ -72,14 +73,20 @@
device.waitForIdle();
- device.wait(Until.hasObject(By.textStartsWith("Allow Contacts")), TIMEOUT);
+ final PackageManager packageManager = mTargetContext.getPackageManager();
+ if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+ device.wait(Until.hasObject(By.textEndsWith("your phone call logs?")), TIMEOUT);
+ final UiObject2 grantCallLogPermissionButton = device.findObject(By.text("ALLOW"));
+ grantCallLogPermissionButton.click();
+ }
+
+ device.wait(Until.hasObject(By.textEndsWith("access your contacts?")), TIMEOUT);
final UiObject2 grantContactsPermissionButton = device.findObject(By.text("ALLOW"));
grantContactsPermissionButton.click();
device.wait(Until.hasObject(By.textEndsWith("make and manage phone calls?")), TIMEOUT);
- final PackageManager packageManager = mTargetContext.getPackageManager();
if (!packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
device.waitForIdle();
return;
diff --git a/tests/src/com/android/contacts/activities/SimImportActivityTest.java b/tests/src/com/android/contacts/activities/SimImportActivityTest.java
index 250ce4b..9e2f73b 100644
--- a/tests/src/com/android/contacts/activities/SimImportActivityTest.java
+++ b/tests/src/com/android/contacts/activities/SimImportActivityTest.java
@@ -42,9 +42,6 @@
import android.provider.ContactsContract.Data;
import android.provider.SimPhonebookContract;
import android.provider.SimPhonebookContract.SimRecords;
-import android.support.test.uiautomator.By;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.Until;
import android.telephony.TelephonyManager;
import android.test.mock.MockContentResolver;
@@ -53,6 +50,9 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.filters.SdkSuppress;
+import androidx.test.uiautomator.By;
+import androidx.test.uiautomator.UiDevice;
+import androidx.test.uiautomator.Until;
import com.android.contacts.SimImportService;
import com.android.contacts.database.SimContactDao;