[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: f488031055 -s ours am: 2ec75b4753 -s ours am: ba7225de5b -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Contacts/+/24918697
Change-Id: I209f9040ada7482e0565afb70cc8f7b1e84f7b47
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
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 0bd96cd..66d5767 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"
@@ -630,6 +633,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-am/strings.xml b/res/values-am/strings.xml
index 03a8fab..d570a49 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/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>
@@ -120,7 +120,7 @@
<string name="listFoundAllContactsZero" msgid="1933842282916988563">"እውቅያዎች የሉም"</string>
<string name="add_contact_dlg_message_fmt" msgid="7498024710169591375">"<xliff:g id="EMAIL">%s</xliff:g> ወደ እውቅያዎች ዝርዝር ይታከል"</string>
<string name="search_settings_description" msgid="5630675648560839920">"የዕውቂያዎችዎ ስሞች"</string>
- <string name="quickcontact_transparent_view_description" msgid="7783027850792852265">"ወደ ቀዳሚው ማያ ገፅ ለመመለስ ጠቅ ያድርጉ"</string>
+ <string name="quickcontact_transparent_view_description" msgid="7783027850792852265">"ወደ ቀዳሚው ማያ ገጽ ለመመለስ ጠቅ ያድርጉ"</string>
<string name="quickcontact_add_phone_number" msgid="1683577288080727862">"የስልክ ቁጥር ያክሉ"</string>
<string name="quickcontact_add_email" msgid="1442894568471116797">"ኢሜይል ያክሉ"</string>
<string name="missing_app" msgid="5674389915738964148">"ይህን እርምጃ የሚያከናውን ምንም መተግበሪያ አልተገኘም።"</string>
@@ -364,7 +364,7 @@
<string name="display_more_groups" msgid="8398232980355188133">"ተጨማሪቡድኖች..."</string>
<string name="display_warn_remove_ungrouped" msgid="522866344738506017">"\'<xliff:g id="GROUP">%s</xliff:g>\' ከአሳምር ማስወገድ እንዲሁ ማንኛውም በተነጣጥል ያሉ ዕውቅያዎችን ከአሳምር ያስወግዳል።"</string>
<string name="savingDisplayGroups" msgid="6779839417901711381">"ማሳያ አማራጮችን በማስቀመጥ ላይ..."</string>
- <string name="listCustomView" msgid="5782275477737032610">"ብጁ ዕይታ"</string>
+ <string name="listCustomView" msgid="5782275477737032610">"ብጁ እይታ"</string>
<string name="dialog_new_contact_account" msgid="5652018124788855057">"እንዲመጡ የተደረጉ እውቂያዎችን አስቀምጥ ወደ፦"</string>
<string name="import_from_sim" msgid="7825280799813847991">"ሲም ካርድ"</string>
<string name="import_from_sim_summary_fmt" msgid="4234771828377985321">"ሲም <xliff:g id="SIM_NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 18c1684..3a77900 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -91,8 +91,8 @@
<string name="customLabelPickerTitle" msgid="816694850254307154">"উপযোগিতা অনুসৰি লেবেলৰ নাম"</string>
<string name="removePhoto" msgid="1190099414600730001">"ফট\' আঁতৰাওক"</string>
<string name="noContacts" msgid="3030512741779213810">"আপোনাৰ সম্পৰ্কসূচী খালী আছে"</string>
- <string name="emptyGroup" msgid="8598261660865081152">"এই লেবেলত কোনো সম্পৰ্ক ব্যক্তি নাই"</string>
- <string name="emptyAccount" msgid="7450843210977018582">"এই একাউণ্টত কোনো সম্পৰ্ক ব্যক্তি নাই"</string>
+ <string name="emptyGroup" msgid="8598261660865081152">"এই লেবেলত কোনো সম্পৰ্ক ব্য়ক্তি নাই"</string>
+ <string name="emptyAccount" msgid="7450843210977018582">"এই একাউণ্টত কোনো সম্পৰ্ক ব্য়ক্তি নাই"</string>
<string name="emptyMainList" msgid="3266182207039677163">"আপোনাৰ সম্পৰ্কসূচী খালী আছে"</string>
<string name="contactSavedNamedToast" msgid="3067050290584834386">"<xliff:g id="DISPLAY_NAME">%s</xliff:g> ছেভ কৰা হ’ল"</string>
<string name="contactSavedToast" msgid="4370392215196995301">"সম্পৰ্ক ছেভ কৰা হ’ল"</string>
@@ -192,7 +192,7 @@
<string name="expanding_entry_card_view_see_more" msgid="6636033205952561590">"অধিক চাওক"</string>
<string name="expanding_entry_card_view_see_less" msgid="6399603072579278030">"কম চাওক"</string>
<string name="about_card_title" msgid="6635849009952435700">"ইয়াৰ বিষয়ে"</string>
- <string name="toast_making_personal_copy" msgid="9053129410039312386">"ব্যক্তিগত প্ৰতিলিপ সৃষ্টি কৰিথকা হৈছে…"</string>
+ <string name="toast_making_personal_copy" msgid="9053129410039312386">"ব্য়ক্তিগত প্ৰতিলিপ সৃষ্টি কৰিথকা হৈছে…"</string>
<string name="date_time_set" msgid="8526160894146496334">"ছেট কৰক"</string>
<string name="header_im_entry" msgid="3581797653862294826">"IM"</string>
<string name="header_organization_entry" msgid="7428066442988227441">"সংস্থা"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index a976a43..dfdefba 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -475,7 +475,7 @@
<string name="sim_import_success_toast_fmt" msgid="7645974841482481503">"{count,plural, =1{Uvezen je # kontakt sa SIM-a}one{Uvezen je # kontakt sa SIM-a}few{Uvezena su # kontakta sa SIM-a}other{Uvezeno je # kontakata sa SIM-a}}"</string>
<string name="sim_import_failed_toast" msgid="358117391138073786">"Uvoz kontakata sa SIM kartice nije uspeo"</string>
<string name="sim_import_title" msgid="8202961146093040684">"Uvezite sa SIM-a"</string>
- <string name="sim_import_cancel_content_description" msgid="4746065462808862682">"Otkaži"</string>
+ <string name="sim_import_cancel_content_description" msgid="4746065462808862682">"Otkažite"</string>
<string name="auto_sync_off" msgid="7039314601316227882">"Automatska sinhronizacija je isključena. Dodirnite da biste je uključili."</string>
<string name="dismiss_sync_alert" msgid="4057176963960104786">"Odbacite"</string>
<string name="account_sync_off" msgid="6187683798342006021">"Sinhronizacija naloga je isključena. Dodirnite da biste je uključili."</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index bc1826c..0dc36e0 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -75,7 +75,7 @@
<string name="menu_unredirect_calls_to_vm" msgid="2294919685954790892">"Κατάργηση δρομ. σε τηλεφωνητή"</string>
<string name="readOnlyContactWarning" msgid="4158660823025751201">"Αυτή η επαφή είναι μόνο για ανάγνωση. Δεν μπορεί να διαγραφεί, αλλά μπορείτε να την αποκρύψετε."</string>
<string name="readOnlyContactWarning_positive_button" msgid="2602676689104338036">"Απόκρυψη επαφής"</string>
- <string name="readOnlyContactDeleteConfirmation" msgid="2759786078454970110">"Οι λογαριασμοί μόνο για ανάγνωση σε αυτή την επαφή θα είναι κρυφοί, δεν θα διαγραφούν."</string>
+ <string name="readOnlyContactDeleteConfirmation" msgid="2759786078454970110">"Οι λογαριασμοί μόνο για ανάγνωση σε αυτήν την επαφή θα είναι κρυφοί, δεν θα διαγραφούν."</string>
<string name="single_delete_confirmation" msgid="8260949300855537648">"Να διαγραφεί αυτή η επαφή;"</string>
<string name="batch_delete_confirmation" msgid="4149615167210863403">"Να διαγραφούν οι επιλεγμένες επαφές;"</string>
<string name="batch_delete_read_only_contact_confirmation" msgid="381691735715182700">"Δεν είναι δυνατή η διαγραφή επαφών από λογαριασμούς που προορίζονται μόνο για ανάγνωση, αλλά είναι δυνατή η απόκρυψή τους."</string>
@@ -91,7 +91,7 @@
<string name="customLabelPickerTitle" msgid="816694850254307154">"Προσαρμοσμένο όνομα ετικέτας"</string>
<string name="removePhoto" msgid="1190099414600730001">"Κατάργηση εικόνας"</string>
<string name="noContacts" msgid="3030512741779213810">"Η λίστα επαφών σας είναι άδεια"</string>
- <string name="emptyGroup" msgid="8598261660865081152">"Δεν υπάρχουν επαφές με αυτή την εκτικέτα"</string>
+ <string name="emptyGroup" msgid="8598261660865081152">"Δεν υπάρχουν επαφές με αυτήν την εκτικέτα"</string>
<string name="emptyAccount" msgid="7450843210977018582">"Δεν υπάρχουν επαφές σε αυτόν το λογαριασμό"</string>
<string name="emptyMainList" msgid="3266182207039677163">"Η λίστα επαφών σας είναι άδεια"</string>
<string name="contactSavedNamedToast" msgid="3067050290584834386">"Η επαφή \"<xliff:g id="DISPLAY_NAME">%s</xliff:g>\" αποθηκεύτηκε"</string>
@@ -331,7 +331,7 @@
<string name="postal_region" msgid="6130239447563491435">"Πολιτεία"</string>
<string name="postal_postcode" msgid="33077708757232659">"Ταχυδρομικός κώδικας"</string>
<string name="postal_country" msgid="6642804283917549861">"Χώρα"</string>
- <string name="map_home" msgid="2169053372466501148">"Προβολή διεύθυνσης σπιτιού"</string>
+ <string name="map_home" msgid="2169053372466501148">"Προβολή διεύθυνσης οικίας"</string>
<string name="map_work" msgid="8296916987749726461">"Προβολή διεύθυνσης εργασίας"</string>
<string name="map_other" msgid="4009931029322619674">"Προβολή διεύθυνσης"</string>
<string name="map_custom" msgid="7797812861927817335">"Προβολή διεύθυνσης <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 6557812..a613a85 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -482,7 +482,7 @@
<string name="turn_auto_sync_on_dialog_title" msgid="3812155064863594938">"Želite li uključiti automatsku sinkronizaciju?"</string>
<string name="turn_auto_sync_on_dialog_body" msgid="5386810641905184682">"Izmjene koje unesete u aplikacije i na račune, ne samo na Google kontakte ažurirat će se na webu i vašim uređajima."</string>
<string name="turn_auto_sync_on_dialog_confirm_btn" msgid="5575717918836806519">"Uključi"</string>
- <string name="connection_error_message" msgid="7446131881946138093">"Nema internetske veze"</string>
+ <string name="connection_error_message" msgid="7446131881946138093">"Nema veze"</string>
<string name="single_sim_display_label" msgid="264062966309455515">"SIM"</string>
<string name="show_more_content_description" msgid="6298277298495491712">"Prikaži više"</string>
<string name="importing_sim_finished_title" msgid="6436721150882268416">"Dovršen je uvoz SIM kartice"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 6eefd87..3eebba4 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -45,7 +45,7 @@
<string name="menu_addContactsToGroup" msgid="4549318978482280577">"ಸಂಪರ್ಕಗಳನ್ನು ಸೇರಿಸಿ"</string>
<string name="menu_removeFromGroup" msgid="8753799091967887958">"ಲೇಬಲ್ನಿಂದ ತೆಗೆದುಹಾಕಿ"</string>
<string name="menu_new_group_action_bar" msgid="1670312283925872483">"ಲೇಬಲ್ ರಚಿಸಿ"</string>
- <string name="splitConfirmation" msgid="4750158900636307469">"ಬಹು ಸಂಪರ್ಕಗಳಲ್ಲಿನ ಈ ಸಂಪರ್ಕವನ್ನು ಅನ್ಲಿಂಕ್ ಮಾಡಬೇಕೆ?"</string>
+ <string name="splitConfirmation" msgid="4750158900636307469">"ಬಹು ಸಂಪರ್ಕಗಳಲ್ಲಿನ ಈ ಸಂಪರ್ಕವನ್ನು ಅನ್ಲಿಂಕ್ ಮಾಡುವುದೇ?"</string>
<string name="splitConfirmation_positive_button" msgid="3109235536045409854">"ಅನ್ಲಿಂಕ್"</string>
<string name="splitConfirmationWithPendingChanges" msgid="8617395780141069527">"ನೀವು ಈಗಾಗಲೇ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲು ಮತ್ತು ಬಹು ಸಂಪರ್ಕಗಳಲ್ಲಿನ ಈ ಸಂಪರ್ಕವನ್ನು ಲಿಂಕ್ ರದ್ದುಮಾಡಲು ಬಯಸುವಿರಾ?"</string>
<string name="splitConfirmationWithPendingChanges_positive_button" msgid="131293000921403021">"ಉಳಿಸಿ ಮತ್ತು ಅನ್ಲಿಂಕ್ ಮಾಡಿ"</string>
@@ -193,7 +193,7 @@
<string name="expanding_entry_card_view_see_less" msgid="6399603072579278030">"ಕಡಿಮೆ ನೋಡಿ"</string>
<string name="about_card_title" msgid="6635849009952435700">"ಕುರಿತು"</string>
<string name="toast_making_personal_copy" msgid="9053129410039312386">"ವೈಯಕ್ತಿಕ ಪ್ರತಿಯನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ…"</string>
- <string name="date_time_set" msgid="8526160894146496334">"ಸೆಟ್ ಮಾಡಿ"</string>
+ <string name="date_time_set" msgid="8526160894146496334">"ಹೊಂದಿಸಿ"</string>
<string name="header_im_entry" msgid="3581797653862294826">"IM"</string>
<string name="header_organization_entry" msgid="7428066442988227441">"ಸಂಸ್ಥೆ"</string>
<string name="header_nickname_entry" msgid="1110276804512795150">"ಅಡ್ಡಹೆಸರು"</string>
@@ -387,7 +387,7 @@
<string name="fail_reason_not_supported" msgid="6449916670421646290">"ಈ ಫಾರ್ಮ್ಯಾಟ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string>
<string name="exporting_vcard_finished_title" msgid="1984393609140969504">"<xliff:g id="FILENAME">%s</xliff:g> ರಫ್ತು ಮುಗಿದಿದೆ."</string>
<string name="exporting_vcard_finished_title_fallback" msgid="9029067439586573959">"ಸಂಪರ್ಕಗಳ ರಫ್ತು ಮಾಡುವಿಕೆ ಮುಗಿದಿದೆ."</string>
- <string name="exporting_vcard_finished_toast" msgid="5463125514187187782">"ಸಂಪರ್ಕಗಳನ್ನು ರಪ್ತು ಮಾಡುವುದನ್ನು ಮುಕ್ತಾಯಗೊಳಿಸಲಾಗಿದೆ, ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ನೋಟಿಫಿಕೇಶನ್ ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
+ <string name="exporting_vcard_finished_toast" msgid="5463125514187187782">"ಸಂಪರ್ಕಗಳನ್ನು ರಪ್ತು ಮಾಡುವುದನ್ನು ಮುಕ್ತಾಯಗೊಳಿಸಲಾಗಿದೆ, ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಧಿಸೂಚನೆ ಕ್ಲಿಕ್ ಮಾಡಿ."</string>
<string name="touch_to_share_contacts" msgid="7678194978416052577">"ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="exporting_vcard_canceled_title" msgid="1287529222628052526">"<xliff:g id="FILENAME">%s</xliff:g> ರಫ್ತು ಮಾಡುವುದನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="exporting_contact_list_title" msgid="6599904516394311592">"ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ರಫ್ತುಮಾಡಲಾಗುತ್ತಿದೆ"</string>
@@ -479,7 +479,7 @@
<string name="auto_sync_off" msgid="7039314601316227882">"ಸ್ವಯಂಚಾಲಿತ ಸಿಂಕ್ ಆಫ್ ಆಗಿದೆ. ಆನ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="dismiss_sync_alert" msgid="4057176963960104786">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="account_sync_off" msgid="6187683798342006021">"ಖಾತೆಯ ಸಿಂಕ್ ಆಫ್ ಆಗಿದೆ. ಆನ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="turn_auto_sync_on_dialog_title" msgid="3812155064863594938">"ಸ್ವಯಂ-ಸಿಂಕ್ ಆನ್ ಮಾಡಬೇಕೆ?"</string>
+ <string name="turn_auto_sync_on_dialog_title" msgid="3812155064863594938">"ಸ್ವಯಂ-ಸಿಂಕ್ ಆನ್ ಮಾಡುವುದೇ?"</string>
<string name="turn_auto_sync_on_dialog_body" msgid="5386810641905184682">"ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಖಾತೆಗಳಿಗೆ ನೀವು ಮಾಡುವ ಬದಲಾವಣೆಗಳು Google ಸಂಪರ್ಕಗಳಿಗೆ ಮಾತ್ರವಲ್ಲದೇ, ವೆಬ್ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನಗಳ ನಡುವೆ ನವೀಕೃತವಾಗಿ ಇರಿಸಲಾಗುತ್ತದೆ."</string>
<string name="turn_auto_sync_on_dialog_confirm_btn" msgid="5575717918836806519">"ಆನ್ ಮಾಡಿ"</string>
<string name="connection_error_message" msgid="7446131881946138093">"ಯಾವುದೇ ಸಂಪರ್ಕವಿಲ್ಲ"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 990f24e..0b3c5f4 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -79,7 +79,7 @@
<string name="single_delete_confirmation" msgid="8260949300855537648">"Бул байланыш жок кылынсынбы?"</string>
<string name="batch_delete_confirmation" msgid="4149615167210863403">"Тандалган байланыштар жок кылынсынбы?"</string>
<string name="batch_delete_read_only_contact_confirmation" msgid="381691735715182700">"Окуу үчүн гана арналган аккаунтуңуздан байланыштарды жок кылуу мүмкүн эмес, бирок аларды жашырып койсо болот."</string>
- <string name="batch_delete_multiple_accounts_confirmation" msgid="4547718538924570984">"Өчүрүлө турган байланыштарда бир нече аккаунтунун чоо-жайы бар. Окуу үчүн гана арналган аккаунттарынын чоо-жайы жашырылып, өчпөйт."</string>
+ <string name="batch_delete_multiple_accounts_confirmation" msgid="4547718538924570984">"Жок кылына турган байланыштарда бир нече аккаунтунун чоо-жайы бар. Окуу үчүн гана арналган аккаунттарынын чоо-жайы жашырылып, өчпөйт."</string>
<string name="multipleContactDeleteConfirmation" msgid="2970218685653877287">"Бул байланыш өчүрүлсө, анын бир нече аккаунтундагы чоо-жайы өчүп калат."</string>
<string name="deleteConfirmation" msgid="3727809366015979585">"Бул байланыш жок кылынсынбы?"</string>
<string name="deleteConfirmation_positive_button" msgid="1604511403421785160">"Жок кылуу"</string>
@@ -457,7 +457,7 @@
<string name="about_build_version" msgid="5870642814752351712">"Курама версиясы"</string>
<string name="about_open_source_licenses" msgid="1617836621315557445">"Баштапкы коду ачык программалардын уруксаттамалары"</string>
<string name="about_open_source_licenses_summary" msgid="4843627659117423491">"Баштапкы коду ачык программалардын уруксаттамаларынын чоо-жайы"</string>
- <string name="about_privacy_policy" msgid="4581488375200402678">"Купуялык эрежелери"</string>
+ <string name="about_privacy_policy" msgid="4581488375200402678">"Купуялык саясаты"</string>
<string name="about_terms_of_service" msgid="7419670771785057738">"Тейлөө шарттары"</string>
<string name="activity_title_licenses" msgid="6434398894019119709">"Баштапкы коду ачык программалардын уруксаттамалары"</string>
<string name="url_open_error_toast" msgid="4885855620824048385">"URL ачылбай койду."</string>
@@ -467,7 +467,7 @@
<string name="description_delete_contact" msgid="8110643050235441400">"Жок кылуу"</string>
<string name="description_no_name_header" msgid="8596201864512339003">"Эллипс"</string>
<string name="dynamic_shortcut_disabled_message" msgid="8770462908102469878">"Кыска жол өчүрүлдү"</string>
- <string name="dynamic_shortcut_contact_removed_message" msgid="8331735243566193974">"Байланыш өчүрүлгөн"</string>
+ <string name="dynamic_shortcut_contact_removed_message" msgid="8331735243566193974">"Байланыш алынып салынган"</string>
<string name="sim_import_button_text" msgid="2845608246304396009">"Өткөрүп алуу"</string>
<string name="sim_import_title_none_selected" msgid="3527680774575468781">"Байланыштарды тандоо"</string>
<string name="sim_import_empty_message" msgid="7238368542566545854">"SIM картаңызда байланыштар жок."</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 1124e11..fc6ed71 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -40,7 +40,7 @@
<string name="menu_editGroup" msgid="8706562583754054622">"Отстрани контакти"</string>
<string name="menu_renameGroup" msgid="2685886609399776475">"Преименувај ја етикетата"</string>
<string name="menu_deleteGroup" msgid="1180215594530228294">"Избриши ја етикетата"</string>
- <string name="menu_addToGroup" msgid="5034813446697655310">"Додајте контакт"</string>
+ <string name="menu_addToGroup" msgid="5034813446697655310">"Додај контакт"</string>
<string name="menu_selectForGroup" msgid="6386553337569514850">"Избери контакти"</string>
<string name="menu_addContactsToGroup" msgid="4549318978482280577">"Додај контакти"</string>
<string name="menu_removeFromGroup" msgid="8753799091967887958">"Отстрани од етикетата"</string>
@@ -416,7 +416,7 @@
<string name="display_options_sort_list_by" msgid="4333658089057400431">"Подреди по"</string>
<string name="display_options_phonetic_name_fields" msgid="1857564544755287298">"Фонетско име"</string>
<string name="editor_options_always_show_phonetic_names" msgid="3612488836474257715">"Секогаш прикажувај"</string>
- <string name="editor_options_hide_phonetic_names_if_empty" msgid="2693314301550366143">"Скриј ако е празно"</string>
+ <string name="editor_options_hide_phonetic_names_if_empty" msgid="2693314301550366143">"Сокриј ако е празно"</string>
<string name="display_options_sort_by_given_name" msgid="893781924536349248">"Име"</string>
<string name="display_options_sort_by_family_name" msgid="1282763552330910876">"Презиме"</string>
<string name="display_options_view_names_as" msgid="4060686468465916565">"Формат на име"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index b8dfd3a..fbdf703 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -472,9 +472,9 @@
<string name="sim_import_title_none_selected" msgid="3527680774575468781">"အဆက်အသွယ်များကို ရွေးပါ"</string>
<string name="sim_import_empty_message" msgid="7238368542566545854">"ဆင်းမ်ကဒ်ထဲတွင် လိပ်စာ မရှိပါ"</string>
<string name="sim_import_contact_exists_toast" msgid="8423212007841229749">"အဆက်အသွယ်က သင့်စာရင်းတွင် ရှိနှင့်နေပါပြီ"</string>
- <string name="sim_import_success_toast_fmt" msgid="7645974841482481503">"{count,plural, =1{ဆင်းမ်ကတ်ထဲရှိ အဆက်အသွယ် # ခုကို ထည့်သွင်းလိုက်ပါပြီ}other{ဆင်းမ်ကတ်ထဲရှိ အဆက်အသွယ် # ခုကို ထည့်သွင်းလိုက်ပါပြီ}}"</string>
+ <string name="sim_import_success_toast_fmt" msgid="7645974841482481503">"{count,plural, =1{ဆင်းမ်ထဲရှိ အဆက်အသွယ် # ခုကို ထည့်သွင်းလိုက်ပါပြီ}other{ဆင်းမ်ထဲရှိ အဆက်အသွယ် # ခုကို ထည့်သွင်းလိုက်ပါပြီ}}"</string>
<string name="sim_import_failed_toast" msgid="358117391138073786">"ဆင်းမ်အဆက်အသွယ်များကို တင်သွင်း၍မရပါ"</string>
- <string name="sim_import_title" msgid="8202961146093040684">"ဆင်းမ်ကတ်မှ တင်သွင်းပါ"</string>
+ <string name="sim_import_title" msgid="8202961146093040684">"ဆင်းမ်ကဒ်မှ တင်သွင်းပါ"</string>
<string name="sim_import_cancel_content_description" msgid="4746065462808862682">"မလုပ်တော့"</string>
<string name="auto_sync_off" msgid="7039314601316227882">"အလိုအလျောက်စင့်ခ်လုပ်ခြင်းကို ပိတ်ထားသည်။ ဖွင့်ရန်အတွက် တို့ပါ။"</string>
<string name="dismiss_sync_alert" msgid="4057176963960104786">"ပယ်ရန်"</string>
@@ -487,7 +487,7 @@
<string name="show_more_content_description" msgid="6298277298495491712">"ပိုပြပါ"</string>
<string name="importing_sim_finished_title" msgid="6436721150882268416">"ဆင်းမ်ကဒ်ကို တင်သွင်းပြီးပါပြီ"</string>
<string name="importing_sim_failed_title" msgid="1046154274170241788">"တင်သွင်း၍မရပါ"</string>
- <string name="importing_sim_failed_message" msgid="55568522164349044">"ဆင်းမ်ကတ်မှ အဆက်အသွယ်များကို တင်သွင်း၍မရပါ"</string>
+ <string name="importing_sim_failed_message" msgid="55568522164349044">"ဆင်းမ်ကဒ်မှ အဆက်အသွယ်များကို တင်သွင်း၍မရပါ"</string>
<string name="importing_sim_in_progress_title" msgid="7647907413920018595">"ဆင်းမ်ကဒ်ကို တင်သွင်းနေသည်"</string>
<string name="contacts_default_notification_channel" msgid="5116916969874075866">"အကြောင်းကြားချက်များ"</string>
<string name="yes_button" msgid="1120514817091581293">"Yes"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index ba033aa..58a89f5 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="applicationLabel" msgid="8908212014470937609">"कन्ट्याक्टहरू"</string>
+ <string name="applicationLabel" msgid="8908212014470937609">"सम्पर्कहरू"</string>
<string name="contactsList" msgid="4456188358262700898">"सम्पर्क"</string>
<string name="shortcut_add_contact" msgid="7949342235528657981">"सम्पर्क थप्नुहोस्"</string>
<string name="shortcutContact" msgid="8009736387364461511">"ठेगाना"</string>
@@ -114,7 +114,7 @@
<string name="groupSomeContactsNoEmailsToast" msgid="2142963883699535155">"केही सम्पर्कहरूका इमेल ठेगाना छैनन्"</string>
<string name="groupSomeContactsNoPhonesToast" msgid="2454029254458875746">"केही सम्पर्कहरूका फोन नम्बर छैनन्"</string>
<string name="menu_sendEmailOption" msgid="8600335923636486825">"इमेल पठाउनुहोस्"</string>
- <string name="menu_sendMessageOption" msgid="8051852013078110910">"म्यासेज पठाउनुहोस्"</string>
+ <string name="menu_sendMessageOption" msgid="8051852013078110910">"सन्देश पठाउनुहोस्"</string>
<string name="pickerSelectContactsActivityTitle" msgid="8265907544009447967">"सम्पर्कहरू छान्नुहोस्"</string>
<string name="send_to_selection" msgid="3655197947726443720">"पठाउनुहोस्"</string>
<string name="listFoundAllContactsZero" msgid="1933842282916988563">"कुनै सम्पर्कहरू छैनन्।"</string>
@@ -272,7 +272,7 @@
<string name="sms_work_pager" msgid="8827367747655005608">"पाठ कार्य पेजर"</string>
<string name="sms_assistant" msgid="245045451580096547">"पाठ <xliff:g id="ASSISTANT">%s</xliff:g>"</string>
<string name="sms_mms" msgid="7395133080765833725">"पाठ MMS"</string>
- <string name="sms_by_shortcut" msgid="4682340916268521006">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (म्यासेज पठाउनुहोस्)"</string>
+ <string name="sms_by_shortcut" msgid="4682340916268521006">"<xliff:g id="CONTACT_NAME">%s</xliff:g> (सन्देश पठाउनुहोस्)"</string>
<string name="description_video_call" msgid="4956825008907720371">"भिडियो कल बनाउनुहोस्"</string>
<string name="clearFrequentsConfirmation_title" msgid="9194415661170740437">"प्रायः सम्पर्क गरिएकाहरूलाई हटाउने हो?"</string>
<string name="clearFrequentsConfirmation" msgid="2120741757522063938">"तपाईंले सम्पर्कहरू र फोन एपहरूमा बारम्बार सम्पर्क गरेको सूची खाली गर्नुहुनेछ र स्क्रयाचबाट तपाईंको ठेगाना प्राथमिकताहरू सिक्नको लागि इमेल एपहरूलाई दबाब दिनुहुनेछ।"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 790bec6..9bf3593 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -199,7 +199,7 @@
<string name="header_nickname_entry" msgid="1110276804512795150">"ਉਪਨਾਮ"</string>
<string name="header_note_entry" msgid="339680292368016788">"ਸੂਚਨਾ"</string>
<string name="header_website_entry" msgid="3618691707215428785">"ਵੈੱਬਸਾਈਟ"</string>
- <string name="header_event_entry" msgid="70962228694476731">"ਇਵੈਂਟ"</string>
+ <string name="header_event_entry" msgid="70962228694476731">"ਵਰਤਾਰਾ"</string>
<string name="header_relation_entry" msgid="993618132732521944">"ਰਿਸ਼ਤਾ"</string>
<string name="header_name_entry" msgid="2516776099121101578">"ਨਾਮ"</string>
<string name="header_email_entry" msgid="8653569770962542178">"ਈਮੇਲ"</string>
@@ -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>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index a39207b..1f1cf0f 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -147,7 +147,7 @@
<string name="cancel_button_content_description" msgid="7407595608883650004">"Cancelar"</string>
<string name="back_arrow_content_description" msgid="6727142616775523605">"Voltar"</string>
<string name="action_menu_back_from_edit_select" msgid="7911226757462657242">"fechar"</string>
- <string name="aggregation_suggestion_edit_dialog_message" msgid="4339333746086996062">"Mudar para a edição do contato selecionado? As informações inseridas até agora serão copiadas."</string>
+ <string name="aggregation_suggestion_edit_dialog_message" msgid="4339333746086996062">"Alternar para a edição do contato selecionado? As informações inseridas até agora serão copiadas."</string>
<string name="contact_directory_description" msgid="1773630547110881835">"Diretório <xliff:g id="TYPE">%1$s</xliff:g>"</string>
<string name="activity_title_settings" msgid="4004290638426915162">"Configurações"</string>
<string name="menu_settings" msgid="3524924670246877187">"Configurações"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 2fb9814..6b71fbf 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -45,7 +45,7 @@
<string name="menu_addContactsToGroup" msgid="4549318978482280577">"Adicionar contactos"</string>
<string name="menu_removeFromGroup" msgid="8753799091967887958">"Remover da etiqueta"</string>
<string name="menu_new_group_action_bar" msgid="1670312283925872483">"Criar etiqueta"</string>
- <string name="splitConfirmation" msgid="4750158900636307469">"Quer desassociar este contacto em vários contactos?"</string>
+ <string name="splitConfirmation" msgid="4750158900636307469">"Pretende desassociar este contacto em vários contactos?"</string>
<string name="splitConfirmation_positive_button" msgid="3109235536045409854">"Desassociar"</string>
<string name="splitConfirmationWithPendingChanges" msgid="8617395780141069527">"Gostaria de guardar as alterações já efetuadas e desassociar este contacto em vários contactos?"</string>
<string name="splitConfirmationWithPendingChanges_positive_button" msgid="131293000921403021">"Guardar e desassociar"</string>
@@ -57,7 +57,7 @@
<string name="menu_linkedContacts" msgid="6363718333551613063">"Ver contactos associados"</string>
<string name="menu_save" msgid="7204524700499687371">"Guardar"</string>
<string name="titleJoinContactDataWith" msgid="7342386037654890242">"Associar contactos"</string>
- <string name="blurbJoinContactDataWith" msgid="132105056919797709">"Escolha o contacto que quer associar a <xliff:g id="NAME">%s</xliff:g>:"</string>
+ <string name="blurbJoinContactDataWith" msgid="132105056919797709">"Escolha o contacto que pretende associar a <xliff:g id="NAME">%s</xliff:g>:"</string>
<string name="separatorJoinAggregateSuggestions" msgid="8347769365870796983">"Contactos sugeridos"</string>
<string name="separatorJoinAggregateAll" msgid="5378346138684490784">"Todos os contactos"</string>
<string name="contactsJoinedNamedMessage" msgid="8732933595873458166">"Contacto associado: <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -170,7 +170,7 @@
<string name="cancel_confirmation_dialog_message" msgid="7486892574762212762">"Rejeitar alterações?"</string>
<string name="cancel_confirmation_dialog_cancel_editing_button" msgid="8280294641821133477">"Rejeitar"</string>
<string name="cancel_confirmation_dialog_keep_editing_button" msgid="7117943783437253341">"Cancelar"</string>
- <string name="leave_customize_confirmation_dialog_message" msgid="5330853530872707231">"Quer rejeitar as personalizações?"</string>
+ <string name="leave_customize_confirmation_dialog_message" msgid="5330853530872707231">"Pretende rejeitar as personalizações?"</string>
<string name="enter_contact_name" msgid="521859148893732679">"Pesquisar contactos"</string>
<string name="title_edit_group" msgid="4246193439931854759">"Remover contactos"</string>
<string name="local_profile_title" msgid="1613784248702623410">"O meu perfil local"</string>
@@ -372,7 +372,7 @@
<string name="import_from_sim_secondary_template" msgid="7574306746844258362">"{count,plural, =1{# contacto • <xliff:g id="PHONE_NUMBER_0">^1</xliff:g>}other{# contactos • <xliff:g id="PHONE_NUMBER_1">^1</xliff:g>}}"</string>
<string name="import_from_vcf_file" msgid="6776403212804361301">"Ficheiro .vcf"</string>
<string name="nothing_to_import_message" msgid="2594519620375509783">"Nada para importar"</string>
- <string name="import_from_vcf_file_confirmation_message" msgid="8579284961401472204">"Quer importar contactos do vCard?"</string>
+ <string name="import_from_vcf_file_confirmation_message" msgid="8579284961401472204">"Pretende importar contactos do vCard?"</string>
<string name="cancel_import_confirmation_message" msgid="1007412828398265611">"Cancelar a importação de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_export_confirmation_message" msgid="370693160959236239">"Cancelar a exportação de <xliff:g id="FILENAME">%s</xliff:g>?"</string>
<string name="cancel_vcard_import_or_export_failed" msgid="3041814872516288484">"Imposs. cancel. import./export. do vCard"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a39207b..1f1cf0f 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -147,7 +147,7 @@
<string name="cancel_button_content_description" msgid="7407595608883650004">"Cancelar"</string>
<string name="back_arrow_content_description" msgid="6727142616775523605">"Voltar"</string>
<string name="action_menu_back_from_edit_select" msgid="7911226757462657242">"fechar"</string>
- <string name="aggregation_suggestion_edit_dialog_message" msgid="4339333746086996062">"Mudar para a edição do contato selecionado? As informações inseridas até agora serão copiadas."</string>
+ <string name="aggregation_suggestion_edit_dialog_message" msgid="4339333746086996062">"Alternar para a edição do contato selecionado? As informações inseridas até agora serão copiadas."</string>
<string name="contact_directory_description" msgid="1773630547110881835">"Diretório <xliff:g id="TYPE">%1$s</xliff:g>"</string>
<string name="activity_title_settings" msgid="4004290638426915162">"Configurações"</string>
<string name="menu_settings" msgid="3524924670246877187">"Configurações"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index c92cd37..7ed5315 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -124,7 +124,7 @@
<string name="quickcontact_add_phone_number" msgid="1683577288080727862">"Shto një numër telefoni"</string>
<string name="quickcontact_add_email" msgid="1442894568471116797">"Shto një email"</string>
<string name="missing_app" msgid="5674389915738964148">"Nuk u gjet asnjë aplikacion për të menaxhuar këtë veprim"</string>
- <string name="menu_share" msgid="6343022811796001773">"Ndaj"</string>
+ <string name="menu_share" msgid="6343022811796001773">"Shpërndaj"</string>
<string name="menu_add_contact" msgid="5822356185421997656">"Shto te kontaktet"</string>
<string name="menu_add_contacts" msgid="7114262784903366463">"Shto"</string>
<string name="title_share_via" msgid="3300082736229182956">"{count,plural, =1{Ndaje kontaktin nëpërmjet}other{Ndaji kontaktet nëpërmjet}}"</string>
@@ -318,7 +318,7 @@
<string name="label_notes" msgid="7134226125644463585">"Shënimet"</string>
<string name="label_custom_field" msgid="4160584225306364924">"E personalizuar"</string>
<string name="label_sip_address" msgid="8876347942587537552">"SIP"</string>
- <string name="websiteLabelsGroup" msgid="114754928100220315">"Uebsajti"</string>
+ <string name="websiteLabelsGroup" msgid="114754928100220315">"Faqja e internetit"</string>
<string name="groupsLabel" msgid="5622154133880646122">"Emërtimet"</string>
<string name="email_home" msgid="1102791500866910269">"Dërgoji mail shtëpisë"</string>
<string name="email_mobile" msgid="6461172430397598705">"Dërgoji mail celularit"</string>
@@ -432,8 +432,8 @@
<string name="share_contacts_failure" msgid="1348777470180064086">"Ndarja e kontakteve dështoi."</string>
<string name="dialog_export" msgid="3497435010655060068">"Eksporto kontaktet"</string>
<string name="dialog_import" msgid="4590232235052756593">"Importo kontaktet nga"</string>
- <string name="share_error" msgid="4854612167186185739">"Ky kontakt nuk mund të ndahet"</string>
- <string name="no_contact_to_share" msgid="6285287228557175749">"Nuk ka kontakte për të ndarë"</string>
+ <string name="share_error" msgid="4854612167186185739">"Ky kontakt nuk mund të shpërndahet"</string>
+ <string name="no_contact_to_share" msgid="6285287228557175749">"Nuk ka kontakte për të shpërndarë"</string>
<string name="menu_contacts_filter" msgid="5854584270038139275">"Kontakte për t\'u shfaqur"</string>
<string name="activity_title_contacts_filter" msgid="6340531582631006680">"Kontakte për t\'u shfaqur"</string>
<string name="custom_list_filter" msgid="2544327670202891979">"Personalizo pamjen"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index f1558ac..c9ff95a 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -475,7 +475,7 @@
<string name="sim_import_success_toast_fmt" msgid="7645974841482481503">"{count,plural, =1{Увезен је # контакт са SIM-а}one{Увезен је # контакт са SIM-а}few{Увезена су # контакта са SIM-а}other{Увезено је # контаката са SIM-а}}"</string>
<string name="sim_import_failed_toast" msgid="358117391138073786">"Увоз контаката са SIM картице није успео"</string>
<string name="sim_import_title" msgid="8202961146093040684">"Увезите са SIM-а"</string>
- <string name="sim_import_cancel_content_description" msgid="4746065462808862682">"Откажи"</string>
+ <string name="sim_import_cancel_content_description" msgid="4746065462808862682">"Откажите"</string>
<string name="auto_sync_off" msgid="7039314601316227882">"Аутоматска синхронизација је искључена. Додирните да бисте је укључили."</string>
<string name="dismiss_sync_alert" msgid="4057176963960104786">"Одбаците"</string>
<string name="account_sync_off" msgid="6187683798342006021">"Синхронизација налога је искључена. Додирните да бисте је укључили."</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index a65218d..d07f2c4 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -116,7 +116,7 @@
<string name="menu_sendEmailOption" msgid="8600335923636486825">"ఈమెయిల్ను పంపు"</string>
<string name="menu_sendMessageOption" msgid="8051852013078110910">"మెసేజ్ను పంపు"</string>
<string name="pickerSelectContactsActivityTitle" msgid="8265907544009447967">"కాంటాక్ట్లను ఎంచుకోండి"</string>
- <string name="send_to_selection" msgid="3655197947726443720">"పంపండి"</string>
+ <string name="send_to_selection" msgid="3655197947726443720">"పంపు"</string>
<string name="listFoundAllContactsZero" msgid="1933842282916988563">"కాంటాక్ట్లు లేవు"</string>
<string name="add_contact_dlg_message_fmt" msgid="7498024710169591375">"\"<xliff:g id="EMAIL">%s</xliff:g>\"ని కాంటాక్ట్లకు జోడించాలా?"</string>
<string name="search_settings_description" msgid="5630675648560839920">"మీ కాంటాక్ట్ల పేర్లు"</string>
@@ -310,7 +310,7 @@
<string name="organizationLabelsGroup" msgid="2342482097897299099">"సంస్థ"</string>
<string name="relationLabelsGroup" msgid="8931615792208307291">"సంబంధం"</string>
<string name="eventLabelsGroup" msgid="8625868552164376823">"ప్రత్యేక తేదీ"</string>
- <string name="sms" msgid="4246338112764847384">"టెక్స్ట్ మెసేజ్"</string>
+ <string name="sms" msgid="4246338112764847384">"వచన మెసేజ్"</string>
<string name="postal_address" msgid="5031809899673855074">"అడ్రస్"</string>
<string name="ghostData_company" msgid="3873500610390675876">"కంపెనీ"</string>
<string name="ghostData_department" msgid="8610642449404163799">"విభాగం"</string>
@@ -403,9 +403,9 @@
<string name="importing_vcard_canceled_title" msgid="8165471996631186776">"<xliff:g id="FILENAME">%s</xliff:g>ని దిగుమతి చేయడం రద్దు చేయబడింది"</string>
<string name="vcard_import_will_start_message" msgid="4514702035621833178">"<xliff:g id="FILENAME">%s</xliff:g> కొద్దిసేపట్లో దిగుమతి చేయబడుతుంది."</string>
<string name="vcard_import_will_start_message_with_default_name" msgid="8205422202924103470">"ఫైల్ కొద్దిసేపట్లో దిగుమతి చేయబడుతుంది."</string>
- <string name="vcard_import_request_rejected_message" msgid="4754292694777189540">"vCard దిగుమతి రిక్వెస్ట్ తిరస్కరించబడింది. తర్వాత మళ్లీ ట్రై చేయండి."</string>
+ <string name="vcard_import_request_rejected_message" msgid="4754292694777189540">"vCard దిగుమతి రిక్వెస్ట్ తిరస్కరించబడింది. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
<string name="contacts_export_will_start_message" msgid="6428126265599715944">"కాంటాక్ట్లు కొద్ది సేపట్లో ఎగుమతి చేయబడతాయి."</string>
- <string name="vcard_export_request_rejected_message" msgid="6455336845734884740">"vCard ఎగుమతి రిక్వెస్ట్ తిరస్కరించబడింది. తర్వాత మళ్లీ ట్రై చేయండి."</string>
+ <string name="vcard_export_request_rejected_message" msgid="6455336845734884740">"vCard ఎగుమతి రిక్వెస్ట్ తిరస్కరించబడింది. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
<string name="vcard_unknown_filename" msgid="8320954544777782497">"కాంటాక్ట్"</string>
<string name="caching_vcard_message" msgid="1879339732783666517">"vCard(ల)ను స్థానిక తాత్కాలిక స్టోరేజ్కు కాష్ చేస్తోంది. అసలు దిగుమతి కొద్దిసేపట్లో ప్రారంభమవుతుంది."</string>
<string name="vcard_import_failed" msgid="37313715326741013">"vCardని దిగుమతి చేయడం సాధ్యపడలేదు."</string>
@@ -415,7 +415,7 @@
<string name="export_to_vcf_file" msgid="3096479544575798192">".vcf ఫైల్కు ఎగుమతి చేయి"</string>
<string name="display_options_sort_list_by" msgid="4333658089057400431">"ఇలా వర్గీకరించు"</string>
<string name="display_options_phonetic_name_fields" msgid="1857564544755287298">"ఫొనెటిక్ పేరు"</string>
- <string name="editor_options_always_show_phonetic_names" msgid="3612488836474257715">"ఎల్లప్పుడూ చూపండి"</string>
+ <string name="editor_options_always_show_phonetic_names" msgid="3612488836474257715">"ఎల్లప్పుడూ చూపు"</string>
<string name="editor_options_hide_phonetic_names_if_empty" msgid="2693314301550366143">"ఖాళీగా ఉంటే దాచు"</string>
<string name="display_options_sort_by_given_name" msgid="893781924536349248">"మొదటి పేరు"</string>
<string name="display_options_sort_by_family_name" msgid="1282763552330910876">"చివరి పేరు"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 3f74c89..db25cb7 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -314,7 +314,7 @@
<string name="postal_address" msgid="5031809899673855074">"Adres"</string>
<string name="ghostData_company" msgid="3873500610390675876">"Şirket"</string>
<string name="ghostData_department" msgid="8610642449404163799">"Bölüm"</string>
- <string name="ghostData_title" msgid="8584897460662904533">"Ünvan"</string>
+ <string name="ghostData_title" msgid="8584897460662904533">"Unvan"</string>
<string name="label_notes" msgid="7134226125644463585">"Notlar"</string>
<string name="label_custom_field" msgid="4160584225306364924">"Özel"</string>
<string name="label_sip_address" msgid="8876347942587537552">"SIP"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 7c1c724..84a0def 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -332,7 +332,7 @@
<string name="postal_postcode" msgid="33077708757232659">"Mã ZIP"</string>
<string name="postal_country" msgid="6642804283917549861">"Quốc gia"</string>
<string name="map_home" msgid="2169053372466501148">"Xem địa chỉ nhà riêng"</string>
- <string name="map_work" msgid="8296916987749726461">"Xem địa chỉ nơi làm việc"</string>
+ <string name="map_work" msgid="8296916987749726461">"Xem địa chỉ cơ quan"</string>
<string name="map_other" msgid="4009931029322619674">"Xem địa chỉ"</string>
<string name="map_custom" msgid="7797812861927817335">"Xem địa chỉ <xliff:g id="CUSTOM_LABEL">%s</xliff:g>"</string>
<string name="chat_aim" msgid="2044861410748519265">"Trò chuyện sử dụng AIM"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 55c18be..154bce0 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -75,12 +75,12 @@
<string name="menu_unredirect_calls_to_vm" msgid="2294919685954790892">"取消转接到语音信箱"</string>
<string name="readOnlyContactWarning" msgid="4158660823025751201">"这是只读联系人信息。您无法删除此联系人,但可以将其隐藏。"</string>
<string name="readOnlyContactWarning_positive_button" msgid="2602676689104338036">"隐藏联系人"</string>
- <string name="readOnlyContactDeleteConfirmation" msgid="2759786078454970110">"此联系人的只读账号将被隐藏,而不会被删除。"</string>
+ <string name="readOnlyContactDeleteConfirmation" msgid="2759786078454970110">"此联系人的只读帐号将被隐藏,而不会被删除。"</string>
<string name="single_delete_confirmation" msgid="8260949300855537648">"要删除此联系人吗?"</string>
<string name="batch_delete_confirmation" msgid="4149615167210863403">"要删除所选联系人吗?"</string>
- <string name="batch_delete_read_only_contact_confirmation" msgid="381691735715182700">"系统无法删除来自只读账号的联系人信息,但可以将这些信息隐藏。"</string>
- <string name="batch_delete_multiple_accounts_confirmation" msgid="4547718538924570984">"您要删除的联系人信息包含来自多个账号的详细信息。系统将隐藏来自只读账号的详细信息,而不会删除这些信息。"</string>
- <string name="multipleContactDeleteConfirmation" msgid="2970218685653877287">"删除此联系人也将删除多个账号中的相关详细信息。"</string>
+ <string name="batch_delete_read_only_contact_confirmation" msgid="381691735715182700">"系统无法删除来自只读帐号的联系人信息,但可以将这些信息隐藏。"</string>
+ <string name="batch_delete_multiple_accounts_confirmation" msgid="4547718538924570984">"您要删除的联系人信息包含来自多个帐号的详细信息。系统将隐藏来自只读帐号的详细信息,而不会删除这些信息。"</string>
+ <string name="multipleContactDeleteConfirmation" msgid="2970218685653877287">"删除此联系人也将删除多个帐号中的相关详细信息。"</string>
<string name="deleteConfirmation" msgid="3727809366015979585">"要删除此联系人吗?"</string>
<string name="deleteConfirmation_positive_button" msgid="1604511403421785160">"删除"</string>
<string name="invalidContactMessage" msgid="6204402264821083362">"该联系人不存在。"</string>
@@ -92,7 +92,7 @@
<string name="removePhoto" msgid="1190099414600730001">"移除照片"</string>
<string name="noContacts" msgid="3030512741779213810">"联系人列表是空的"</string>
<string name="emptyGroup" msgid="8598261660865081152">"此标签下没有联系人"</string>
- <string name="emptyAccount" msgid="7450843210977018582">"此账号中没有联系人"</string>
+ <string name="emptyAccount" msgid="7450843210977018582">"此帐号中没有联系人"</string>
<string name="emptyMainList" msgid="3266182207039677163">"联系人列表是空的"</string>
<string name="contactSavedNamedToast" msgid="3067050290584834386">"已保存<xliff:g id="DISPLAY_NAME">%s</xliff:g>"</string>
<string name="contactSavedToast" msgid="4370392215196995301">"联系人已保存"</string>
@@ -128,7 +128,7 @@
<string name="menu_add_contact" msgid="5822356185421997656">"添加到通讯录"</string>
<string name="menu_add_contacts" msgid="7114262784903366463">"添加"</string>
<string name="title_share_via" msgid="3300082736229182956">"{count,plural, =1{通过以下应用分享联系人}other{通过以下应用分享联系人}}"</string>
- <string name="dialog_new_group_account" msgid="4326402875327788728">"选择账号"</string>
+ <string name="dialog_new_group_account" msgid="4326402875327788728">"选择帐号"</string>
<string name="group_name_dialog_insert_title" msgid="5495572488613178283">"创建标签"</string>
<string name="group_name_dialog_update_title" msgid="3955919589366745101">"重命名标签"</string>
<string name="group_name_dialog_hint" msgid="6023999218213062973">"标签名称"</string>
@@ -136,7 +136,7 @@
<string name="audio_chat" msgid="5921525823973697372">"语音聊天"</string>
<string name="video_chat" msgid="2477295971622477433">"视频聊天"</string>
<string name="account_type_format" msgid="4926968760755013450">"<xliff:g id="SOURCE">%1$s</xliff:g> 联系人"</string>
- <string name="google_account_type_format" msgid="4046692740262396811">"<xliff:g id="SOURCE">%1$s</xliff:g>账号"</string>
+ <string name="google_account_type_format" msgid="4046692740262396811">"<xliff:g id="SOURCE">%1$s</xliff:g>帐号"</string>
<string name="take_photo" msgid="820071555236547516">"拍照"</string>
<string name="take_new_photo" msgid="4383091978116875778">"拍摄新照片"</string>
<string name="pick_photo" msgid="2050859661654812588">"选择照片"</string>
@@ -158,7 +158,7 @@
<string name="non_phone_add_to_contacts" msgid="5472784294274676663">"添加到通讯录"</string>
<string name="non_phone_close" msgid="2792373584950696532">"关闭"</string>
<string name="date_year_toggle" msgid="8930759990426623823">"包含年份"</string>
- <string name="contacts_unavailable_add_account" msgid="5196453892411710750">"添加账号"</string>
+ <string name="contacts_unavailable_add_account" msgid="5196453892411710750">"添加帐号"</string>
<string name="contacts_unavailable_import_contacts" msgid="4914180876114104054">"导入"</string>
<string name="create_group_item_label" msgid="921929508079162463">"新建…"</string>
<string name="delete_group_dialog_message" msgid="754082019928025404">"要删除“<xliff:g id="GROUP_LABEL">%1$s</xliff:g>”标签吗?(系统不会删除联系人。)"</string>
@@ -175,9 +175,9 @@
<string name="title_edit_group" msgid="4246193439931854759">"移除联系人"</string>
<string name="local_profile_title" msgid="1613784248702623410">"我的本地个人资料"</string>
<string name="external_profile_title" msgid="2706282819025406927">"我的<xliff:g id="EXTERNAL_SOURCE">%1$s</xliff:g>个人资料"</string>
- <string name="contact_editor_prompt_zero_accounts" msgid="4468363031413457746">"请花一点时间添加账号,以便将联系人备份到 Google。"</string>
+ <string name="contact_editor_prompt_zero_accounts" msgid="4468363031413457746">"请花一点时间添加帐号,以便将联系人备份到 Google。"</string>
<string name="contact_editor_prompt_one_account" msgid="765343809177951169">"新建的联系人将保存到 <xliff:g id="ACCOUNT_NAME">%1$s</xliff:g>。"</string>
- <string name="contact_editor_prompt_multiple_accounts" msgid="1543322760761168351">"选择用来保存新建联系人的默认账号:"</string>
+ <string name="contact_editor_prompt_multiple_accounts" msgid="1543322760761168351">"选择用来保存新建联系人的默认帐号:"</string>
<string name="contact_editor_title_new_contact" msgid="7534775011591770343">"创建新联系人"</string>
<string name="contact_editor_title_existing_contact" msgid="3647774955741654029">"修改联系人"</string>
<string name="contact_editor_title_read_only_contact" msgid="5494810291515292596">"只能查看"</string>
@@ -185,8 +185,8 @@
<string name="contact_editor_pick_linked_contact_dialog_title" msgid="3332134735168016293">"已关联的联系人"</string>
<string name="contact_editor_add_linked_contact" msgid="2895453741206196138">"添加"</string>
<string name="contact_editor_unlink_contacts" msgid="8399419729744305687">"取消关联"</string>
- <string name="add_account" msgid="3071396624500839020">"添加账号"</string>
- <string name="add_new_account" msgid="573368229646104110">"添加新账号"</string>
+ <string name="add_account" msgid="3071396624500839020">"添加帐号"</string>
+ <string name="add_new_account" msgid="573368229646104110">"添加新帐号"</string>
<string name="menu_export_database" msgid="1658249125751926885">"导出数据库文件"</string>
<string name="action_menu_add_new_contact_button" msgid="1201339383074001291">"创建新联系人"</string>
<string name="expanding_entry_card_view_see_more" msgid="6636033205952561590">"查看更多"</string>
@@ -225,7 +225,7 @@
<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>
+ <string name="menu_title_filters" msgid="349866121417914494">"帐号"</string>
<string name="hamburger_feature_highlight_header" msgid="1786641424099282909">"建议"</string>
<string name="hamburger_feature_highlight_body" msgid="782935036630531528">"让您的通讯录井井有条,方便使用"</string>
<string name="undo" msgid="2446931036220975026">"撤消"</string>
@@ -422,8 +422,8 @@
<string name="display_options_view_names_as" msgid="4060686468465916565">"姓名格式"</string>
<string name="display_options_view_given_name_first" msgid="383885125505521383">"名字在前"</string>
<string name="display_options_view_family_name_first" msgid="6597077054231296007">"姓氏在前"</string>
- <string name="settings_accounts" msgid="119582613811929994">"账号"</string>
- <string name="default_editor_account" msgid="4810392921888877149">"用于保存新联系人的默认账号"</string>
+ <string name="settings_accounts" msgid="119582613811929994">"帐号"</string>
+ <string name="default_editor_account" msgid="4810392921888877149">"用于保存新联系人的默认帐号"</string>
<string name="settings_my_info_title" msgid="6236848378653551341">"我的信息"</string>
<string name="set_up_profile" msgid="3554999219868611431">"设置您的个人资料"</string>
<string name="setting_about" msgid="2941859292287597555">"关于通讯录"</string>
@@ -447,7 +447,7 @@
<string name="contact_status_update_attribution_with_date" msgid="2195847657702455703">"时间:<xliff:g id="DATE">%1$s</xliff:g>,来源:<xliff:g id="SOURCE">%2$s</xliff:g>"</string>
<string name="action_menu_back_from_search" msgid="683765774264585732">"停止搜索"</string>
<string name="description_clear_search" msgid="1852934085825794095">"清除搜索内容"</string>
- <string name="select_account_dialog_title" msgid="5047523441152129207">"账号"</string>
+ <string name="select_account_dialog_title" msgid="5047523441152129207">"帐号"</string>
<string name="set_default_account" msgid="9194321110211682396">"一律使用这张卡进行通话"</string>
<string name="call_with_a_note" msgid="2463785820399287281">"拨打电话并发送备注"</string>
<string name="call_subject_hint" msgid="7056652101889538157">"输入要在拨打电话时发送的备注…"</string>
@@ -478,9 +478,9 @@
<string name="sim_import_cancel_content_description" msgid="4746065462808862682">"取消"</string>
<string name="auto_sync_off" msgid="7039314601316227882">"自动同步功能已关闭。点按即可开启。"</string>
<string name="dismiss_sync_alert" msgid="4057176963960104786">"关闭"</string>
- <string name="account_sync_off" msgid="6187683798342006021">"账号同步功能已关闭。点按即可开启。"</string>
+ <string name="account_sync_off" msgid="6187683798342006021">"帐号同步功能已关闭。点按即可开启。"</string>
<string name="turn_auto_sync_on_dialog_title" msgid="3812155064863594938">"要开启自动同步功能吗?"</string>
- <string name="turn_auto_sync_on_dialog_body" msgid="5386810641905184682">"您对所有应用和账号(不只是 Google 通讯录)所做的更改都会在网络和您的设备之间保持同步。"</string>
+ <string name="turn_auto_sync_on_dialog_body" msgid="5386810641905184682">"您对所有应用和帐号(不只是 Google 通讯录)所做的更改都会在网络和您的设备之间保持同步。"</string>
<string name="turn_auto_sync_on_dialog_confirm_btn" msgid="5575717918836806519">"开启"</string>
<string name="connection_error_message" msgid="7446131881946138093">"无网络连接"</string>
<string name="single_sim_display_label" msgid="264062966309455515">"SIM 卡"</string>
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..082adeb
--- /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;