[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: 8ef9a50c28 -s ours

am skip reason: contains skip directive

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Contacts/+/25943298

Change-Id: Id278b12fbf21b7bf89904f01bf194fd364975106
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/lint-baseline.xml b/lint-baseline.xml
deleted file mode 100644
index 659b24d..0000000
--- a/lint-baseline.xml
+++ /dev/null
@@ -1,664 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-dev" type="baseline" client="" dependencies="true" name="" variant="all" version="7.1.0-dev">
-
-    <issue
-        id="NewApi"
-        message="Call requires API level S (current min is 21): `android.provider.ContactsContract.SimContacts#getSimAccounts`"
-        errorLine1="                        ContactsContract.SimContacts.getSimAccounts(mContext.getContentResolver());"
-        errorLine2="                                                     ~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/model/AccountTypeManager.java"
-            line="541"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level S (current min is 21): `android.provider.ContactsContract.SimAccount#getAccountName`"
-        errorLine1="                    simAccountWithDataSets.add(new AccountWithDataSet(simAccount.getAccountName(),"
-        errorLine2="                                                                                 ~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/model/AccountTypeManager.java"
-            line="543"
-            column="82"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level S (current min is 21): `android.provider.ContactsContract.SimAccount#getAccountType`"
-        errorLine1="                            simAccount.getAccountType(), null));"
-        errorLine2="                                       ~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/model/AccountTypeManager.java"
-            line="544"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `PhoneAccountHandle` to `Parcelable` requires API level 23 (current min is 21)"
-        errorLine1="        arguments.putParcelable(ARG_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/dialog/CallSubjectDialog.java"
-            line="249"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `PhoneAccountHandle` to `Parcelable` requires API level 23 (current min is 21)"
-        errorLine1="            intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);"
-        errorLine2="                                                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="87"
-            column="72"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.TelecomManager#getCallCapablePhoneAccounts`"
-        errorLine1="            List&lt;PhoneAccountHandle> accountHandles = telecommMgr.getCallCapablePhoneAccounts();"
-        errorLine2="                                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="164"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.TelecomManager#getPhoneAccount`"
-        errorLine1="                PhoneAccount account = telecommMgr.getPhoneAccount(accountHandle);"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="166"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#hasCapabilities`"
-        errorLine1="                    if (account.hasCapabilities(PhoneAccount.CAPABILITY_VIDEO_CALLING)) {"
-        errorLine2="                                ~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="168"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#hasCapabilities`"
-        errorLine1="                        if (account.hasCapabilities(PhoneAccountSdkCompat"
-        errorLine2="                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="175"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.TelecomManager#getCallCapablePhoneAccounts`"
-        errorLine1="            List&lt;PhoneAccountHandle> accountHandles = telecommMgr.getCallCapablePhoneAccounts();"
-        errorLine2="                                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="211"
-            column="67"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.TelecomManager#getPhoneAccount`"
-        errorLine1="                PhoneAccount account = telecommMgr.getPhoneAccount(accountHandle);"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="213"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#hasCapabilities`"
-        errorLine1="                if (account != null &amp;&amp; account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT)) {"
-        errorLine2="                                               ~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/CallUtil.java"
-            line="214"
-            column="48"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.content.ContentProviderOperation#isInsert`"
-        errorLine1="            return cpoWrapper.getOperation().isInsert();"
-        errorLine2="                                             ~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/CompatUtils.java"
-            line="48"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.content.ContentProviderOperation#isUpdate`"
-        errorLine1="            return cpoWrapper.getOperation().isUpdate();"
-        errorLine2="                                             ~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/CompatUtils.java"
-            line="58"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.content.ContentProviderOperation#isDelete`"
-        errorLine1="            return cpoWrapper.getOperation().isDelete();"
-        errorLine2="                                             ~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/CompatUtils.java"
-            line="68"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.content.ContentProviderOperation#isAssertQuery`"
-        errorLine1="            return cpoWrapper.getOperation().isAssertQuery();"
-        errorLine2="                                             ~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/CompatUtils.java"
-            line="77"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="                MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/interactions/ContactDeletionInteraction.java"
-            line="360"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.widget.QuickContactBadge#setPrioritizedMimeType`"
-        errorLine1="            quickContact.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/list/ContactEntryListAdapter.java"
-            line="721"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="            MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/ContactSaveService.java"
-            line="1221"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="            MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/list/DefaultContactBrowseListFragment.java"
-            line="1129"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level S (current min is 21): `android.provider.ContactsContract.SimContacts#getSimAccounts`"
-        errorLine1="                    ContactsContract.SimContacts.getSimAccounts("
-        errorLine2="                                                 ~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java"
-            line="74"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level S (current min is 21): `android.provider.ContactsContract.SimAccount#getAccountType`"
-        errorLine1="                        simAccount.getAccountType())) {"
-        errorLine2="                                   ~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/util/DeviceLocalAccountTypeFactory.java"
-            line="77"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 24 (current min is 21): `android.provider.ContactsContract.Directory#ENTERPRISE_CONTENT_URI`"
-        errorLine1="    public static final Uri ENTERPRISE_CONTENT_URI = Directory.ENTERPRISE_CONTENT_URI;"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/DirectorySdkCompat.java"
-            line="26"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="                MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/preference/DisplayOptionsPreferenceFragment.java"
-            line="436"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 28 (current min is 21): `android.content.pm.PackageInfo#getLongVersionCode`"
-        errorLine1="                sCachedVersionCode = Long.toString(info.getLongVersionCode());"
-        errorLine2="                                                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/util/HelpUtils.java"
-            line="125"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="                    MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/interactions/ImportDialogFragment.java"
-            line="178"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="                    MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/interactions/ImportDialogFragment.java"
-            line="187"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 26 (current min is 21): `android.graphics.drawable.AdaptiveIconDrawable#getExtraInsetFraction`"
-        errorLine1="        return 1 / (1 + (2 * AdaptiveIconDrawable.getExtraInsetFraction()));"
-        errorLine2="                                                  ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/lettertiles/LetterTileDrawable.java"
-            line="293"
-            column="51"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="            MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/list/MultiSelectContactsListFragment.java"
-            line="357"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="            MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/list/MultiSelectContactsListFragment.java"
-            line="362"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#getIcon`"
-        errorLine1="            return phoneAccount.getIcon();"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/PhoneAccountCompat.java"
-            line="45"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.graphics.drawable.Icon#loadDrawable`"
-        errorLine1="        return accountIcon.loadDrawable(context);"
-        errorLine2="                           ~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/PhoneAccountCompat.java"
-            line="84"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 23 (current min is 21): `android.telecom.PhoneAccount`"
-        errorLine1="            return (Drawable) PhoneAccount.class.getMethod(&quot;createIconDrawable&quot;, Context.class)"
-        errorLine2="                              ~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/PhoneAccountCompat.java"
-            line="91"
-            column="31"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telephony.PhoneNumberUtils#createTtsSpannable`"
-        errorLine1="            return PhoneNumberUtils.createTtsSpannable(phoneNumber);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/PhoneNumberUtilsCompat.java"
-            line="85"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telephony.PhoneNumberUtils#createTtsSpan`"
-        errorLine1="            return PhoneNumberUtils.createTtsSpan(phoneNumber);"
-        errorLine2="                                    ~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/PhoneNumberUtilsCompat.java"
-            line="93"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telephony.PhoneNumberUtils#addTtsSpan`"
-        errorLine1="            PhoneNumberUtils.addTtsSpan(s, start, endExclusive);"
-        errorLine2="                             ~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/PhoneNumberUtilsCompat.java"
-            line="118"
-            column="30"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 23 (current min is 21): `android.provider.ContactsContract.ProviderStatus#CONTENT_URI`"
-        errorLine1="                .registerContentObserver(ProviderStatus.CONTENT_URI, false, this);"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/list/ProviderStatusWatcher.java"
-            line="132"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 23 (current min is 21): `android.provider.ContactsContract.ProviderStatus#CONTENT_URI`"
-        errorLine1="                Cursor cursor = mContext.getContentResolver().query(ProviderStatus.CONTENT_URI,"
-        errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/list/ProviderStatusWatcher.java"
-            line="219"
-            column="69"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Field requires API level 23 (current min is 21): `android.provider.ContactsContract.ProviderStatus#CONTENT_URI`"
-        errorLine1="        if (!ProviderStatus.CONTENT_URI.equals(uri)) return;"
-        errorLine2="             ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/list/ProviderStatusWatcher.java"
-            line="270"
-            column="14"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 22 (current min is 21): `android.app.Activity#getReferrer`"
-        errorLine1="        if (mReferrer == null &amp;&amp; CompatUtils.isLollipopMr1Compatible() &amp;&amp; getReferrer() != null) {"
-        errorLine2="                                                                          ~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/quickcontact/QuickContactActivity.java"
-            line="654"
-            column="75"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 22 (current min is 21): `android.app.Activity#getReferrer`"
-        errorLine1="            mReferrer = getReferrer().getAuthority();"
-        errorLine2="                        ~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/quickcontact/QuickContactActivity.java"
-            line="655"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 24 (current min is 21): `new android.icu.text.MessageFormat`"
-        errorLine1="        MessageFormat msgFormat = new MessageFormat("
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/quickcontact/QuickContactActivity.java"
-            line="2226"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Class requires API level 23 (current min is 21): `android.telecom.PhoneAccountHandle`"
-        errorLine1="                        (PhoneAccountHandle) resultData.getParcelable("
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/widget/SelectPhoneAccountDialogFragment.java"
-            line="130"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Cast from `PhoneAccountHandle` to `Parcelable` requires API level 23 (current min is 21)"
-        errorLine1="                        selectedAccountHandle);"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/widget/SelectPhoneAccountDialogFragment.java"
-            line="171"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.TelecomManager#getPhoneAccount`"
-        errorLine1="            PhoneAccount account = mTelecomManager.getPhoneAccount(accountHandle);"
-        errorLine2="                                                   ~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/widget/SelectPhoneAccountDialogFragment.java"
-            line="247"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#getLabel`"
-        errorLine1="            holder.labelTextView.setText(account.getLabel());"
-        errorLine2="                                                 ~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/widget/SelectPhoneAccountDialogFragment.java"
-            line="251"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#getAddress`"
-        errorLine1="            if (account.getAddress() == null ||"
-        errorLine2="                        ~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/widget/SelectPhoneAccountDialogFragment.java"
-            line="252"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#getAddress`"
-        errorLine1="                    TextUtils.isEmpty(account.getAddress().getSchemeSpecificPart())) {"
-        errorLine2="                                              ~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/widget/SelectPhoneAccountDialogFragment.java"
-            line="253"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.PhoneAccount#getAddress`"
-        errorLine1="                                account.getAddress().getSchemeSpecificPart()));"
-        errorLine2="                                        ~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/widget/SelectPhoneAccountDialogFragment.java"
-            line="259"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 30 (current min is 21): `android.telephony.TelephonyManager#getSubscriptionId`"
-        errorLine1="            return new SimCard(telephony.getSimSerialNumber(), telephony.getSubscriptionId(),"
-        errorLine2="                                                                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/model/SimCard.java"
-            line="244"
-            column="74"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level S (current min is 21): `android.provider.SimPhonebookContract.SimRecords#getContentUri`"
-        errorLine1="                SimRecords.getContentUri("
-        errorLine2="                           ~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/database/SimContactDaoImpl.java"
-            line="130"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 26 (current min is 21): `android.content.ContentResolver#query`"
-        errorLine1="            final Cursor cursor = mResolver.query(uri,"
-        errorLine2="                                            ~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/database/SimContactDaoImpl.java"
-            line="265"
-            column="45"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telecom.TelecomManager#placeCall`"
-        errorLine1="            telecomManager.placeCall(intent.getData(), intent.getExtras());"
-        errorLine2="                           ~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java"
-            line="43"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 22 (current min is 21): `android.telephony.TelephonyManager#isVoiceCapable`"
-        errorLine1="            return telephonyManager.isVoiceCapable();"
-        errorLine2="                                    ~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/TelephonyManagerCompat.java"
-            line="49"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telephony.TelephonyManager#getPhoneCount`"
-        errorLine1="            return telephonyManager.getPhoneCount();"
-        errorLine2="                                    ~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/TelephonyManagerCompat.java"
-            line="71"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telephony.TelephonyManager#getDeviceId`"
-        errorLine1="            return telephonyManager.getDeviceId(slotId);"
-        errorLine2="                                    ~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/TelephonyManagerCompat.java"
-            line="93"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telephony.TelephonyManager#isTtyModeSupported`"
-        errorLine1="            return telephonyManager.isTtyModeSupported();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/TelephonyManagerCompat.java"
-            line="111"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.telephony.TelephonyManager#isHearingAidCompatibilitySupported`"
-        errorLine1="            return telephonyManager.isHearingAidCompatibilitySupported();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/TelephonyManagerCompat.java"
-            line="131"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="Call requires API level 23 (current min is 21): `android.provider.Telephony.Threads#getOrCreateThreadId`"
-        errorLine1="            return Telephony.Threads.getOrCreateThreadId(context, recipient);"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/src/com/android/contacts/compat/TelephonyThreadsCompat.java"
-            line="51"
-            column="38"/>
-    </issue>
-
-    <issue
-        id="NewApi"
-        message="`android:contentInsetStartWithNavigation` requires API level 24 (current min is 21)"
-        errorLine1="        &lt;item name=&quot;android:contentInsetStartWithNavigation&quot;>72dp&lt;/item>"
-        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="packages/apps/Contacts/res/values/styles.xml"
-            line="215"
-            column="15"/>
-    </issue>
-
-</issues>
diff --git a/res/layout/contact_editor_fields.xml b/res/layout/contact_editor_fields.xml
index b9bda16..dd4e499 100644
--- a/res/layout/contact_editor_fields.xml
+++ b/res/layout/contact_editor_fields.xml
@@ -48,4 +48,29 @@
 
     </LinearLayout>
 
+    <LinearLayout
+        android:id="@+id/legacy_fields_container"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:orientation="vertical"
+        android:visibility="gone">
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAllCaps="true"
+            android:layout_marginStart="16dp"
+            android:textAppearance="?attr/textAppearanceOverline"
+            android:singleLine="true"
+            android:layout_marginBottom="24dp"
+            android:textSize="11sp"
+            android:text="@string/editor_uneditable_section_title" />
+
+        <LinearLayout
+            android:id="@+id/legacy_section_views"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical" />
+    </LinearLayout>
+
 </merge>
\ No newline at end of file
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 a301de0..8536460 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -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 07cdcf9..853780f 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 b56493c..52e02b6 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/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-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 15af10c..1bfb772 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/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-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 876ca57..569615c 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 dd2e50e..06abdbc 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 039dfa5..989fca1 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -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 5b04626..3155c91 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/ids.xml b/res/values/ids.xml
index a4b8b4b..f22eaba 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -44,6 +44,9 @@
     <!-- An ID to be used for contents of a custom dialog so that its state be preserved -->
     <item type="id" name="custom_dialog_content" />
 
+    <!-- An ID to be used for tagging text for copy in legacy fields. -->
+    <item name="text_to_copy" type="id"/>
+
     <!-- Menu group ID for settings and help & feedback  -->
     <item type="id" name="nav_misc" />
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d87be0b..fc24b10 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -425,6 +425,9 @@
     <!-- The button to add an label field to a contact in the Raw Contact Editor [CHAR LIMIT=15] -->
     <string name="group_edit_field_hint_text">Label</string>
 
+    <!-- Editor section title to show below shown editor fields are not editable. Users are only allowed to delete them. [CHAR LIMIT=NONE] -->
+    <string name="editor_uneditable_section_title">Can’t update this info</string>
+
     <!-- Content description for a cancel button. [CHAR LIMIT=NONE] -->
     <string name="cancel_button_content_description">Cancel</string>
 
@@ -1549,4 +1552,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/editor/Editor.java b/src/com/android/contacts/editor/Editor.java
index c02816a..6ab06bd 100644
--- a/src/com/android/contacts/editor/Editor.java
+++ b/src/com/android/contacts/editor/Editor.java
@@ -114,4 +114,10 @@
      */
     public void editNewlyAddedField();
 
+    /**
+     * Marks the Editor field as a legacy field. Legacy fields are deprecated MIME types
+     * which are not fully supported in the editor.
+     * Adding or editing legacy field are not supported.
+     */
+    void setLegacyField(boolean isLegacyField);
 }
