Merge tag 'android-14.0.0_r29' into staging/lineage-21.0_merge-android-14.0.0_r29
Android 14.0.0 release 29
# -----BEGIN PGP SIGNATURE-----
#
# iF0EABECAB0WIQRDQNE1cO+UXoOBCWTorT+BmrEOeAUCZeZW3gAKCRDorT+BmrEO
# eCqGAJ0dVqMkwXg9k4eYPe80AN3BJ8uUMACfWLntRRwDjUx3oeKKaOAFGUAy984=
# =un2h
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue Mar 5 01:18:54 2024 EET
# gpg: using DSA key 4340D13570EF945E83810964E8AD3F819AB10E78
# gpg: Good signature from "The Android Open Source Project <initial-contribution@android.com>" [marginal]
# gpg: initial-contribution@android.com: Verified 2352 signatures in the past
# 2 years. Encrypted 4 messages in the past 2 years.
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg: It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 4340 D135 70EF 945E 8381 0964 E8AD 3F81 9AB1 0E78
# By Bill Yi (55) and others
# Via Automerger Merge Worker (1040) and others
* tag 'android-14.0.0_r29': (69 commits)
Fix Kotlin safety build error
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Import translations. DO NOT MERGE ANYWHERE
Grant Permanent Write Uri Permission
...
Change-Id: Ie8b4543f0e21c88dbda8f72e7d5c22b68af66aee
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;