diff --git a/src/com/android/contacts/editor/EditorUiUtils.java b/src/com/android/contacts/editor/EditorUiUtils.java
index 35f107e..3dac5bb 100644
--- a/src/com/android/contacts/editor/EditorUiUtils.java
+++ b/src/com/android/contacts/editor/EditorUiUtils.java
@@ -57,6 +57,7 @@
 import com.android.contacts.util.MaterialColorMapUtils.MaterialPalette;
 import com.android.contacts.widget.QuickContactImageView;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 
 import java.io.FileNotFoundException;
@@ -95,6 +96,9 @@
         mimetypeLayoutMap.put(Event.CONTENT_ITEM_TYPE, R.layout.event_field_editor_view);
     }
 
+    public static final ImmutableList<String> LEGACY_MIME_TYPE =
+        ImmutableList.of(Im.CONTENT_ITEM_TYPE, SipAddress.CONTENT_ITEM_TYPE);
+
     /**
      * Fetches a layout for a given mimetype.
      *
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index 5d49064..28eeaf2 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -48,6 +48,13 @@
  */
 public class KindSectionView extends LinearLayout {
 
+    /** Callbacks for hosts of {@link KindSectionView}s. */
+    public interface Listener {
+
+        /** Invoked when all fields in a legacy {@link KindSectionView} are removed. */
+        void onEmptyLegacyKindSectionView();
+    }
+
     /**
      * Marks a name as super primary when it is changed.
      *
@@ -58,21 +65,21 @@
 
         private final ValuesDelta mValuesDelta;
         private final long mRawContactId;
-        private final RawContactEditorView.Listener mListener;
+        private final RawContactEditorView.Listener mEditorViewListener;
 
         public StructuredNameEditorListener(ValuesDelta valuesDelta, long rawContactId,
-                RawContactEditorView.Listener listener) {
+            RawContactEditorView.Listener editorViewListener) {
             mValuesDelta = valuesDelta;
             mRawContactId = rawContactId;
-            mListener = listener;
+            mEditorViewListener = editorViewListener;
         }
 
         @Override
         public void onRequest(int request) {
             if (request == Editor.EditorListener.FIELD_CHANGED) {
                 mValuesDelta.setSuperPrimary(true);
-                if (mListener != null) {
-                    mListener.onNameFieldChanged(mRawContactId, mValuesDelta);
+                if (mEditorViewListener != null) {
+                    mEditorViewListener.onNameFieldChanged(mRawContactId, mValuesDelta);
                 }
             } else if (request == Editor.EditorListener.FIELD_TURNED_EMPTY) {
                 mValuesDelta.setSuperPrimary(false);
@@ -119,6 +126,11 @@
 
         @Override
         public void onDeleteRequested(Editor editor) {
+            if (mIsLegacyField && mEditors.getChildCount() == 1) {
+                editor.deleteEditor();
+                mListener.onEmptyLegacyKindSectionView();
+                return;
+            }
             if (mShowOneEmptyEditor && mEditors.getChildCount() == 1) {
                 // If there is only 1 editor in the section, then don't allow the user to
                 // delete it.  Just clear the fields in the editor.
@@ -152,11 +164,13 @@
 
     private KindSectionData mKindSectionData;
     private ViewIdGenerator mViewIdGenerator;
-    private RawContactEditorView.Listener mListener;
+    private RawContactEditorView.Listener mEditorViewListener;
+    private Listener mListener;
 
     private boolean mIsUserProfile;
     private boolean mShowOneEmptyEditor = false;
     private boolean mHideIfEmpty = true;
+    private boolean mIsLegacyField = false;
 
     private LayoutInflater mLayoutInflater;
     private ViewGroup mEditors;
@@ -227,6 +241,13 @@
     }
 
     /**
+     * When {@code isLegacyField} is true, prevent users from editing the field.
+     */
+    void setLegacyField(boolean isLegacyField) {
+        this.mIsLegacyField = isLegacyField;
+    }
+
+    /**
      * Whether this is a name kind section view and all name fields (structured, phonetic,
      * and nicknames) are empty.
      */
@@ -277,10 +298,14 @@
      * Empty name editors are never added and at least one structured name editor is always
      * displayed, even if it is empty.
      */
-    public void setState(KindSectionData kindSectionData,
-            ViewIdGenerator viewIdGenerator, RawContactEditorView.Listener listener) {
+    public void setState(
+        KindSectionData kindSectionData,
+        ViewIdGenerator viewIdGenerator,
+        RawContactEditorView.Listener editorViewListener,
+        Listener listener) {
         mKindSectionData = kindSectionData;
         mViewIdGenerator = viewIdGenerator;
+        mEditorViewListener = editorViewListener;
         mListener = listener;
 
         // Set the icon using the DataKind
@@ -292,6 +317,9 @@
                 mIcon.setContentDescription(dataKind.titleRes == -1 || dataKind.titleRes == 0
                         ? "" : getResources().getString(dataKind.titleRes));
             }
+            if (mIsLegacyField) {
+                mIcon.setEnabled(false);
+            }
         }
 
         rebuildFromState();
@@ -359,7 +387,7 @@
         if (!mIsUserProfile) {
             // Don't set super primary for the me contact
             nameView.setEditorListener(new StructuredNameEditorListener(
-                    nameValuesDelta, rawContactDelta.getRawContactId(), mListener));
+                    nameValuesDelta, rawContactDelta.getRawContactId(), mEditorViewListener));
         }
         nameView.setDeletable(false);
         nameView.setValues(accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_NAME),
@@ -414,6 +442,7 @@
         view.setEnabled(isEnabled());
         if (view instanceof Editor) {
             final Editor editor = (Editor) view;
+            editor.setLegacyField(mIsLegacyField);
             editor.setDeletable(true);
             editor.setEditorListener(editorListener);
             editor.setValues(dataKind, valuesDelta, rawContactDelta, !dataKind.editable,
@@ -593,4 +622,8 @@
         }
         return emptyEditors;
     }
+
+    public boolean isEditorEmpty() {
+        return mKindSectionData.getVisibleValuesDeltas().isEmpty();
+    }
 }
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index df4c5f9..3df3222 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -81,6 +81,8 @@
     private boolean mIsDeletable = true;
     private boolean mIsAttachedToWindow;
 
+    protected boolean mIsLegacyField;
+
     private EditType mType;
 
     private ViewIdGenerator mViewIdGenerator;
@@ -264,8 +266,8 @@
     @Override
     public void setEnabled(boolean enabled) {
         super.setEnabled(enabled);
-        mLabel.setEnabled(!mReadOnly && enabled);
-        mDelete.setEnabled(!mReadOnly && enabled);
+        mLabel.setEnabled(!mReadOnly && enabled && !mIsLegacyField);
+        mDelete.setEnabled((!mReadOnly && enabled) || mIsLegacyField);
     }
 
     public Spinner getLabel() {
@@ -342,6 +344,10 @@
         return "";
     }
 
+    public void setLegacyField(boolean mIsLegacyField) {
+        this.mIsLegacyField = mIsLegacyField;
+    }
+
     protected void saveValue(String column, String value) {
         mEntry.put(column, value);
     }
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 19da5bc..755800a 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -50,6 +50,7 @@
 import android.widget.ListPopupWindow;
 import android.widget.TextView;
 
+import com.android.contacts.editor.KindSectionView;
 import com.android.contacts.GeoUtil;
 import com.android.contacts.R;
 import com.android.contacts.compat.PhoneNumberUtilsCompat;
@@ -80,7 +81,8 @@
 /**
  * View to display information from multiple {@link RawContactDelta}s grouped together.
  */
-public class RawContactEditorView extends LinearLayout implements View.OnClickListener {
+public class RawContactEditorView extends LinearLayout implements View.OnClickListener,
+    KindSectionView.Listener {
 
     static final String TAG = "RawContactEditorView";
 
@@ -218,6 +220,8 @@
 
     private PhotoEditorView mPhotoView;
     private ViewGroup mKindSectionViews;
+    private LinearLayout mLegacySectionLinearLayout;
+    private ViewGroup mLegacyKindSectionViews;
     private Map<String, KindSectionView> mKindSectionViewMap = new HashMap<>();
     private View mMoreFields;
 
@@ -259,6 +263,8 @@
 
         mPhotoView = (PhotoEditorView) findViewById(R.id.photo_editor);
         mKindSectionViews = (LinearLayout) findViewById(R.id.kind_section_views);
+        mLegacySectionLinearLayout = (LinearLayout) findViewById(R.id.legacy_fields_container);
+        mLegacyKindSectionViews = (LinearLayout) findViewById(R.id.legacy_section_views);
         mMoreFields = findViewById(R.id.more_fields);
         mMoreFields.setOnClickListener(this);
     }
@@ -277,6 +283,10 @@
         for (int i = 0; i < childCount; i++) {
             mKindSectionViews.getChildAt(i).setEnabled(enabled);
         }
+        final int legacyChildCount = mLegacyKindSectionViews.getChildCount();
+        for (int i = 0; i < legacyChildCount; i++) {
+            mLegacyKindSectionViews.getChildAt(i).setEnabled(false);
+        }
     }
 
     @Override
@@ -447,6 +457,8 @@
 
         mKindSectionViewMap.clear();
         mKindSectionViews.removeAllViews();
+        mLegacySectionLinearLayout.setVisibility(View.GONE);
+        mLegacyKindSectionViews.removeAllViews();
         mMoreFields.setVisibility(View.VISIBLE);
 
         mMaterialPalette = materialPalette;
@@ -531,7 +543,7 @@
         addKindSectionViews();
 
         mMoreFields.setVisibility(hasMoreFields() ? View.VISIBLE : View.GONE);
-
+        addLegacyKindSectionViews();
         if (mIsExpanded) showAllFields();
     }
 
@@ -874,6 +886,9 @@
         int i = -1;
 
         for (String mimeType : mSortedMimetypes) {
+            if(EditorUiUtils.LEGACY_MIME_TYPE.contains(mimeType)) {
+                continue;
+            }
             i++;
             // Ignore mime types that we've already handled
             if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
@@ -910,7 +925,7 @@
         // they will be the only types you add new values to initially for new contacts
         kindSectionView.setShowOneEmptyEditor(true);
 
-        kindSectionView.setState(kindSectionData, mViewIdGenerator, mListener);
+        kindSectionView.setState(kindSectionData, mViewIdGenerator, mListener, this);
 
         return kindSectionView;
     }
@@ -938,6 +953,55 @@
         return false;
     }
 
+    private void addLegacyKindSectionViews() {
+        boolean hasLegacyData = false;
+        for (String mimeType : EditorUiUtils.LEGACY_MIME_TYPE) {
+
+            KindSectionData kindSectionData = mKindSectionDataMap.get(mimeType);
+            if (kindSectionData != null && !kindSectionData.getVisibleValuesDeltas().isEmpty()) {
+                hasLegacyData = true;
+                KindSectionView kindSectionView =
+                    inflateLegacyKindSectionView(mKindSectionViews, kindSectionData);
+                mLegacyKindSectionViews.addView(kindSectionView);
+
+                // Keep a pointer to the KindSectionView for each mimeType
+                mKindSectionViewMap.put(mimeType, kindSectionView);
+            }
+        }
+
+        if (hasLegacyData) {
+            mLegacySectionLinearLayout.setVisibility(View.VISIBLE);
+        }
+    }
+
+    private KindSectionView inflateLegacyKindSectionView(
+        ViewGroup viewGroup, KindSectionData kindSectionData) {
+        KindSectionView kindSectionView =
+            (KindSectionView)
+                mLayoutInflater.inflate(
+                    R.layout.item_kind_section, viewGroup, /* attachToRoot =*/ false);
+        kindSectionView.setLegacyField(true);
+
+        kindSectionView.setState(kindSectionData, mViewIdGenerator, mListener, this);
+
+        return kindSectionView;
+    }
+
+    @Override
+    public void onEmptyLegacyKindSectionView() {
+        for (int i = mLegacyKindSectionViews.getChildCount() - 1; i >= 0; i--) {
+            View childView = mLegacyKindSectionViews.getChildAt(i);
+            if (childView instanceof KindSectionView
+                && ((KindSectionView) childView).isEditorEmpty()) {
+                mLegacyKindSectionViews.removeViewAt(i);
+            }
+        }
+
+        if (mLegacyKindSectionViews.getChildCount() == 0) {
+            mLegacySectionLinearLayout.setVisibility(View.GONE);
+        }
+    }
+
     private static void wlog(String message) {
         if (Log.isLoggable(TAG, Log.WARN)) {
             Log.w(TAG, message);
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index 28fe87f..d7f9545 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -22,6 +22,8 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Im;
+import android.provider.ContactsContract.CommonDataKinds.SipAddress;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.text.Editable;
 import android.text.InputType;
@@ -49,6 +51,7 @@
 import com.android.contacts.model.account.AccountType.EditField;
 import com.android.contacts.model.dataitem.DataKind;
 import com.android.contacts.util.PhoneNumberFormatter;
+import com.android.contacts.ClipboardUtils;
 
 /**
  * Simple editor that handles labels and any {@link EditField} defined for the
@@ -57,7 +60,6 @@
  */
 public class TextFieldsEditorView extends LabeledEditorView {
     private static final String TAG = TextFieldsEditorView.class.getSimpleName();
-
     private EditText[] mFieldEditTexts = null;
     private ViewGroup mFields = null;
     protected View mExpansionViewContainer;
@@ -75,6 +77,12 @@
     private String mFixedDisplayName = "";
     private boolean needInputInitialize;
 
+    private final OnLongClickListener mOnLongClickListener =
+        v -> {
+            ClipboardUtils.copyText(
+                getContext(), /* label= */ null, (CharSequence) v.getTag(R.id.text_to_copy), true);
+            return true;
+        };
 
     public TextFieldsEditorView(Context context) {
         super(context);
@@ -164,7 +172,15 @@
 
         if (mFieldEditTexts != null) {
             for (int index = 0; index < mFieldEditTexts.length; index++) {
-                mFieldEditTexts[index].setEnabled(!isReadOnly() && enabled);
+                mFieldEditTexts[index].setEnabled(!isReadOnly() && enabled && !mIsLegacyField);
+                if (mIsLegacyField) {
+                    mFieldEditTexts[index].setFocusable(false);
+                    mFieldEditTexts[index].setClickable(false);
+                    mFieldEditTexts[index].setLongClickable(false);
+                }
+            }
+            if (mIsLegacyField && mFieldEditTexts.length > 0) {
+                setOnLongClickListenerOnContainer();
             }
         }
         if (mExpansionView != null) {
@@ -172,6 +188,18 @@
         }
     }
 
+    /**
+     * Attaches OnLongClickLister to fields LinearLayout that allow user copy the EditText text on
+     * long press.
+     */
+    private void setOnLongClickListenerOnContainer() {
+      mFields.setFocusable(true);
+      mFields.setLongClickable(true);
+      // Current legacy mimetypes support exactly 1 field
+      mFields.setTag(R.id.text_to_copy, mFieldEditTexts[0].getText().toString());
+      mFields.setOnLongClickListener(mOnLongClickListener);
+    }
+
     private OnFocusChangeListener mTextFocusChangeListener = new OnFocusChangeListener() {
         @Override
         public void onFocusChange(View v, boolean hasFocus) {
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;