Import translations. DO NOT MERGE
am: ebe66178c4  -s ours

Change-Id: I47216649789090a91a588a5130c64b4b4c231f65
diff --git a/proguard.flags b/proguard.flags
index 357336b..4e0c310 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -3,6 +3,6 @@
 -keep class com.android.server.telecom.TelecomSystem {
   *;
 }
--keep class com.android.server.telecom.Log {
+-keep class android.telecom.Log {
   *;
 }
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 2109cef..3984a5d 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Oproepbestuur"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Foonoproepbestuur"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Bel"</string>
     <string name="unknown" msgid="6878797917991465859">"Onbekend"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Gemiste oproep"</string>
@@ -28,7 +28,7 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"Boodskap"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Oproep stilgemaak."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Luidsprekerfoon geaktiveer."</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Kan nie nou praat nie. Hoe\'s dit?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Kan nie nou praat nie. Wat\'s nuus?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Ek bel jou nou-nou terug."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ek bel jou later."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan nie nou praat nie. Bel my later?"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Vermiste stemboodskapnommer"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Geen stemboodskapnommer is op die SIM-kaart gestoor nie."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Voeg nommer by"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Maak <xliff:g id="NEW_APP">%s</xliff:g> jou verstek-Foon-program?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Stel verstek"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Kanselleer"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> sal oproepe kan maak en alle aspekte daarvan beheer. Net programme wat jy vertrou, moet as die verstek-Foon-program gestel word."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Geblokkeerde nommers"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Jy sal nie oproepe of boodskappe vanaf geblokkeerde nommers ontvang nie."</string>
-    <string name="block_number" msgid="1101252256321306179">"Voeg \'n nommer by"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Deblokkeer <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Deblokkeer"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokkeer oproepe en SMS\'e vanaf"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Foonnommer"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokkeer"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Net die toesteleienaar kan geblokkeerde nommers bekyk en bestuur."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Deblokkeer"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokkering is tydelik af"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Nadat jy \'n noodnommer gebel het of \'n boodskap daarheen gestuur het, sal blokkering afgeskakel word sodat nooddienste jou kan kontak."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Heraktiveer nou"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> geblokkeer"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> is gedeblokkeer"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Kan nie noodgevalnommer blokkeer nie."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> is reeds geblokkeer."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Gebruik tans die persoonlike beller om die oproep te maak"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Verander verstekbellerprogram?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Gebruik <xliff:g id="NEW_APP">%1$s</xliff:g> eerder as <xliff:g id="CURRENT_APP">%2$s</xliff:g> as jou verstekbellerprogram?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Gebruik <xliff:g id="NEW_APP">%s</xliff:g> as jou verstekbellerprogram?"</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 41f8b2d..dbd4c30 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"የጥሪ አስተዳደር"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"የስልክ ጥሪ አስተዳደር"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ስልክ"</string>
     <string name="unknown" msgid="6878797917991465859">"ያልታወቀ"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"ያመለጠጥሪ"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"የድምፅመልዕክት ቁጥርአመለጠ"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"በSIM ካርዱ ላይምንም የድምፅመልዕክት ቁጥር አልከተቀመጠም።"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"ቁጥር አክል"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> የስልክዎ ነባሪ መተግበሪያ ይደረግ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ነባሪ አዘጋጅ"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"ይቅር"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ጥሪዎች ማድረግ እና ሁሉንም የጥሪ ገጽታዎች መቆጣጠር ይችላል። ነባሪ መተግበሪያ መደረግ ያለባቸው እርስዎ የሚያምኗቸው መተግበሪያዎች ብቻ መሆን አለባቸው።"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"የታገዱ ቁጥሮች"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"ከታገዱ ቁጥሮች ጥሪዎች ወይም ጽሑፎች አይቀበሉም።"</string>
-    <string name="block_number" msgid="1101252256321306179">"ቁጥር ያክሉ"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"የ<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> እገዳ ይነሳ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"እገዳውን አንሳ"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ከሚከተለው የሚመጡ ጥሪዎችን እና ጽሑፎችን አግድ፦"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"የስልክ ቁጥር"</string>
-    <string name="block_button" msgid="8822290682524373357">"አግድ"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"የመሣሪያው ባለቤት ብቻ ነው የታገዱ ቁጥሮችን ማየት እና ማስተዳደር የሚችለው።"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"እገዳውን አንሳ"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ማገድ ለጊዜው ጠፍቷል"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"የድንገተኛ አደጋ ቁጥር ከደወሉ ወይ ከጻፉ በኋላ፣ የድንገተኛ አደጋ አገልግሎቶች እርስዎን መገናኘት እንዲሚችል ለማረጋገጥ ማገጃ ጠፍቷል።"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"አሁን እንደገና-ያንቁ"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ታግዷል"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> እገዳው ተነስቷል"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"አስቸኳይ ጊዜ ቁጥር ማገድ አልቻለም።"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ቀድሞውኑ ታግዷል።"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"ጥሪውን ለማድረግ የግል መደወያውን መጠቀም"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ነባሪ መደወያ መተግበሪያ ይለወጥ?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="NEW_APP">%1$s</xliff:g>ን በ<xliff:g id="CURRENT_APP">%2$s</xliff:g> ምትክ እንደ የእርስዎ ነባሪ መደወያ መተግበሪያ ይጠቀም?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g>ን እንደ የእርስዎ ነባሪ መደወያ መተግበሪያ ይጠቀም?"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 8e3abbe..0ea39f5 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"إدارة المكالمات"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"إدارة المكالمات الهاتفية"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"الهاتف"</string>
     <string name="unknown" msgid="6878797917991465859">"غير معروف"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"مكالمة فائتة"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"رقم البريد الصوتي مفقود"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"‏لم يتم تخزين رقم بريد صوتي على شريحة SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"إضافة رقم"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"هل تريد تعيين <xliff:g id="NEW_APP">%s</xliff:g> باعتباره تطبيق الهاتف الافتراضي؟"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"تعيين كافتراضي"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"إلغاء"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"سيتمكن <xliff:g id="NEW_APP">%s</xliff:g> من إجراء المكالمات والتحكم في كل جوانبها. يمكن فقط تعيين التطبيقات التي تثق بها باعتبارها تطبيق الهاتف الافتراضي."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"الأرقام المحظورة"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"لن تتلقى المكالمات أو المراسلات النصية من الأرقام المحظورة."</string>
-    <string name="block_number" msgid="1101252256321306179">"إضافة رقم"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"هل تريد إلغاء حظر <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>؟"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"إلغاء الحظر"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"حظر المكالمات والرسائل النصية من"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"رقم الهاتف"</string>
-    <string name="block_button" msgid="8822290682524373357">"حظر"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"يمكن لمالك الجهاز فقط الاطلاع على الأرقام المحظورة وإدارتها."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"إلغاء الحظر"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"تم إيقاف الحظر مؤقتًا"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"بعد الاتصال الهاتفي أو إرسال رسالة نصية إلى رقم طوارئ، يتم إيقاف تشغيل الحظر لضمان تمكن خدمات الطوارئ من الاتصال بك."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"إعادة تمكين الآن"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> محظور"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"تم إلغاء حظر <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"غير قادر على حظر رقم الطوارئ."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"تم حظر <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> بالفعل."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"يتم استخدام أداة الاتصال الشخصي لإجراء الاتصال"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"هل تريد تغيير التطبيق الافتراضي لبرنامج الاتصال؟"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"هل تريد استخدام <xliff:g id="NEW_APP">%1$s</xliff:g> بدلاً من <xliff:g id="CURRENT_APP">%2$s</xliff:g> تطبيقًا افتراضيًا لبرنامج الاتصال؟"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"هل تريد استخدام <xliff:g id="NEW_APP">%s</xliff:g> تطبيقًا افتراضيًا لبرنامج الاتصال؟"</string>
 </resources>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index 850e121..353de80 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Zənglərin İdarə Olunması"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefon Zənglərin İdarə Olunması"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Naməlum"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Buraxılmış zəng"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Səsli poçt nömrəsi çatışmır"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartda heç bir səsli poçt nömrəsi yoxdur."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Nömrə əlavə edin"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> tətbiüi defolt Phone tətbiqi təyin edilsin?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Defolt ayarlayın"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Ləğv edin"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> bütün zəngləri edə və nəzarətdə saxlaya biləcək. Yalnız güvəndiyiniz tətbiqləri Telefon tətbiqi kimi ayarlaya bilərsiniz."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Bloklanmış nömrələr"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Blok edilmiş nömrədən zənglər və ya mesajlar almayacaqsınız."</string>
-    <string name="block_number" msgid="1101252256321306179">"Nömrə əlavə edin"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> nömrəsi blokdan çıxarılsın?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Blokdan çıxar"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Zəngləri və mətnləri buradan blok edin"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefon nömrəsi"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blok edin"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Yalnız cihaz sahibi blok edilmiş nömrələrə baxa və idarə edə bilər."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Blokdan çıxarın"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Bloklama müvəqqəti olaraq deaktiv edildi"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Fövqəladə nömrəyə zəng etdikdən və ya mesaj yazdıqdan sonra, fövqəladə xidmətlərin Sizinlə əlaqə yarada biləcəyinə əmin olmaq üçün bloklama deaktiv edildi."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"İndi yenidən aktiv edin"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blok edildi"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> blokdan çıxarıldı"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Fövqəladə nömrəni blok etmək mümkün deyil."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> artıq blok edilib."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Zəng etmək üçün şəxsi nömrə yığımı istifadə olunur"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Defolt nömrə yığan tətbiqi dəyişdirilsin?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Defolt nömrə yığan tətbiqi kimi <xliff:g id="CURRENT_APP">%2$s</xliff:g> əvəzinə <xliff:g id="NEW_APP">%1$s</xliff:g> işlədilsin?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Defolt nömrə yığan tətbiqi kimi <xliff:g id="NEW_APP">%s</xliff:g> işlədilsin?"</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index b59c29c..057b025 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Upravljanje pozivima"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Upravljanje telefonskim pozivima"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Nepoznato"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Propušten poziv"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Nedostaje broj za govornu poštu"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Nije uskladišten nijedan broj govorne pošte na SIM kartici."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj broj"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Želite li da <xliff:g id="NEW_APP">%s</xliff:g> postane podrazumevana aplikacija Telefon?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Postavi kao podrazumevano"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Otkaži"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> će moći da upućuje pozive i kontroliše sve njihove aspekte. Aplikaciju podesite kao podrazumevanu za telefoniranje samo ako je smatrate pouzdanom."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokirani brojevi"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Nećete primati pozive ni SMS-ove sa blokiranih brojeva."</string>
-    <string name="block_number" msgid="1101252256321306179">"Dodaj broj"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Želite li da deblokirate <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Deblokiraj"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokirajte pozive i SMS-ove od"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Broj telefona"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokiraj"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Samo vlasnik uređaja može da pregleda blokirane brojeve i upravlja njima."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Deblokirajte"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokiranje je privremeno isključeno"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Kad pozovete broj hitne službe ili na taj broj pošaljete SMS, blokiranje se isključuje da bi hitne službe mogle da vas kontaktiraju."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Ponovo omogući"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je blokiran"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> je deblokiran"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Nije moguće blokirati broj hitne službe."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je već blokiran."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Korišćenje brojčanika iz ličnog profila za upućivanje poziva"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Promeniti podrazumevanu aplikaciju Telefon?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Želite li da koristite aplikaciju <xliff:g id="NEW_APP">%1$s</xliff:g> umesto aplikacije <xliff:g id="CURRENT_APP">%2$s</xliff:g> kao podrazumevanu aplikaciju za pozivanje telefonskih brojeva?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Želite li da koristite aplikaciju <xliff:g id="NEW_APP">%s</xliff:g> kao podrazumevanu aplikaciju za pozivanje telefonskih brojeva?"</string>
 </resources>
diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml
deleted file mode 100644
index 5d44ed9..0000000
--- a/res/values-be-rBY/strings.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2013 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Кіраванне выклікамі"</string>
-    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Патэлефанаваць"</string>
-    <string name="unknown" msgid="6878797917991465859">"Невядомы"</string>
-    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Прапушчаны выклік"</string>
-    <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Прапушчаны выклік па працы"</string>
-    <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Прапушчаныя выклікі"</string>
-    <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Прапушчаных выклікаў: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
-    <string name="notification_missedCallTicker" msgid="504686252427747209">"Прапушчаны выклік ад <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
-    <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Адказаць"</string>
-    <string name="notification_missedCall_message" msgid="3049928912736917988">"Паведамленне"</string>
-    <string name="accessibility_call_muted" msgid="2776111226185342220">"Выклік сцішаны."</string>
-    <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Уключаная гучная сувязь."</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Не магу гаварыць. У чым справа?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Зараз перазваню."</string>
-    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Я патэлефаную пазней."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Не магу гаварыць. Патэлефануеце пазней?"</string>
-    <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Хуткія адказы"</string>
-    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Рэдагаваць хуткія адказы"</string>
-    <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
-    <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Хуткі адказ"</string>
-    <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Паведамленне адпраўлена на нумар <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
-    <string name="enable_account_preference_title" msgid="2021848090086481720">"Уліковыя запісы для выклікаў"</string>
-    <string name="outgoing_call_not_allowed_user_restriction" msgid="6872406278300131364">"Дазволены толькі экстранныя выклікі."</string>
-    <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"Гэта праграма не можа рабіць выходныя выклікі без дазволу тэлефона."</string>
-    <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Каб зрабіць выклік, увядзіце сапраўдны нумар."</string>
-    <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Зараз немагчыма дадаць выклік."</string>
-    <string name="no_vm_number" msgid="4164780423805688336">"Адсутнічае нумар галасавой пошты"</string>
-    <string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM-карце няма нумару галасавой пошты."</string>
-    <string name="add_vm_number_str" msgid="4676479471644687453">"Дадаць нумар"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Зрабіць <xliff:g id="NEW_APP">%s</xliff:g> вашай стандартнай тэлефоннай праграмай?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Задаць як стандартную"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Скасаваць"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> зможа вызначаць і кантраляваць усе аспекты выклікаў. Стандартнымі тэлефоннымі праграмамі павінны прызначацца толькі праграмы, якім вы давяраеце."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Заблакіраваныя нумары"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Вы не будзеце атрымліваць выклікі ці SMS з заблакаваных нумароў."</string>
-    <string name="block_number" msgid="1101252256321306179">"Дадаць нумар"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Разблакіраваць <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Разблакiраваць"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Блакіраваць выклікі і SMS ад"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Нумар тэлефона"</string>
-    <string name="block_button" msgid="8822290682524373357">"Заблакiраваць"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Толькі ўладальнік прылады можа праглядаць блакіраваныя нумары і кіраваць імі."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Разблакiраваць"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Блакіроўка часова адключана"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Пасля тэлефанавання або адпраўкі SMS на экстранны нумар блакіроўка адключаецца, каб аварыйныя службы маглі звязацца з вамі."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Паўторна ўключыць зараз"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> заблакіраваны"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> разблакіраваны"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Немагчыма заблакіраваць нумар экстранай службы."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ужо заблакіраваны."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Выкарыстанне асабістага набіральніка нумара для выканання выкліку"</string>
-</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index bbe04b8..fa451b7 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Управление на обажданията"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Управление на телефонните обаждания"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Телефон"</string>
     <string name="unknown" msgid="6878797917991465859">"Неизвестен номер"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Пропуснато обаждане"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Липсващ номер на гласова поща"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM картата няма съхранен номер за гласова поща."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Добавяне на номер"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> да бъде ли стандартното ви приложение за телефон?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Задаване като стандартно"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Отказ"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ще може да извършва обаждания и да контролира всички аспекти на обажданията. Като стандартно приложение за телефон задавайте само приложения, на които имате доверие."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Блокирани номера"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Няма да получавате обаждания или SMS от блокираните номера."</string>
-    <string name="block_number" msgid="1101252256321306179">"Добавяне на номер"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Искате ли да отблокирате <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Отблокиране"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Блокиране на обажданията и текстовите съобщения от"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Телефонен номер"</string>
-    <string name="block_button" msgid="8822290682524373357">"Блокиране"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Само собственикът на устройството може да преглежда и управлява блокираните номера."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Отблокиране"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Блокирането временно е изключено"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"След като наберете или изпратите SMS до номер за спешни повиквания, блокирането се изключва, за да могат спешните служби да се свържат с вас."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Повторно активиране сега"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> е блокиран"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> е отблокиран"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Номера за спешни случаи не могат да се блокират."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> вече е блокиран."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"За извършване на обаждането се използва личната клавиатура за набиране"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Да се промени ли основното приложение за дайлер?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="NEW_APP">%1$s</xliff:g> да се използва ли вместо <xliff:g id="CURRENT_APP">%2$s</xliff:g> като основното ви приложение за дайлер?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Да се използва ли <xliff:g id="NEW_APP">%s</xliff:g> като основното ви приложение за дайлер?"</string>
 </resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 088ca2a..787c331 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"কল ব্যবস্থাপনা"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ফোন কল ব্যবস্থাপনা"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ফোন"</string>
     <string name="unknown" msgid="6878797917991465859">"অজানা"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"মিসড কল"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"ভয়েসমেল নম্বর অনুপস্থিত"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"সিম কার্ডটিতে কোনো ভয়েসমেল নম্বর সংরক্ষিত নেই৷"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"একটি নম্বর যোগ করুন"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> কে আপনার ডিফল্ট ফোন অ্যাপ বানাতে চান?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ডিফল্ট হিসাবে সেট করুন"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"বাতিল করুন"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> কল করতে এবং কলের সমগ্র বৈশিষ্ট্য নিয়ন্ত্রণ করতে সক্ষম হবে৷ শুধুমাত্র আপনি যে অ্যাপ্সকে বিশ্বাস করেন সেগুলিকেই ডিফল্ট ফোন অ্যাপ হিসাবে সেট করা উচিৎ৷"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"অবরুদ্ধ নম্বরগুলি"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"অবরুদ্ধ নম্বরগুলি থেকে আপনি কল বা এসএমএস পাবেন না।"</string>
-    <string name="block_number" msgid="1101252256321306179">"একটি নম্বর যোগ করুন"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> অবরোধ মুক্ত করবেন?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"অবরোধ মুক্ত করুন"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"এর থেকে কল এবং এসএমএস অবরোধ করুন"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ফোন নম্বর"</string>
-    <string name="block_button" msgid="8822290682524373357">"অবরোধ করুন"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"শুধুমাত্র ডিভাইসের মালিক এই অবরুদ্ধ নম্বরগুলিকে দেখতে এবং পরিচালনা করতে পারেন৷"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"অবরোধ মুক্ত করুন"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"অবরুদ্ধ করা সাময়িকভাবে বন্ধ আছে"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"আপনি কোনো জরুরি নম্বরে ডায়াল করার বা এসএমএস পাঠানোর পরে, জরুরি পরিষেবাগুলি যাতে আপনাকে কল করতে পারে সেই বিষয়টি নিশ্চিত করতে অবরুদ্ধ করার ব্যবস্থাটিকে বন্ধ করা হয়৷"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"এখনই পুনরায় সক্ষম করুন"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> অবরোধ করা হয়েছে"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> অবরোধ মুক্ত করা হয়েছে"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"জরুরি নম্বর অবরোধ করতে অক্ষম৷"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ইতিমধ্যেই অবরোধ করা রয়েছে৷"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"কল করার জন্য ব্যক্তিগত ডায়ালার ব্যবহার করা হচ্ছে"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ডিফল্ট ডায়ালার অ্যাপ পরিবর্তন করবেন?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"আপনার ডিফল্ট ডায়লার অ্যাপ হিসেবে <xliff:g id="CURRENT_APP">%2$s</xliff:g> পরিবর্তে <xliff:g id="NEW_APP">%1$s</xliff:g> ব্যবহার করবেন?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"আপনার ডিফল্ট ডায়লার অ্যাপ হিসেবে <xliff:g id="NEW_APP">%s</xliff:g> ব্যবহার করবেন?"</string>
 </resources>
diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml
deleted file mode 100644
index e1571b3..0000000
--- a/res/values-bs-rBA/strings.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--  Copyright (C) 2013 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Upravljanje pozivima"</string>
-    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
-    <string name="unknown" msgid="6878797917991465859">"Nepoznato"</string>
-    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Propušteni poziv"</string>
-    <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Propušteni poslovni poziv"</string>
-    <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Propušteni pozivi"</string>
-    <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Propušteni pozivi: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
-    <string name="notification_missedCallTicker" msgid="504686252427747209">"Propušteni poziv od kontakta <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
-    <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Povr. poziv"</string>
-    <string name="notification_missedCall_message" msgid="3049928912736917988">"Poruka"</string>
-    <string name="accessibility_call_muted" msgid="2776111226185342220">"Zvuk poziva je isključen."</string>
-    <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Zvučnik je omogućen."</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Ne mogu sada pričati. Šta ima?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Nazvat ću te uskoro."</string>
-    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Nazvat ću te kasnije."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ne mogu pričati. Nazovi kasnije?"</string>
-    <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Brzi odgovori"</string>
-    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Uredi brze odgovore"</string>
-    <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
-    <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Brzi odgovor"</string>
-    <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Poruka poslana na <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
-    <string name="enable_account_preference_title" msgid="2021848090086481720">"Računi za pozivanje"</string>
-    <string name="outgoing_call_not_allowed_user_restriction" msgid="6872406278300131364">"Dozvoljeni su samo hitni pozivi."</string>
-    <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"Ova aplikacija ne može upućivati odlazne pozive bez dozvole za Telefon."</string>
-    <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Da uputite poziv, upišite važeći broj."</string>
-    <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Trenutno nije moguće dodati poziv."</string>
-    <string name="no_vm_number" msgid="4164780423805688336">"Nedostaje broj govorne pošte"</string>
-    <string name="no_vm_number_msg" msgid="1300729501030053828">"Broj govorne pošte nije pohranjen na SIM kartici."</string>
-    <string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj broj"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Postaviti aplikaciju <xliff:g id="NEW_APP">%s</xliff:g> kao zadanu aplikaciju za telefon?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Postavi zadano"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Otkaži"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> će moći upućivati pozive i kontrolirati sve vezano za njih. Zadana aplikacija treba biti samo aplikacija koju smatrate pouzdanom."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokirani brojevi"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Nećete primati pozive i poruke od blokiranih brojeva."</string>
-    <string name="block_number" msgid="1101252256321306179">"Dodaj broj"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Deblokirati <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Deblokiraj"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokiraj pozive i tekstualne poruke od"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Broj telefona"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokiraj"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Samo vlasnik uređaja može pregledati i upravljati blokiranim brojevima."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Deblokiraj"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokiranje je privremeno isključeno"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Nakon što pozovete ili pošaljete poruku na broj za hitne slučajeve, blokiranje se isključuje da bi vas hitna služba mogla kontaktirati."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Ponovo omogući sada"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je blokiran"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> je deblokiran"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Nije moguće blokirati broj za hitne slučajeve."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je već blokiran."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Za upućivanje poziva koristi se lična brojčana tastatura"</string>
-</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 9504895..dc5b73c 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gestió de trucades"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Gestió de trucades telefòniques"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telèfon"</string>
     <string name="unknown" msgid="6878797917991465859">"Desconegut"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Trucada perduda"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Falta el número de la bústia de veu"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"No hi ha cap número de bústia de veu emmagatzemat a la targeta SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Afegeix número"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Vols que <xliff:g id="NEW_APP">%s</xliff:g> sigui l\'aplicació per a mòbils predetermin.?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Defineix com a predeterminat"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancel·la"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> podrà fer les teves trucades i controlar-ne tots els aspectes. Només les aplicacions de confiança s\'han de definir com a l\'aplicació per a mòbils predeterminada."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Números bloquejats"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"No rebràs trucades ni missatges de text dels números bloquejats."</string>
-    <string name="block_number" msgid="1101252256321306179">"Afegeix un número"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Vols desbloquejar el número <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Desbloqueja"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloqueja trucades i missatges de text de"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Número de telèfon"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloqueja"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Només el propietari del dispositiu pot consultar i gestionar els números bloquejats."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Desbloqueja"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"El bloqueig està desactivat temporalment"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Quan marques un número d\'emergència o hi envies un missatge de text, el bloqueig es desactiva per garantir que els serveis d\'emergència puguin contactar amb tu."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Torna a activar ara"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bloquejat"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> desbloquejat"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"No es pot bloquejar el número d\'emergència."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ja està bloquejat."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"S\'està utilitzant el telèfon personal per fer la trucada"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Vols canviar l\'aplicació de marcador predeterminada?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Vols fer servir <xliff:g id="NEW_APP">%1$s</xliff:g> en lloc de <xliff:g id="CURRENT_APP">%2$s</xliff:g> com a aplicació de marcador predeterminada?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Vols fer servir <xliff:g id="NEW_APP">%s</xliff:g> com a aplicació de marcador predeterminada?"</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index ac77aac..dbc7165 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Správa hovorů"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Správa telefonních hovorů"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Neznámý volající"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Zmeškaný hovor"</string>
@@ -31,7 +31,7 @@
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Teď nemůžu telefonovat, o co jde?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Zavolám zpátky."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zavolám později."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nemůžu telefonovat. Zavoláte později?"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nemůžu telefonovat, volejte jindy."</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Rychlé odpovědi"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Upravit rychlé odpovědi"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Chybí číslo hlasové schránky"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Na SIM kartě není uloženo žádné číslo hlasové schránky."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Přidat číslo"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Nastavit <xliff:g id="NEW_APP">%s</xliff:g> jako výchozí aplikaci na telefonování?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Nastavit jako výchozí"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Zrušit"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"Aplikace <xliff:g id="NEW_APP">%s</xliff:g> bude moci uskutečňovat hovory a spravovat všechny jejich aspekty. Jako výchozí aplikaci na telefonování byste měli nastavit jen aplikaci, které věříte."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokovaná čísla"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Ze zablokovaných čísel už nebudete přijímat hovory ani zprávy SMS."</string>
-    <string name="block_number" msgid="1101252256321306179">"Přidat číslo"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Odblokovat číslo <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Odblokovat"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokovat hovory a SMS od odesílatele"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonní číslo"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokovat"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Prohlížet a spravovat blokovaná čísla může pouze vlastník zařízení."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Odblokovat"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokování je dočasně vypnuto"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Když vytočíte nebo pošlete zprávu na číslo tísňové linky, blokování je vypnuto, aby vás pohotovostní služby mohly kontaktovat."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Znovu zapnout"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Číslo <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bylo zablokováno"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Číslo <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> bylo odblokováno"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Číslo tísňové linky se nepodařilo zablokovat."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Číslo <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> už je zablokováno."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Volání se provádí pomocí osobního vytáčení"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Změnit výchozí aplikaci vytáčení?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Chcete aplikaci <xliff:g id="NEW_APP">%1$s</xliff:g> použít jako výchozí aplikaci vytáčení místo aplikace <xliff:g id="CURRENT_APP">%2$s</xliff:g>?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Chcete aplikaci <xliff:g id="NEW_APP">%s</xliff:g> použít jako výchozí aplikaci vytáčení?"</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 48fba35..8b1f7df 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Opkaldsstyring"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Opkaldsstyring"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Opkald"</string>
     <string name="unknown" msgid="6878797917991465859">"Ukendt"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Ubesvarede opkald"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Telefonsvarernummer mangler"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Der er ikke gemt noget telefonsvarernummer på SIM-kortet."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Tilføj nummer"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Vil du gøre <xliff:g id="NEW_APP">%s</xliff:g> til din standardapp til opkald?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Indstil standard"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Annuller"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> kan foretage og administrere alle aspekter af opkald. Du bør kun indstille en app til din standardapp til opkald, hvis du har tillid til den."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokerede telefonnumre"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Du modtager ikke opkald eller sms-beskeder fra blokerede numre."</string>
-    <string name="block_number" msgid="1101252256321306179">"Tilføj et nummer"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Vil du ophæve blokeringen af <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Ophæv blokeringen"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloker opkald og sms-beskeder fra"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonnummer"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloker"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Det er kun ejeren af en enhed, der kan se og administrere blokerede numre."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Ophæv blokering"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokering er midlertidigt slået fra"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Når du har ringet eller sendt en sms-besked til alarmcentralen, bliver blokering slået fra for at sikre, at alarmcentralen kan komme i kontakt med dig."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Genaktiver nu"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blev blokeret"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Blokeringen af <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> blev ophævet"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Nødnummeret kan ikke blokeres."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> er allerede blokeret."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Opkaldet foretages med det personlige opkaldsprogram"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Vil du skifte standardappen til opkald?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Brug <xliff:g id="NEW_APP">%1$s</xliff:g> i stedet for <xliff:g id="CURRENT_APP">%2$s</xliff:g> som din standardapp til opkald?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Brug <xliff:g id="NEW_APP">%s</xliff:g> som din standardapp til opkald?"</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 7993f35..44277c8 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Anrufverwaltung"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Anrufverwaltung"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Unbekannt"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Entgangener Anruf"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Fehlende Mailbox-Nummer"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Auf der SIM-Karte ist keine Mailbox-Nummer gespeichert."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Nummer hinzufügen"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> als Standard-Telefon-App festlegen?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Als Standard festlegen"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Abbrechen"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> wird alle Anruffunktionen steuern. Nur vertrauenswürdige Apps sollten als Standard-Telefon-App festgelegt werden."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blockierte Nummern"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Du erhältst keine Anrufe oder SMS von blockierten Nummern."</string>
-    <string name="block_number" msgid="1101252256321306179">"Nummer hinzufügen"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Blockierung von <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> aufheben?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Blockierung aufheben"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Anrufe und SMS blockieren von"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonnummer"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blockieren"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Nur der Geräteeigentümer kann blockierte Nummern sehen und verwalten."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Blockierung aufheben"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blockierung vorübergehend aus"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Nachdem du eine Notrufnummer gewählt oder per SMS gesendet hast, wird die Blockierung aufgehoben, damit dich die Notfalldienste erreichen können."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Jetzt neu aktivieren"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blockiert"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Blockierung von <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> aufgehoben"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Die Notrufnummer kann nicht blockiert werden."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ist bereits blockiert."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Zum Anrufen wird das eigene Telefon genutzt"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Standard-App für Telefonie ändern?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="NEW_APP">%1$s</xliff:g> statt <xliff:g id="CURRENT_APP">%2$s</xliff:g> als Standard-App für Telefonie verwenden?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> als Standard-App für Telefonie verwenden?"</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 06ee5ab..af41ee4 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Διαχείριση κλήσεων"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Διαχείριση τηλεφωνικών κλήσεων"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Τηλέφωνο"</string>
     <string name="unknown" msgid="6878797917991465859">"Άγνωστος"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Αναπάντητη κλήση"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Λείπει ο αριθμός αυτόματου τηλεφωνητή"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Δεν έχει αποθηκευτεί αριθμός για τον αυτόματο τηλεφωνητή στην κάρτα SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Προσθήκη αριθμού"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Ορισμός <xliff:g id="NEW_APP">%s</xliff:g> ως προεπιλεγμένης εφαρμογής τηλεφώνου;"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Ορισμός ως προεπιλογή"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Ακύρωση"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"Το <xliff:g id="NEW_APP">%s</xliff:g> θα έχει τη δυνατότητα πραγματοποίησης κλήσεων, καθώς και ελέγχου κάθε πτυχής τους. Μόνον κάποια αξιόπιστη εφαρμογή θα πρέπει να ορίζεται ως προεπιλεγμένη."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Αποκλεισμένοι αριθμοί"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Δεν θα λαμβάνετε κλήσεις ή μηνύματα κειμένου από αποκλεισμένους αριθμούς."</string>
-    <string name="block_number" msgid="1101252256321306179">"Προσθήκη αριθμού"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Να καταργηθεί ο αποκλεισμός του αριθμού <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>;"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Κατάργηση αποκλεισμού"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Αποκλεισμός κλήσεων/μηνυμάτων από"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Αριθμός τηλεφώνου"</string>
-    <string name="block_button" msgid="8822290682524373357">"Αποκλεισμός"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Μόνο ο κάτοχος της συσκευής μπορεί να προβάλλει και να διαχειρίζεται αποκλεισμένους αριθμούς."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Κατάργηση αποκλεισμού"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Αποκλεισμός προσωρινά απενεργοποιημένος"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Αφού καλέσετε ή στείλετε μήνυμα κειμένου προς έναν αριθμό έκτακτης ανάγκης, ο αποκλεισμός απενεργοποιείται, προκειμένου να διασφαλιστεί ότι είναι δυνατή η επικοινωνία μαζί σας από τις υπηρεσίες έκτακτης ανάγκης."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Επανενεργοποίηση τώρα"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Ο αριθμός <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> έχει αποκλειστεί"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Καταργήθηκε ο αποκλεισμός του αριθμού <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Δεν είναι δυνατός ο αποκλεισμός του αριθμού εκτάκτου ανάγκης."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Ο αριθμός <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> έχει ήδη αποκλειστεί."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Χρήση του προσωπικού σας προγράμματος κλήσης για την πραγματοποίηση της κλήσης"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Αλλαγή της προεπιλεγμένης εφαρμογής Dialer;"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Χρήση της εφαρμογής <xliff:g id="NEW_APP">%1$s</xliff:g> αντί για την εφαρμογή <xliff:g id="CURRENT_APP">%2$s</xliff:g> ως προεπιλεγμένης εφαρμογής Dialer;"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Χρήση της εφαρμογής <xliff:g id="NEW_APP">%s</xliff:g> ως προεπιλεγμένης εφαρμογής Dialer;"</string>
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 0d01605..a7d9e24 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -16,8 +16,8 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Call Management"</string>
-    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Phone"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Phone Call Management"</string>
+    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telephone"</string>
     <string name="unknown" msgid="6878797917991465859">"Unknown"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Missed call"</string>
     <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Missed work call"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Missing voicemail number"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"No voicemail number is stored on the SIM card."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Add number"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Make <xliff:g id="NEW_APP">%s</xliff:g> your default Phone app?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Set Default"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancel"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> will be able to place and control all aspects of calls. Only apps that you trust should be set as the default Phone app."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blocked numbers"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"You won\'t receive calls or texts from blocked numbers."</string>
-    <string name="block_number" msgid="1101252256321306179">"Add a number"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Unblock <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Unblock"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Block calls and texts from"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Phone number"</string>
-    <string name="block_button" msgid="8822290682524373357">"Block"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Only the device owner can view and manage blocked numbers."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Unblock"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blocking temporarily off"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"When you dial or text an emergency number, blocking is turned off to ensure that emergency services can contact you."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Re-enable now"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blocked"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> unblocked"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Unable to block emergency number."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> is already blocked."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Using the personal dialler to make the call"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Change default Dialer app?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Use <xliff:g id="NEW_APP">%1$s</xliff:g> instead of <xliff:g id="CURRENT_APP">%2$s</xliff:g> as your default dialler app?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Use <xliff:g id="NEW_APP">%s</xliff:g> as your default dialler app?"</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 0d01605..a7d9e24 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -16,8 +16,8 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Call Management"</string>
-    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Phone"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Phone Call Management"</string>
+    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telephone"</string>
     <string name="unknown" msgid="6878797917991465859">"Unknown"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Missed call"</string>
     <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Missed work call"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Missing voicemail number"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"No voicemail number is stored on the SIM card."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Add number"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Make <xliff:g id="NEW_APP">%s</xliff:g> your default Phone app?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Set Default"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancel"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> will be able to place and control all aspects of calls. Only apps that you trust should be set as the default Phone app."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blocked numbers"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"You won\'t receive calls or texts from blocked numbers."</string>
-    <string name="block_number" msgid="1101252256321306179">"Add a number"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Unblock <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Unblock"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Block calls and texts from"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Phone number"</string>
-    <string name="block_button" msgid="8822290682524373357">"Block"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Only the device owner can view and manage blocked numbers."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Unblock"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blocking temporarily off"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"When you dial or text an emergency number, blocking is turned off to ensure that emergency services can contact you."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Re-enable now"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blocked"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> unblocked"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Unable to block emergency number."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> is already blocked."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Using the personal dialler to make the call"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Change default Dialer app?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Use <xliff:g id="NEW_APP">%1$s</xliff:g> instead of <xliff:g id="CURRENT_APP">%2$s</xliff:g> as your default dialler app?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Use <xliff:g id="NEW_APP">%s</xliff:g> as your default dialler app?"</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 0d01605..a7d9e24 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -16,8 +16,8 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Call Management"</string>
-    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Phone"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Phone Call Management"</string>
+    <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telephone"</string>
     <string name="unknown" msgid="6878797917991465859">"Unknown"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Missed call"</string>
     <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Missed work call"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Missing voicemail number"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"No voicemail number is stored on the SIM card."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Add number"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Make <xliff:g id="NEW_APP">%s</xliff:g> your default Phone app?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Set Default"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancel"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> will be able to place and control all aspects of calls. Only apps that you trust should be set as the default Phone app."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blocked numbers"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"You won\'t receive calls or texts from blocked numbers."</string>
-    <string name="block_number" msgid="1101252256321306179">"Add a number"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Unblock <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Unblock"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Block calls and texts from"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Phone number"</string>
-    <string name="block_button" msgid="8822290682524373357">"Block"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Only the device owner can view and manage blocked numbers."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Unblock"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blocking temporarily off"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"When you dial or text an emergency number, blocking is turned off to ensure that emergency services can contact you."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Re-enable now"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blocked"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> unblocked"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Unable to block emergency number."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> is already blocked."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Using the personal dialler to make the call"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Change default Dialer app?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Use <xliff:g id="NEW_APP">%1$s</xliff:g> instead of <xliff:g id="CURRENT_APP">%2$s</xliff:g> as your default dialler app?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Use <xliff:g id="NEW_APP">%s</xliff:g> as your default dialler app?"</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 6768c48..5d6e049 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Administración de llamadas"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Administración de llamadas telefónicas"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Teléfono"</string>
     <string name="unknown" msgid="6878797917991465859">"Desconocida"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Llamada perdida"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Falta el número de correo de voz"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"No hay un número de correo de voz almacenado en la tarjeta SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Agregar número"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"¿Establecer <xliff:g id="NEW_APP">%s</xliff:g> como la app de teléfono predeterminada?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Establecer como predeterminada"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancelar"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> podrá realizar llamadas y controlar todos los aspectos relacionados con ellas. Establece solamente una app de confianza como la app de teléfono predeterminada."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Números bloqueados"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"No recibirás llamadas ni mensajes de texto de los números bloqueados."</string>
-    <string name="block_number" msgid="1101252256321306179">"Agregar un número"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"¿Quieres desbloquear el <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Desbloquear"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloquear llamadas y mensajes de texto de"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Número de teléfono"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloquear"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Solo el propietario del dispositivo puede ver y administrar los números bloqueados."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Desbloquear"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"El bloqueo se desactivó de forma temporal"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Luego de que llamas o envías un mensaje a un número de emergencia, el bloqueo se desactiva para garantizar que los servicios de emergencia puedan ponerse en contacto contigo."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Volver a habilitar ahora"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bloqueado"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> desbloqueado"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"No se puede bloquear el número de emergencia."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ya está bloqueado."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Usando el teléfono personal para realizar la llamada"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"¿Quieres cambiar la aplicación Marcador predeterminada?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"¿Quieres usar <xliff:g id="NEW_APP">%1$s</xliff:g> en lugar de <xliff:g id="CURRENT_APP">%2$s</xliff:g> como la aplicación de marcado predeterminada?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"¿Quieres usar <xliff:g id="NEW_APP">%s</xliff:g> como la aplicación de marcado predeterminada?"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index f9be28b..ab4a174 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gestión de llamadas"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Gestión de llamadas del teléfono"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Teléfono"</string>
     <string name="unknown" msgid="6878797917991465859">"Desconocido"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Llamada perdida"</string>
@@ -35,7 +35,7 @@
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respuestas rápidas"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respuestas rápidas"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
-    <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Respuesta rápida"</string>
+    <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Respuestas rápidas"</string>
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Mensaje enviado a <xliff:g id="PHONE_NUMBER">%s</xliff:g>"</string>
     <string name="enable_account_preference_title" msgid="2021848090086481720">"Cuentas de llamadas"</string>
     <string name="outgoing_call_not_allowed_user_restriction" msgid="6872406278300131364">"Solo se permiten llamadas de emergencia."</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Falta el número del buzón de voz."</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"No se ha almacenado ningún número de buzón de voz en la tarjeta SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Añadir número"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"¿Quieres que <xliff:g id="NEW_APP">%s</xliff:g> sea tu aplicación de teléfono predeterminada?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Configurar como predeterminada"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancelar"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> podrá llamar y controlar todo lo relacionado con las llamadas. Te aconsejamos que solo configures una aplicación como predeterminada si es de confianza."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Números bloqueados"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"No recibirás llamadas ni SMS de los números bloqueados."</string>
-    <string name="block_number" msgid="1101252256321306179">"Añadir un número"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"¿Desbloquear el número <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Desbloquear"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloquear llamadas y mensajes de texto del número"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Número de teléfono"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloquear"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Solo el propietario del dispositivo puede ver y administrar los números bloqueados."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Desbloquear"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Bloqueo desactivado temporalmente"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Después de llamar o enviar un SMS a un número de emergencias, el bloqueo se desactiva para que los servicios de emergencias puedan contactarte."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Volver a habilitarlo ahora"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bloqueado"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> desbloqueado"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"No se puede bloquear el número de emergencias."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"El <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ya está bloqueado."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Utilizando teléfono personal para llamar"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"¿Cambiar el marcador predeterminado?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"¿Quieres utilizar <xliff:g id="NEW_APP">%1$s</xliff:g> en lugar de <xliff:g id="CURRENT_APP">%2$s</xliff:g> como marcador predeterminado?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"¿Quieres utilizar <xliff:g id="NEW_APP">%s</xliff:g> como marcador predeterminado?"</string>
 </resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 506ba31..a567faf 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Kõnehaldus"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefonikõnede haldus"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Tundmatu"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Vastamata kõne"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Puudub kõnepostinumber"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM-kaardile pole salvestatud ühtegi kõnepostinumbrit."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Lisa number"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Kas muuta rakendus <xliff:g id="NEW_APP">%s</xliff:g> telefoni vaikerakenduseks?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Määra vaikeseadeks"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Tühista"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"Rakendus <xliff:g id="NEW_APP">%s</xliff:g> saab helistada ja juhtida kõiki kõnede aspekte. Määrake telefoni vaikerakenduseks vaid usaldusväärsed rakendused."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokeeritud numbrid"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Te ei saa blokeeritud numbritelt kõnesid ega tekstsõnumeid."</string>
-    <string name="block_number" msgid="1101252256321306179">"Lisa number"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Kas deblokeerida number <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Deblokeeri"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokeeri kõned ja tekstsõnumid numbrilt"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefoninumber"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokeeri"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Ainult seadme omanik saab blokeeritud numbreid vaadata ja hallata."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Deblokeerimine"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokeerimine on ajutiselt välja lülitatud"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Kui helistate või saadate sõnumi hädaabinumbrile, lülitatakse blokeerimine välja, et hädaabiteenused saaksid teiega ühendust võtta."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Luba kohe uuesti"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Number <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> on blokeeritud"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Number <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> on deblokeeritud"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Hädaabinumbrit ei saa blokeerida."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Number <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> on juba blokeeritud."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Helistamiseks kasutatakse isiklikku helistamisprogrammi"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Kas muuta helistamise vaikerakendust?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Kas kasutada rakendust <xliff:g id="NEW_APP">%1$s</xliff:g> rakenduse <xliff:g id="CURRENT_APP">%2$s</xliff:g> asemel helistamise vaikerakendusena?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Kas kasutada rakendust <xliff:g id="NEW_APP">%s</xliff:g> helistamise vaikerakendusena?"</string>
 </resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 1dd4963..3cf0454 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -16,10 +16,10 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Deien kudeaketa"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefono-deien kudeaketa"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefonoa"</string>
     <string name="unknown" msgid="6878797917991465859">"Ezezaguna"</string>
-    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Galdutako deia"</string>
+    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Dei galdua"</string>
     <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Laneko dei bat galdu duzu"</string>
     <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Dei galduak"</string>
     <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> dei galdu"</string>
@@ -31,7 +31,7 @@
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Ezin dut hitz egin. Arazoren bat al dago?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Oraintxe deituko dizut bueltan."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Geroago deituko dizut."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ezin dut hitz egin. Deitu geroago, mesedez."</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ezin dut hitz egin. Deitu geroago."</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Erantzun bizkorrak"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editatu erantzun bizkorrak"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -39,32 +39,13 @@
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Mezua bidali da <xliff:g id="PHONE_NUMBER">%s</xliff:g> zenbakira."</string>
     <string name="enable_account_preference_title" msgid="2021848090086481720">"Deiak egiteko kontuak"</string>
     <string name="outgoing_call_not_allowed_user_restriction" msgid="6872406278300131364">"Larrialdi-deiak bakarrik egin daitezke."</string>
-    <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"Aplikazioak deitu ahal izan dezan, telefonoaren eginbidea erabiltzeko baimena behar du."</string>
+    <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"Aplikazioak irteerako deiak egin ahal izan ditzan, telefonoaren eginbidea erabiltzeko baimena behar du."</string>
     <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Deitzeko, idatzi balio duen zenbaki bat."</string>
     <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Une honetan ezin da deirik gehitu."</string>
     <string name="no_vm_number" msgid="4164780423805688336">"Erantzungailuaren zenbakia falta da"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Ez da erantzungailuaren zenbakirik gorde SIM txartelean."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Gehitu zenbakia"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> telefonoaren aplikazio lehenetsia izatea nahi duzu?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Ezarri lehenetsi gisa"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Utzi"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"Deien aspektu guztiak erabili eta kontrolatu ahal izango ditu <xliff:g id="NEW_APP">%s</xliff:g> aplikazioak. Fidagarriak diren aplikazioak bakarrik erabili beharko lirateke telefonoaren aplikazio lehenetsi gisa."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokeatutako zenbakiak"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Ez duzu jasoko deirik edo testu-mezurik blokeatutako zenbakietatik."</string>
-    <string name="block_number" msgid="1101252256321306179">"Gehitu zenbakia"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> desblokeatu?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Desblokeatu"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokeatu zenbaki honetatik jasotzen diren deiak eta testu-mezuak:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefono-zenbakia"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokeatu"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Gailuaren jabeak soilik ikus eta kudea ditzake blokeatutako zenbakiak."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Desblokeatu"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Aldi baterako desgaitu da blokeatzeko aukera"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Larrialdietarako zenbakia markatu ondoren, edo zenbait horretara testu-mezua bidali ondoren, desaktibatu egingo da blokeatzeko aukera, larrialdi-zerbitzuak zurekin harremanetan jarriko direla ziurtatzeko."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Gaitu berriro"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Blokeatu da <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Desblokeatu da <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Ezin da blokeatu larrialdi-zenbakia."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blokeatuta dago dagoeneko."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Telefono pertsonala erabiltzen ari zara deia egiteko"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Telefono-aplikazio lehenetsia aldatu nahi duzu?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> aplikazioaren ordez <xliff:g id="NEW_APP">%1$s</xliff:g> erabili nahi duzu telefono-aplikazio lehenetsi gisa?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> telefono-aplikazio lehenetsi gisa erabili nahi duzu?"</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 78acda1..c2f6ea9 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"مدیریت تماس"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"مدیریت تماس تلفنی"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"تلفن"</string>
     <string name="unknown" msgid="6878797917991465859">"ناشناس"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"تماس بی پاسخ"</string>
@@ -29,7 +29,7 @@
     <string name="accessibility_call_muted" msgid="2776111226185342220">"تماس نادیده گرفته شد."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"تلفن آیفون‌دار فعال شد."</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"اکنون نمی‌توانم صحبت کنم. موضوع چیست؟"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"بی‌درنگ با شما تماس می‌گیرم."</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"به زودی با شما تماس می‌گیرم."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"بعداً با شما تماس می‌گیرم."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"اکنون نمی‌توانم صحبت کنم. بعداً به من زنگ می‌زنید؟"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"پاسخ‌های سریع"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"عدم وجود شماره پست صوتی"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"شماره پست صوتی در سیم کارت ذخیره نشده است."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"افزودن شماره"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> را به برنامه تلفن پیش‌فرضتان تبدیل می‌کنید؟"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"تنظیم پیش‌فرض"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"لغو"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> می‌تواند تماس‌ها را برقرار کند و همه مسائل مربوط به آنها را کنترل کند. فقط برنامه‌هایی را که به آنها اطمینان دارید به‌عنوان برنامه پیش‌فرض تلفن تنظیم کنید."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"شماره‌های مسدود‌شده"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"از شماره‌های مسدود‌شده نمی‌توانید تماس یا پیامک دریافت کنید."</string>
-    <string name="block_number" msgid="1101252256321306179">"افزودن شماره"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> رفع انسداد شود؟"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"رفع انسداد"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"مسدود کردن تماس و پیامک از"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"شماره تلفن"</string>
-    <string name="block_button" msgid="8822290682524373357">"مسدود کردن"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"فقط مالک دستگاه می‌تواند شماره‌های مسدودشده را مدیریت کند."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"رفع انسداد"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"امکان مسدود کردن موقتاً خاموش شده است."</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"بعد از گرفتن شماره اضطراری یا ارسال پیام نوشتاری به آن شماره، برای اطمینان از اینکه سرویس‌های اضطراری با شما تماس بگیرند، امکان مسدود کردن خاموش شده است."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"اکنون دوباره فعال شود"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> مسدود شد"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"انسداد <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> لغو شد"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"شماره اضطراری مسدود نشد."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> قبلاً مسدود شده است."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"استفاده از شماره‌گیر شخصی برای گرفتن تماس"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"برنامه شماره‌گیر پیش‌فرض تغییر کند؟"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"از <xliff:g id="NEW_APP">%1$s</xliff:g> به جای <xliff:g id="CURRENT_APP">%2$s</xliff:g> به عنوان برنامه شماره‌گیر پیش‌فرض استفاده شود؟"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"از <xliff:g id="NEW_APP">%s</xliff:g> به عنوان برنامه شماره‌گیر پیش‌فرض استفاده شود؟"</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index b810ac5..d318f6b 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Puhelujen hallinta"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Puhelujen hallinta"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Puhelin"</string>
     <string name="unknown" msgid="6878797917991465859">"Tuntematon"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Vastaamatta jäänyt puhelu"</string>
@@ -28,7 +28,7 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"Viesti"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Puhelu mykistetty."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Kaiutin käytössä."</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"En voi vastata. Mitä asiaa?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"En voi vastata - mitä asiaa?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Soitan sinulle pian."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Soitan sinulle myöhemmin."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"En voi vastata. Soitatko myöhemmin?"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Puhelinvastaajan numero puuttuu"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM-kortille ei ole tallennettu puhelinvastaajan numeroa."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Lisää numero"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Valitaanko <xliff:g id="NEW_APP">%s</xliff:g> oletuspuhelinsovellukseksi?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Aseta oletukseksi"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Peruuta"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> voi hallita kaikkia puhelutoimintoja. Aseta oletuspuhelinsovellukseksi vain luotettava sovellus."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Estetyt numerot"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Et voi vastaanottaa puheluita tai tekstiviestejä estetyistä numeroista."</string>
-    <string name="block_number" msgid="1101252256321306179">"Lisää numero"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Kumotaanko numeron <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> esto?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Kumoa esto"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Estä puhelut ja tekstiviestit numerosta"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Puhelinnumero"</string>
-    <string name="block_button" msgid="8822290682524373357">"Estä"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Vain laitteen omistaja voi katsella ja hallinnoida estettyjä numeroita."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Kumoa esto"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Esto on väliaikaisesti pois käytöstä"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Hätänumeroon soittamisen tai tekstiviestin lähettämisen jälkeen esto poistetaan käytöstä, jotta hätäviranomaiset voivat olla yhteydessä sinuun."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Ota nyt uudelleen käyttöön"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> estettiin."</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Numeron <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> esto kumottiin."</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Hätänumeroa ei voi estää."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> on jo estetty."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Puhelun soittaminen henkilökohtaisella numerovalitsimella"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Vaihdetaanko oletuspuhelusovellus?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Asetetaanko oletuspuhelusovellukseksi <xliff:g id="NEW_APP">%1$s</xliff:g> sovelluksen <xliff:g id="CURRENT_APP">%2$s</xliff:g> sijaan?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Asetetaanko <xliff:g id="NEW_APP">%s</xliff:g> oletuspuhelusovellukseksi?"</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index d41cb2d..d88a8ed 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gestion des appels"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Gestion des appels téléphoniques"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Téléphone"</string>
     <string name="unknown" msgid="6878797917991465859">"Inconnu"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Appel manqué"</string>
@@ -33,7 +33,7 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Je t\'appellerai plus tard."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Peux pas parler. On se rappelle?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Réponses rapides"</string>
-    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modifier réponses rapides"</string>
+    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modif. rép. rapides"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
     <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Réponse rapide"</string>
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Message envoyé à <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Numéro de messagerie vocale manquant"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Aucun numéro de messagerie vocale n\'est enregistré sur la carte SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Ajouter un numéro"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Définir <xliff:g id="NEW_APP">%s</xliff:g> comme votre application de téléphonie par défaut?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Définir comme application de téléphonie par défaut"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Annuler"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> sera en mesure de passer des appels et de contrôler tous les aspects des appels. Seules les applications auxquelles vous avez confiance doivent être définies comme l\'application de téléphonie par défaut."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Numéros bloqués"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Vous ne recevrez pas d\'appels ni de messages texte provenant des numéros bloqués."</string>
-    <string name="block_number" msgid="1101252256321306179">"Ajouter un numéro"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Débloquer <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Débloquer"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloquer les appels et les textos de"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Numéro de téléphone"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloquer"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Seul le propriétaire de l\'appareil peut afficher et gérer les numéros bloqués."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Débloquer"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Le blocage est temporairement désactivé"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Lorsque vous communiquez avec les services d\'urgence par téléphone ou par message texte, la fonctionnalité de blocage est désactivée pour que ceux-ci puissent vous joindre."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Réactiver le blocage maintenant"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Le numéro <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> a été bloqué."</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Le numéro <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> a été débloqué."</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Impossible de bloquer le numéro d\'urgence."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Le numéro <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> a déjà été bloqué."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Utilisation du clavier personnel pour faire l\'appel…"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Changer l\'application de composition par défaut?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Utiliser <xliff:g id="NEW_APP">%1$s</xliff:g> au lieu de <xliff:g id="CURRENT_APP">%2$s</xliff:g> comme application de composition par défaut?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Utiliser <xliff:g id="NEW_APP">%s</xliff:g> comme application de composition par défaut?"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 57df3d0..9962c6e 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gestion des appels"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Gestion des appels téléphoniques"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Téléphone"</string>
     <string name="unknown" msgid="6878797917991465859">"Inconnu"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Appel manqué"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Numéro de messagerie vocale manquant"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Aucun numéro de messagerie vocale n\'est enregistré sur la carte SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Ajouter un numéro"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Définir <xliff:g id="NEW_APP">%s</xliff:g> comme application de téléphone par défaut ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Définir l\'application par défaut"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Annuler"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> sera en mesure de passer des appels et d\'en contrôler tous les détails. Ne définissez qu\'une application de confiance comme application de téléphone par défaut."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Numéros bloqués"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Vous ne recevrez plus les appels ni les SMS émis depuis les numéros bloqués."</string>
-    <string name="block_number" msgid="1101252256321306179">"Ajouter un numéro"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Débloquer <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Débloquer"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloquer les appels et les SMS de"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Numéro de téléphone"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloquer"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Seul le propriétaire de l\'appareil peut afficher et gérer les numéros bloqués."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Débloquer"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Le blocage est temporairement désactivé."</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Si vous composez un numéro d\'urgence ou que vous envoyez un SMS à ce type de numéro, le blocage est désactivé pour que les services d\'urgence puissent vous contacter."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Réactiver"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bloqué"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> débloqué"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Vous ne pouvez pas bloquer un numéro d\'urgence."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Le numéro \"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>\" est déjà bloqué."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Utilisation du clavier personnel pour passer l\'appel…"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Modifier l\'application de clavier par défaut ?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Utiliser <xliff:g id="NEW_APP">%1$s</xliff:g> et non plus <xliff:g id="CURRENT_APP">%2$s</xliff:g> comme application de clavier par défaut ?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Utiliser <xliff:g id="NEW_APP">%s</xliff:g> comme application de clavier par défaut ?"</string>
 </resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index c6786c2..ef36d3a 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Xestión de chamadas"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Xestión de chamadas do teléfono"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Teléfono"</string>
     <string name="unknown" msgid="6878797917991465859">"Descoñecido"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada perdida"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Falta o número de correo de voz"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Non hai ningún número de correo de voz almacenado na tarxeta SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Engadir número"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Establecer <xliff:g id="NEW_APP">%s</xliff:g> como aplicación de teléfono predeterminada?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Establecer como predeterminada"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancelar"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> poderá facer chamadas e controlar todo o referente a estas. Só deberías establecer como aplicación de teléfono predeterminada aplicacións nas que confíes."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Números bloqueados"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Non recibirás chamadas nin mensaxes de texto desde números bloqueados."</string>
-    <string name="block_number" msgid="1101252256321306179">"Engadir un número"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Queres desbloquear o <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Desbloquear"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloquear chamadas e mensaxes do"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Número de teléfono"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloquear"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Só o propietario do dispositivo pode ver e xestionar os números bloqueados."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Desbloquear"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"O bloqueo desactivouse temporalmente"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Despois de facer unha chamada ou enviar unha mensaxe a un número de emerxencia, desactívase o bloqueo para garantir que os servizos de emerxencia poidan poñerse en contacto contigo."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Volver activar agora"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Bloqueouse o <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Desbloqueouse o <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Non se pode bloquear o número de emerxencia."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"O <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> xa está bloqueado."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Usando o marcador persoal para facer a chamada"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Queres cambiar a aplicación predeterminada do marcador?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Queres usar <xliff:g id="NEW_APP">%1$s</xliff:g> en lugar de <xliff:g id="CURRENT_APP">%2$s</xliff:g> como a túa aplicación de marcador predeterminada?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Queres usar <xliff:g id="NEW_APP">%s</xliff:g> como a túa aplicación de marcador predeterminada?"</string>
 </resources>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index afaebe4..f5db5ce 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"કૉલ સંચાલન"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ફોન કૉલ સંચાલન"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ફોન"</string>
     <string name="unknown" msgid="6878797917991465859">"અજાણ્યું"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"છૂટેલો કૉલ"</string>
@@ -28,10 +28,10 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"સંદેશ"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"કૉલ મ્યૂટ કરેલ છે."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"સ્પીકરફોન પસંદ કરેલ છે."</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"હમણાં વાત નહીં કરી શકું. શું ચાલે છે?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"હમણાં વાત કરી શકાતી નથી. શું ચાલે છે?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"હું તરત જ પાછો કૉલ કરીશ."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"હું પછીથી કૉલ કરીશ."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"હમણાં વાત નહીં કરી શકું. મને પછીથી કૉલ કરી શકશો?"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"હમણાં વાત કરી શકાતી નથી. મને પછીથી કૉલ કરી શકશો?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ઝડપી પ્રતિસાદ"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ઝડપી પ્રતિસાદ સંપાદિત કરો"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -39,32 +39,13 @@
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"<xliff:g id="PHONE_NUMBER">%s</xliff:g> પર સંદેશ મોકલ્યો."</string>
     <string name="enable_account_preference_title" msgid="2021848090086481720">"કૉલિંગ એકાઉન્ટ્સ"</string>
     <string name="outgoing_call_not_allowed_user_restriction" msgid="6872406278300131364">"ફક્ત કટોકટીના કૉલ્સને મંજૂરી છે."</string>
-    <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"ફોન પરવાનગી વિના આ ઍપ્લિકેશન આઉટગોઇંગ કૉલ્સ કરી શકતી નથી."</string>
+    <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"ફોન પરવાનગી વિના આ એપ્લિકેશન આઉટગોઇંગ કૉલ્સ કરી શકતી નથી."</string>
     <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"કૉલ કરવા માટે, માન્ય નંબર દાખલ કરો."</string>
     <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"આ સમયે કૉલ ઉમેરી શકાતો નથી."</string>
     <string name="no_vm_number" msgid="4164780423805688336">"વૉઇસમેઇલ નંબર ખૂટે છે"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM કાર્ડ પર કોઈ વૉઇસમેઇલ નંબર સંગ્રહિત નથી."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"નંબર ઉમેરો"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"શું <xliff:g id="NEW_APP">%s</xliff:g> ને તમારી ડિફૉલ્ટ ફોન ઍપ્લિકેશન બનાવીએ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ડિફૉલ્ટ સેટ કરો"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"રદ કરો"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g>, કૉલ્સ કરવામાં અને કૉલ્સના તમામ પાસાઓને નિયંત્રિત કરવામાં સમર્થ હશે. તમે વિશ્વાસ કરો છો તે જ ઍપ્લિકેશનોને ડિફૉલ્ટ ફોન ઍપ્લિકેશન તરીકે સેટ કરો."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"અવરોધિત નંબરો"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"તમે અવરોધિત નંબરોથી કૉલ્સ અથવા ટેક્સ્ટ પ્રાપ્ત કરશો નહીં."</string>
-    <string name="block_number" msgid="1101252256321306179">"એક નંબર ઉમેરો"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ને અનાવરોધિત કરીએ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"અનાવરોધિત કરો"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"આ નંબરના કૉલ્સ અને ટેક્સ્ટને અવરોધિત કરો"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ફોન નંબર"</string>
-    <string name="block_button" msgid="8822290682524373357">"અવરોધિત કરો"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"ફક્ત ઉપકરણના માલિક અવરોધિત નંબરોને જોઈ અને સંચાલિત કરી શકે છે."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"અનાવરોધિત કરો"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"અવરોધિત કરવાનું અસ્થાયીરૂપે બંધ છે"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"તમે કોઈ કટોકટીનો નંબર ડાયલ કરો કે ટેક્સ્ટ કરો તે પછી, કટોકટીની સેવાઓ તમારો સંપર્ક કરી શકે તેની ખાતરી કરવા માટે અવરોધિત કરવું બંધ કરવામાં આવે છે."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"હવે ફરીથી સક્ષમ કરો"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> અવરોધિત કર્યો"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> અનાવરોધિત કર્યો"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"કટોકટીના નંબરને અવરોધિત કરવામાં અસમર્થ."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>, પહેલાંથી અવરોધિત કરવામાં આવ્યો છે."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"કૉલ કરવા માટે વ્યક્તિગત ડાયલરનો ઉપયોગ કરી રહ્યાં છે"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ડિફોલ્ટ ડાયલર એપ્લિકેશન બદલીએ?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"તમારી ડિફોલ્ટ ડાયલર એપ્લિકેશન તરીકે <xliff:g id="CURRENT_APP">%2$s</xliff:g> ને બદલે <xliff:g id="NEW_APP">%1$s</xliff:g> નો ઉપયોગ કરીએ?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"તમારી ડિફોલ્ટ ડાયલર એપ્લિકેશન તરીકે <xliff:g id="NEW_APP">%s</xliff:g> નો ઉપયોગ કરીએ?"</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 2aafb5f..463cdc4 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"कॉल प्रबंधन"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"फ़ोन कॉल प्रबंधन"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"फ़ोन"</string>
     <string name="unknown" msgid="6878797917991465859">"अज्ञात"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"छूटी कॉल"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"गुम वॉयस मेल नंबर"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"सिम कार्ड पर कोई वॉयस मेल नंबर संग्रहीत नहीं है."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"नंबर जोड़ें"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> को अपना डिफ़ॉल्ट ऐप्लिकेशन बनाएं?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"डिफ़ॉल्ट सेट करें"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"अभी नहीं"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> कॉल करने और कॉल से संबंधित सभी पहलुओं को नियंत्रित कर पाएगा. केवल उन्हीं ऐप्लिकेशन को डिफ़ॉल्ट फ़ोन ऐप्लिकेशन के रूप में सेट करना चाहिए जिन पर आप विश्वास करते हैं."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"अवरोधित नंबर"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"आपको अवरुद्ध किए गए नंबर से कॉल या लेख संदेश प्राप्त नहीं होंगे."</string>
-    <string name="block_number" msgid="1101252256321306179">"एक नंबर जोड़ें"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> को अनवरोधित करें?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"अनवरोधित करें"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"इसके कॉल और लेख अवरुद्ध करें"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"फ़ोन नंबर"</string>
-    <string name="block_button" msgid="8822290682524373357">"अवरुद्ध करें"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"केवल डिवाइस स्वामी अवरुद्ध किए गए नंबर देख और प्रबंधित कर सकते हैं."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"अनवरोधित करें"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"अवरोधन अस्थायी रूप से बंद है"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"आपातकालीन नंबर डायल करने या उस पर लेख संदेश भेजने के बाद, अवरोधन बंद हो जाता है ताकि आपातकालीन सेवाएं आपसे संपर्क कर सकें."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"अभी पुन: सक्षम करें"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> अवरोधित है"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> अनवरोधित है"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"आपातकालीन नंबर अवरुद्ध करने में असमर्थ."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> पहले से अवरोधित है."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"कॉल करने के लिए व्यक्तिगत डायलर का उपयोग करना"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"डिफ़ॉल्‍ट डायलर ऐप को बदलें?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"अपने डिफ़ॉल्‍ट डायलर ऐप के रूप में <xliff:g id="CURRENT_APP">%2$s</xliff:g> के बजाय <xliff:g id="NEW_APP">%1$s</xliff:g> का उपयोग करें?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"अपने डिफ़ॉल्‍ट डायलर ऐप के रूप में <xliff:g id="NEW_APP">%s</xliff:g> का उपयोग करें?"</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 86e06ed..5022e7e 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Upravljanje pozivom"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Upravljanje telefonskim pozivima"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Nepoznato"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Propušteni poziv"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Nedostaje broj govorne pošte"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Na SIM kartici nije spremljen broj govorne pošte."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj broj"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Želite li postaviti <xliff:g id="NEW_APP">%s</xliff:g> kao zadanu aplikaciju telefona?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Postavi zadano"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Odustani"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> će moći uspostaviti poziv i upravljati svim njegovim aspektima. Kao zadanu aplikaciju telefona postavite samo aplikaciju koju smatrate pouzdanom."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokirani brojevi"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Nećete primati ni pozive ni poruke s blokiranih brojeva."</string>
-    <string name="block_number" msgid="1101252256321306179">"Dodaj broj"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Želite li deblokirati <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Deblokiraj"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokirajte pozive i poruke koje upućuje"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonski broj"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokiraj"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Samo vlasnik uređaja može pregledavati i kontrolirati blokirane brojeve."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Deblokiranje"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokiranje je privremeno isključeno"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Nakon što nazovete broj hitne službe ili pošaljete poruku na njega, blokada će se isključiti kako bi vam se hitna služba mogla javiti."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Ponovno omogući sada"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Broj <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je blokiran"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Broj <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> deblokiran je"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Broj hitne službe ne može se blokirati."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Broj <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> već je blokiran."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Za upućivanje poziva upotrebljava se osobni program za biranje"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Želite li promijeniti zadanu aplikaciju brojčanika?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Želite li upotrebljavati <xliff:g id="NEW_APP">%1$s</xliff:g> umjesto aplikacije <xliff:g id="CURRENT_APP">%2$s</xliff:g> kao zadanu aplikaciju brojčanika?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Želite li upotrebljavati <xliff:g id="NEW_APP">%s</xliff:g> kao zadanu aplikaciju brojčanika?"</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 6266e54..ab39a81 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Híváskezelés"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Híváskezelés"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Ismeretlen"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Nem fogadott hívás"</string>
@@ -29,9 +29,9 @@
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Hívás némítva."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Kihangosítás engedélyezve."</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Most nem alkalmas. Mi újság?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Hamarosan visszahívlak."</string>
-    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Később visszahívlak."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Most nem alkalmas. Hívnál később?"</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Hamarosan visszahívom."</string>
+    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Később visszahívom."</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Most nem alkalmas. Hívna később?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Gyors válaszok"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Gyors válaszok szerkesztése"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Hiányzik a hangposta száma"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Nincs hangpostaszám a SIM kártyán."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Szám hozzáadása"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Beállítja a(z) <xliff:g id="NEW_APP">%s</xliff:g> alkalmazást alapértelmezettként?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Beállítás alapértelmezettként"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Mégse"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> jogosult lesz hívások indítására és a hívásokkal kapcsolatos minden beállítás vezérlésére. Csak megbízható alkalmazást állítson be alapértelmezett telefonalkalmazásként."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Letiltott számok"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"A jövőben nem kap hívásokat vagy SMS-eket a letiltott számokról."</string>
-    <string name="block_number" msgid="1101252256321306179">"Szám hozzáadása"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Feloldja a következő szám letiltását: <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Letiltás feloldása"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"A következő számról érkező hívások és SMS-ek letiltása:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonszám"</string>
-    <string name="block_button" msgid="8822290682524373357">"Letiltás"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Csak az eszköz tulajdonosa nézheti meg és kezelheti a letiltott számokat."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Letiltás feloldása"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"A tiltás átmenetileg felfüggesztve"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Ha segélyhívószámot tárcsáz, vagy segélyhívószámra küld SMS-t, a rendszer feloldja a tiltást, hogy a sürgősségi szolgáltatások felvehessék Önnel a kapcsolatot."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Újbóli engedélyezés most"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> letiltva"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> letiltása feloldva"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Nem sikerült letiltani a segélyhívószámot."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"A következő szám már le van tiltva: <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Hívás indítása a személyes tárcsázóval"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Módosítja az alapértelmezett tárcsázó alkalmazást?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Legyen a(z) <xliff:g id="NEW_APP">%1$s</xliff:g> az alapértelmezett tárcsázó alkalmazás a(z) <xliff:g id="CURRENT_APP">%2$s</xliff:g> helyett?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Legyen a(z) <xliff:g id="NEW_APP">%s</xliff:g> az alapértelmezett tárcsázó alkalmazás?"</string>
 </resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 94696a7..56773ea 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Զանգերի կառավարում"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Հեռախոսային զանգերի կառավարում"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Հեռախոս"</string>
     <string name="unknown" msgid="6878797917991465859">"Անհայտ"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Բաց թողնված զանգ"</string>
@@ -30,8 +30,8 @@
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Բարձրախոսը միացված է:"</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Չեմ կարող խոսել հիմա: Ի՞նչ կա չկա:"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Ես ձեզ հիմա հետ կզանգեմ:"</string>
-    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ես ձեզ մի փոքր ուշ կզանգեմ:"</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Չեմ կարող խոսել հիմա: Կզանգե՞ք ավելի ուշ:"</string>
+    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ես ձեր մի փոքր ուշ կզանգեմ:"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Չեմ կարող խոսել հիմա: Զանգե՞մ ձեզ մի փոքր ուշ:"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Արագ պատասխաններ"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Խմբագրել արագ պատասխանները"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Բացակայում է ձայնային փոստի համարը"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM քարտում ձայնային փոստի ոչ մի համար գրանցված չէ:"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Ավելացնել համար"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Նշե՞լ <xliff:g id="NEW_APP">%s</xliff:g>-ը որպես Հեռախոսի կանխադրված հավելված:"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Սահմանել որպես կանխադրված"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Չեղարկել"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> հավելվածը կկատարի զանգերի հետ կապված բոլոր գործառույթները: Որպես Հեռախոսի կանխադրված հավելված նշեք միայն վստահելի հավելվածներ:"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Արգելափակված համարներ"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Արգելափակված համարներից զանգեր և SMS-ներ չեք ստանա:"</string>
-    <string name="block_number" msgid="1101252256321306179">"Ավելացնել համար"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Արգելաբացե՞լ <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> համարը:"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Արգելաբացել"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Արգելափակել այս համարից ստացվող զանգերն ու տեքստային հաղորդագրությունները"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Հեռախոսահամարը"</string>
-    <string name="block_button" msgid="8822290682524373357">"Արգելափակել"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Միայն սարքի սեփականատերը կարող է դիտել և կառավարել արգելափակված համարները:"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Արգելաբացել"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Արգելափակումը ժամանակավորապես անջատվել է"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Արտակարգ իրավիճակի հեռախոսահամար հավաքելուց հետո հեռախոսի արգելափակումը կանջատվի, որպեսզի արտակարգ իրավիճակների ծառայությունները կարողանան կապվել ձեզ հետ:"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Նորից միացնել"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> համարն արգելափակվեց"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> արգելաբացվեց"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Արտակարգ իրավիճակների հեռախոսահամարը հնարավոր չէ արգելափակել:"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> համարն արդեն արգելափակված է:"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Զանգելու նպատակով անհատական համարհավաքիչի օգտագործում"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Փոխե՞լ կանխադրված Համարհավաքի հավելվածը:"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Օգտագործե՞լ <xliff:g id="NEW_APP">%1$s</xliff:g> հավելվածը <xliff:g id="CURRENT_APP">%2$s</xliff:g>-ի փոխարեն որպես համարհավաքի կանխադրված հավելված:"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Դարձնե՞լ <xliff:g id="NEW_APP">%s</xliff:g> հավելվածը համարհավաքի կանխադրված հավելված:"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 780c94b..d8f823f 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Pengelolaan Panggilan Telepon"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Pengelolaan Panggilan Telepon"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telepon"</string>
     <string name="unknown" msgid="6878797917991465859">"Tidak diketahui"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Panggilan tak terjawab"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Nomor kotak pesan hilang"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Tidak ada nomor kotak pesan tersimpan pada kartu SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Tambahkan nomor"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Jadikan <xliff:g id="NEW_APP">%s</xliff:g> sebagai aplikasi Telepon default?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Setel Default"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Batal"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> dapat melakukan panggilan dan mengontrol semua aspek panggilan. Hanya aplikasi yang Anda percaya boleh disetel sebagai aplikasi Telepon default."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Nomor yang diblokir"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Anda tidak akan menerima telepon atau SMS dari nomor yang diblokir."</string>
-    <string name="block_number" msgid="1101252256321306179">"Tambah nomor"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Batalkan pemblokiran <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Batalkan pemblokiran"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokir panggilan telepon dan SMS dari"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Nomor telepon"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokir"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Hanya pemilik perangkat yang dapat melihat dan mengelola nomor yang diblokir."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Bebaskan"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokir dinonaktifkan sementara"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Setelah Anda menelepon atau mengirim SMS ke nomor gawat darurat, blokir akan dinonaktifkan agar layanan gawat darurat tersebut dapat menghubungi Anda."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Aktifkan lagi sekarang"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> diblokir"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> dibebaskan"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Tidak dapat memblokir nomor darurat."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> sudah diblokir."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Menggunakan telepon pribadi untuk melakukan panggilan"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Ubah aplikasi Pemanggil default?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Gunakan <xliff:g id="NEW_APP">%1$s</xliff:g>, bukan <xliff:g id="CURRENT_APP">%2$s</xliff:g> sebagai aplikasi pemanggil default?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Gunakan <xliff:g id="NEW_APP">%s</xliff:g> sebagai aplikasi pemanggil default?"</string>
 </resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index bc43950..56610c5 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Símtalastjórnun"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Símtalastjórnun"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Sími"</string>
     <string name="unknown" msgid="6878797917991465859">"Óþekkt"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Ósvarað símtal"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Talhólfsnúmer vantar"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Ekkert talhólfsnúmer er vistað á SIM-kortinu."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Bæta númeri við"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Gera <xliff:g id="NEW_APP">%s</xliff:g> að sjálfgefnu símaforriti?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Velja sem sjálfgefið"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Hætta við"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> getur framkvæmt og stjórnað öllu sem tengist símtölum. Einungis forrit sem þú treystir ættu að vera stillt sem sjálfgefið símaforrit."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Númer á bannlista"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Þú færð ekki símtöl eða skilaboð frá númerum á bannlista."</string>
-    <string name="block_number" msgid="1101252256321306179">"Bæta við númeri"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Taka <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> af bannlista?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Taka af bannlista"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Loka fyrir símtöl og skilaboð frá"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Símanúmer"</string>
-    <string name="block_button" msgid="8822290682524373357">"Setja á bannlista"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Aðeins eigandi tækisins getur skoðað og stjórnað númerum á bannlista."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Taka af bannlista"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Slökkt tímabundið á lokun símtala"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Eftir að þú hefur hringt eða sent skilaboð í neyðarnúmer verður slökkt á lokun símtala til að tryggja að neyðarþjónusta geti haft samband við þig."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Kveikja aftur núna"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> á bannlista"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> ekki á bannlista"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Getur ekki sett neyðarnúmer á bannlista."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> er nú þegar á bannlista."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Notar eigin símaforrit til að hringja"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Viltu skipta um sjálfgefið hringiforrit?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Nota <xliff:g id="NEW_APP">%1$s</xliff:g> í stað <xliff:g id="CURRENT_APP">%2$s</xliff:g> sem sjálfgefið hringiforrit?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Nota <xliff:g id="NEW_APP">%s</xliff:g> sem sjálfgefið hringiforrit?"</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 8139609..47c5a1b 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -16,13 +16,13 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gestione chiamate"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Phone Call Management"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefono"</string>
     <string name="unknown" msgid="6878797917991465859">"Sconosciuto"</string>
-    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chiamata persa"</string>
+    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chiamata senza risposta"</string>
     <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Chiamata di lavoro persa"</string>
-    <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chiamate perse"</string>
-    <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chiamate perse"</string>
+    <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chiamate senza risposta"</string>
+    <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chiamate senza risposta"</string>
     <string name="notification_missedCallTicker" msgid="504686252427747209">"Chiamata senza risposta da <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
     <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Richiama"</string>
     <string name="notification_missedCall_message" msgid="3049928912736917988">"Messaggio"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Numero segreteria mancante"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Nessun numero di segreteria presente nella SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Aggiungi numero"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Rendere <xliff:g id="NEW_APP">%s</xliff:g> l\'app predefinita del tuo telefono?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Imposta come predefinita"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Annulla"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> potrà effettuare e controllare tutti gli aspetti delle chiamate. L\'app predefinita del telefono dovrebbe essere un\'app di cui ti fidi."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Numeri bloccati"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Non riceverai chiamate o SMS da numeri bloccati."</string>
-    <string name="block_number" msgid="1101252256321306179">"Aggiungi un numero"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Sbloccare <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Sblocca"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blocca chiamate e SMS da"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Numero di telefono"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blocca"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Soltanto il proprietario del dispositivo può visualizzare e gestire i numeri bloccati."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Sblocca"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blocco temporaneamente disattivato"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Dopo aver chiamato o inviato un SMS a un numero di emergenza, il blocco viene disattivato per garantire che i servizi di emergenza possano contattarti."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Riattiva ora"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bloccato"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> sbloccato"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Impossibile bloccare un numero di emergenza."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> è già bloccato."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Utilizzo dell\'app Telefono personale per chiamare"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Modificare l\'app tastiera predefinita?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Utilizzare <xliff:g id="NEW_APP">%1$s</xliff:g> invece di <xliff:g id="CURRENT_APP">%2$s</xliff:g> come app tastiera predefinita?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Utilizzare <xliff:g id="NEW_APP">%s</xliff:g> come app tastiera predefinita?"</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index a730121..af490ca 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"ניהול השיחות"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ניהול שיחות טלפון"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"טלפון"</string>
     <string name="unknown" msgid="6878797917991465859">"לא ידוע"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"שיחה שלא נענתה"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"חסר מספר של דואר קולי"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"‏בכרטיס ה-SIM לא מאוחסן מספר של דואר קולי."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"הוסף מספר"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"האם להפוך את <xliff:g id="NEW_APP">%s</xliff:g> לברירת המחדל לאפליקציית \'טלפון\'?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"הגדר כברירת מחדל"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"ביטול"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> תוכל להתקשר ולשלוט בכל ההיבטים של השיחות. מומלץ לבחור רק אפליקציות שאתה סומך עליהן כברירת המחדל לאפליקציית \'טלפון\'."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"מספרים חסומים"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"לא תקבל שיחות או הודעות טקסט מהמספרים החסומים."</string>
-    <string name="block_number" msgid="1101252256321306179">"הוסף מספר"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"האם לבטל את חסימת המספר <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"בטל חסימה"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"חסום שיחות והודעות טקסט מ-"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"מספר טלפון"</string>
-    <string name="block_button" msgid="8822290682524373357">"חסום"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"רק בעל המכשיר יכול להציג ולנהל מספרים חסומים."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"ביטול חסימה"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"החסימה הושבתה זמנית"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"לאחר חיוג או שליחת הודעה למספר חירום, החסימה תושבת כדי ששירותי החירום יוכלו ליצור איתך קשר."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"הפעל מחדש עכשיו"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> נחסם"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"החסימה של <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> בוטלה"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"אי אפשר לחסום מספרי חירום."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"המספר <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> כבר חסום."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"משתמש בחייגן האישי כדי להתקשר"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"האם לשנות את אפליקציית החייגן שבברירת מחדל?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"האם להשתמש ב-<xliff:g id="NEW_APP">%1$s</xliff:g> במקום ב-<xliff:g id="CURRENT_APP">%2$s</xliff:g> כאפליקציית החייגן שבברירת מחדל?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"האם להשתמש ב-<xliff:g id="NEW_APP">%s</xliff:g> כאפליקציית החייגן שבברירת מחדל?"</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 256d926..07e9c9f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"通話管理"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"通話管理"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"電話"</string>
     <string name="unknown" msgid="6878797917991465859">"通知不可能"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"不在着信"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"ボイスメール番号がありません"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIMカードにボイスメールの番号がありません。"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"番号を追加"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> をデフォルトの電話アプリにしますか?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"デフォルトに設定"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"キャンセル"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> はすべての通話の発信や制御を行えるようになります。デフォルトの電話アプリに設定するのは信頼できるアプリだけにしてください。"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"ブロックした番号"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"ブロックした電話番号からの通話やテキスト メッセージを受け取ることはありません。"</string>
-    <string name="block_number" msgid="1101252256321306179">"番号を追加"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> のブロックを解除しますか?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"ブロックを解除"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"次の発信元からの通話とテキスト メッセージをブロック"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"電話番号"</string>
-    <string name="block_button" msgid="8822290682524373357">"ブロック"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"ブロックした番号を表示、管理できるのは端末の所有者のみです。"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"ブロックを解除"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ブロックが一時的に OFF になっています"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"緊急通報番号に電話をかけたり、テキスト メッセージを送信したりすると、ブロックが OFF になり、緊急通報受理機関からの通話を着信できるようになります。"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"再度有効にする"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> をブロックしました"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> のブロックを解除しました"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"緊急通報番号はブロックできません。"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> は既にブロックされています。"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"個人用の電話アプリで電話する"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"既定の電話アプリを変更しますか?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="NEW_APP">%1$s</xliff:g>を<xliff:g id="CURRENT_APP">%2$s</xliff:g>の代わりに既定の電話アプリとして使用しますか?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g>を既定の電話アプリとして使用しますか?"</string>
 </resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 1e48ae1..b8986a2 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"ზარების მართვა"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ტელეფონის ზარების მართვა"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ტელეფონი"</string>
     <string name="unknown" msgid="6878797917991465859">"უცნობი"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"გამოტოვებული ზარი"</string>
@@ -28,10 +28,10 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"შეტყობინების გაგზავნა"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"ზარი დადუმებულია."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"სპიკერები ჩართულია."</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"ვერ ვპასუხობ. რა ხდება?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"ვერ ვლაპარაკობ. რა ხდება?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"ცოტა ხანში გადმოვრეკავ."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"მოგვიანებით გადმოვრეკავ."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ვერ ვპასუხობ. მოგვიანებით დამირეკეთ."</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ვერ ვპასუხობ. მოგვიანებით დამირეკე."</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"სწრაფი პასუხი"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"სწრაფი პასუხის რედაქტირება"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"ხმოვანი ფოსტის ნომერი არ არის"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM ბარათზე ხმოვანი ფოსტის ნომერი შენახული არ არის."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"ნომრის დამატება"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"გახდეს <xliff:g id="NEW_APP">%s</xliff:g> თქვენი ნაგულისხმევი ტელეფონის აპი?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ნაგულისხმევად დაყენება"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"გაუქმება"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> შეძლებს ზარების განხორციელებას და მათი ყველა ასპექტის მართვას. ნაგულისხმევ ტელეფონის აპად უნდა დააყენოთ ის აპები, რომლებსაც ენდობით."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"დაბლოკილი ნომრები"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"დაბლოკილი ნომრებიდან ზარებსა და ტექსტურ შეტყობინებებს ვერ მიიღებთ."</string>
-    <string name="block_number" msgid="1101252256321306179">"ნომრის დამატება"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"გსურთ, განბლოკოთ <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"განბლოკვა"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ზარებისა და ტექსტური შეტყობინებების დაბლოკვა ნომრიდან:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ტელეფონის ნომერი"</string>
-    <string name="block_button" msgid="8822290682524373357">"დაბლოკვა"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"დაბლოკილი ნომრების ნახვა და მართვა მხოლოდ მოწყობილობის მფლობელს შეუძლია."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"განბლოკვა"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ბლოკი დროებით გამორთულია"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"საგანგებო ნომრის აკრეფის ან მასზე ტესქტური შეტყობინების გაგზავნის შემდეგ ბლოკი გამოირთვება, რათა გადაუდებელი დახმარების სერვისებმა თქვენთან დაკავშირება შეძლოს."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"ხელახლა ჩართვა ახლავე"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> დაბლოკილია"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> განბლოკილია"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"საგანგებო ნომრის დაბლოკვა შეუძლებელია."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> უკვე დაბლოკილია."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"ზარის განსახორციელებლად გამოიყენება პირადი დამრეკი"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"გსურთ ამკრეფის ნაგულისხმევი აპის შეცვლა?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"გსურთ ამკრეფის ნაგულისხმევ აპად <xliff:g id="CURRENT_APP">%2$s</xliff:g>-ის ნაცვლად <xliff:g id="NEW_APP">%1$s</xliff:g>-ის გამოყენება?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"გსურთ, გამოიყენოთ <xliff:g id="NEW_APP">%s</xliff:g>, როგორც ამკრეფის ნაგულისხმევი აპი?"</string>
 </resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 5a49e4d..baf6ef7 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Қоңырауды басқару"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Телефон қоңырауларын басқару"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Телефон"</string>
     <string name="unknown" msgid="6878797917991465859">"Белгісіз"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Қабылданбаған қоңырау"</string>
@@ -29,7 +29,7 @@
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Қоңырау үнсіздендірілген."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Үндеткішті телефон қосылды."</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Қазір сөйлесе алмаймын. Не болды?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Қазір өзім қоңырау шаламын."</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Сізге кері қоңырау шаламын."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Сізге кейінірек қоңырау шаламын."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Қазір сөйлесе алмаймын. Кейінірек?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Жылдам жауаптар"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Дауыс хабарының нөмірі жоқ"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM картасында ешқандай дауыс хабарының нөмірі сақталмаған."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Нөмір қосу"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> қолданбасын әдепкі Телефон қолданбасы ретінде сақтайсыз ба?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Әдепкі ретінде орнату"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Тоқтату"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> қоңыраулардың барлық аспектілерін бақылайтын болады. Тек қана өзіңіз сенетін қолданбаларды ғана әдепкі ретінде орнатқан дұрыс."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Бөгелген нөмірлер"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Тыйым салынған нөмірлерден қоңыраулар немесе мәтіндік хабарлар алмайсыз."</string>
-    <string name="block_number" msgid="1101252256321306179">"Нөмір қосу"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> бөгеуден шығарылсын ба?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Бөгеуден шығару"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Қоңыраулары мен мәтіндік хабарлары бөгелетін нөмір"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Телефон нөмірі"</string>
-    <string name="block_button" msgid="8822290682524373357">"Бөгеу"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Бөгелген нөмірлерді тек құрылғы иесі көре және басқара алады."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Бөгеуді алу"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Тыйым уақытша алынды"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Төтенше жағдай нөмірін терген немесе мәтіндік хабар жіберген соң, төтенше жағдай қызметтері сізге хабарласа алуы үшін тыйым алынады."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Қазір қайта қосу"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> бөгелген"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> бөгеуден шығарылған"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Жедел қызмет нөмірін бөгеу мүмкін емес."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> бұрыннан бөгелген."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Қоңырау шалу үшін жеке нөмір тергішті пайдалану"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Әдепкі нөмір тергіш қолданбаны өзгерткіңіз келе ме?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> орнына <xliff:g id="NEW_APP">%1$s</xliff:g> қолданбасын әдепкі тергіш қолданба ретінде пайдалану қажет пе?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> қолданбасын әдепкі нөмір тергіш қолданба ретінде пайдалану қажет пе?"</string>
 </resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index fa81963..39cbf3d 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"គ្រប់គ្រងការហៅ"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ការគ្រប់គ្រងការហៅទូរស័ព្ទ"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ទូរស័ព្ទ"</string>
     <string name="unknown" msgid="6878797917991465859">"មិន​ស្គាល់"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"ខកខាន​ទទួល"</string>
@@ -28,7 +28,7 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"សារ"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"ការ​ហៅ​បិទ​សំឡេង។"</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"បាន​បើក​អូប៉ាល័រ​ទូរស័ព្ទ។"</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"មិន​អាច​និយាយ​បាន​ឥឡូវ​នេះ។ មានការអីដែរ?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"មិន​អាច​និយាយ​បាន​ឥឡូវ​នេះ។ មាន​អ្វី​កើត​ឡើង?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"ខ្ញុំ​នឹង​ហៅ​​​​ទៅ​អ្នក​​វិញ។"</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ខ្ញុំ​នឹង​ហៅ​ទៅ​អ្នក​នៅ​ពេល​ក្រោយ។"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"មិន​អាច​និយាយ​បាន​ទេ​ឥឡូវ​នេះ។ ហៅ​​​​មក​ខ្ញុំ​ពេល​ក្រោយ?"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"បាត់​​ចំនួន​​សារ​ជា​សំឡេង"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"គ្មាន​ចំនួន​សារ​ជា​សំឡេង​​ត្រូវ​បាន​រក្សា​ទុក​នៅ​លើ​ស៊ី​ម​កាត​ទេ​។"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"បន្ថែម​លេខ"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"ធ្វើ​ <xliff:g id="NEW_APP">%s</xliff:g> ជា​កម្មវិធី​ទូរសព្ទ​លំនាំដើម​របស់​អ្នក​ដែរ ឬ​ទេ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"កំណត់​លំនាំដើម"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"បោះបង់"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> នឹង​អាច​ដាក់ចុះ និង​ត្រួតពិនិត្យ​​ទិដ្ឋភាព​ការ​ហៅ​ទាំងអស់។ មាន​តែ​កម្មវិធី​ដែល​អ្នក​ទុកចិត្ត​ប៉ុណ្ណោះ​​អាច​​ត្រូវ​បាន​​កំណត់​ជា​កម្មវិធី​ទូរសព្ទ​លំនាំដើម។"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"លេខដែល​បានរារាំង"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"អ្នក​នឹង​មិន​ទទួល​បាន​ការ​ហៅទូរសព្ទ ឬ​សារ​​ពី​លេខ​ដែល​បាន​​រារាំង​ឡើយ។"</string>
-    <string name="block_number" msgid="1101252256321306179">"បញ្ចូល​លេខ"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"ឈប់រារាំង <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ឬ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"ឈប់រារាំង"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"រារាំងការហៅ និងការផ្ញើសារពី"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"លេខទូរសព្ទ"</string>
-    <string name="block_button" msgid="8822290682524373357">"រារាំង"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"មានតែម្ចាស់ឧបករណ៍តែប៉ុណ្ណោះដែលអាចមើល និងគ្រប់គ្រងបញ្ជីរារាំងបាន"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"ឈប់​ទប់ស្កាត់"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"បាន​បិទ​ការ​ទប់ស្កាត់​​​ជា​បណ្ដោះអាសន្ន"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"បន្ទាប់​ពី​អ្នក​ចុច​ហៅ ឬ​ផ្ញើ​សារ​លេខ​​អាសន្ន ការ​ទប់ស្កាត់​​ត្រូវ​បាន​បិទ​​ដើម្បី​​ប្រាកដ​ថា​សេវាកម្ម​អាសន្ន​អាច​ទាក់ទង​អ្នក​បាន។"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"បើក​ដំណើរការ​ឡើងវិញ​ឥឡូវនេះ"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"បាន​ទប់ស្កាត់ <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"បាន​អនុញ្ញាត <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"មិន​អាច​​​ទប់ស្កាត់​លេខ​បន្ទាន់​បាន​ទេ។"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ត្រូវ​បាន​ទប់ស្កាត់​រួច​ហើយ។"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"កំពុងប្រើកម្មវិធីហៅផ្ទាល់ខ្លួនដើម្បីធ្វើការហៅទូរស័ព្ទ"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ប្តូរកម្មវិធីហៅទូរស័ព្ទលំនាំដើម?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"ប្រើ <xliff:g id="NEW_APP">%1$s</xliff:g> ជំនួសឲ្យ <xliff:g id="CURRENT_APP">%2$s</xliff:g> ជាកម្មវិធីហៅទូរស័ព្ទលំនាំដើមរបស់អ្នក?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"ប្រើ <xliff:g id="NEW_APP">%s</xliff:g> ជាកម្មវិធីហៅទូរស័ព្ទលំនាំដើមរបស់អ្នក?"</string>
 </resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 86834d9..60f8caa 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -16,9 +16,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"ಕರೆ ನಿರ್ವಹಣೆ"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ಫೋನ್ ಕರೆ ನಿರ್ವಹಣೆ"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ಫೋನ್"</string>
-    <string name="unknown" msgid="6878797917991465859">"ಅಪರಿಚಿತ"</string>
+    <string name="unknown" msgid="6878797917991465859">"ಅಜ್ಞಾತ"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"ಮಿಸ್ಡ್‌ ಕಾಲ್‌"</string>
     <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"ಮಿಸ್ಡ್‌ ಕೆಲಸದ ಕರೆ"</string>
     <string name="notification_missedCallsTitle" msgid="1361677948941502522">"ತಪ್ಪಿದ ಕರೆಗಳು"</string>
@@ -33,7 +33,7 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ನಾನು ನಂತರ ನಿಮಗೆ ಕರೆ ಮಾಡುತ್ತೇನೆ."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ಈಗ ಮಾತನಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಂತರ ಮಾಡುವಿರಾ?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ತ್ವರಿತ ಪ್ರತಿಕ್ರಿಯೆಗಳು"</string>
-    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ತ್ವರಿತ ಪ್ರತಿಕ್ರಿಯೆ ಎಡಿಟ್ ಮಾಡಿ"</string>
+    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ತ್ವರಿತ ಪ್ರತಿಕ್ರಿಯೆ ಸಂಪಾದಿಸಿ"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
     <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"ತ್ವರಿತ ಪ್ರತಿಕ್ರಿಯೆ"</string>
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"<xliff:g id="PHONE_NUMBER">%s</xliff:g> ಗೆ ಸಂದೇಶ ಕಳುಹಿಸಲಾಗಿದೆ."</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"ಧ್ವನಿಮೇಲ್‌ ಸಂಖ್ಯೆಯು ಕಾಣೆಯಾಗಿದೆ"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"ಸಿಮ್‌ ಕಾರ್ಡ್‌ನಲ್ಲಿ ಯಾವುದೇ ಧ್ವನಿಮೇಲ್‌ ಸಂಖ್ಯೆಯನ್ನು ಸಂಗ್ರಹಿಸಿಲ್ಲ."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> ಅನ್ನು ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಫೋನ್ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿ ಮಾಡುವುದೇ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ಡಿಫಾಲ್ಟ್ ಹೊಂದಿಸಿ"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"ರದ್ದುಮಾಡಿ"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ಗೆ ನಿಮ್ಮ ಕರೆಗಳ ಎಲ್ಲಾ ಅಂಶಗಳನ್ನು ನಿಯಂತ್ರಿಸಲು ಮತ್ತು ಕರೆಗಳನ್ನು ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ. ನೀವು ವಿಶ್ವಾಸವಿರಿಸಿರುವಂತಹ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಮಾತ್ರ ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿ ಹೊಂದಿಸಬೇಕು."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"ನಿರ್ಬಂಧಿಸಲಾದ ಸಂಖ್ಯೆಗಳು"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"ನಿರ್ಬಂಧಿಸಲಾದ ಸಂಖ್ಯೆಗಳಿಂದ ಕರೆಗಳು ಅಥವಾ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ನೀವು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ."</string>
-    <string name="block_number" msgid="1101252256321306179">"ಸಂಖ್ಯೆ ಸೇರಿಸಿ"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ನಿರ್ಬಂಧ ತೆಗೆಯುವುದೇ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"ನಿರ್ಬಂಧ ತೆಗೆಯಿರಿ"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ಇದರಿಂದ ಬರುವ ಕರೆಗಳು ಮತ್ತು ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ಫೋನ್ ಸಂಖ್ಯೆ"</string>
-    <string name="block_button" msgid="8822290682524373357">"ನಿರ್ಬಂಧಿಸು"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"ಸಾಧನ ಮಾಲೀಕರು ಮಾತ್ರ ನಿರ್ಬಂಧಿಸಿದ ಸಂಖ್ಯೆಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"ನಿರ್ಬಂಧ ತೆಗೆಯಿರಿ"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ನಿರ್ಬಂಧಿಸುವಿಕೆ ತಾತ್ಕಾಲಿಕವಾಗಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"ನೀವು ತುರ್ತು ಸಂಖ್ಯೆಯನ್ನು ಡಯಲ್‌ ಮಾಡಿದ ಅಥವಾ ಪಠ್ಯ ಸಂದೇಶ ಕಳುಹಿಸಿದ ನಂತರ, ತುರ್ತು ಸೇವೆಗಳಲ್ಲಿ ನಿಮ್ಮನ್ನು ಸಂಪರ್ಕಿಸಬಹುದು ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ನಿರ್ಬಂಧಿಸುವಿಕೆ ಆಫ್‌ ಮಾಡಲಾಗಿದೆ."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"ಇದೀಗ ಮರು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> ನಿರ್ಬಂಧ ತೆಗೆಯಲಾಗಿದೆ"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"ತುರ್ತು ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ಅನ್ನು ಈಗಾಗಲೇ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"ಕರೆ ಮಾಡಲು ವೈಯಕ್ತಿಕ ಡಯಲರ್ ಬಳಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ಡೀಫಾಲ್ಟ್ ಡಯಲರ್ ಅಪ್ಲಿಕೇಶನ್ ಬದಲಾಯಿಸುವುದೇ?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> ಬದಲಿಗೆ <xliff:g id="NEW_APP">%1$s</xliff:g> ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಡಯಲರ್ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿ ಬಳಸುವುದೇ?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ಡಯಲರ್ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿ ಬಳಸುವುದೇ?"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 9cf688a..4c51e98 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"통화 관리"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"통화 관리"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"전화"</string>
     <string name="unknown" msgid="6878797917991465859">"알 수 없음"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"부재중 전화"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"음성사서함 번호 없음"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 카드에 저장된 음성사서함 번호가 없습니다."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"번호 추가"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g>을(를) 기본 전화 앱으로 설정하나요?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"기본으로 설정"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"취소"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g>은(는) 모든 전화를 걸고 제어할 수 있습니다. 신뢰할 수 있는 앱만 기본 전화 앱으로 설정하세요."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"차단된 번호"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"차단한 번호에서 걸려오는 전화나 문자를 더 이상 받지 않습니다."</string>
-    <string name="block_number" msgid="1101252256321306179">"번호 추가"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>번을 차단 해제하시겠습니까?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"차단 해제"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"전화와 문자 메시지를 차단할 번호"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"전화번호"</string>
-    <string name="block_button" msgid="8822290682524373357">"차단"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"기기 소유자만 차단된 번호를 보고 관리할 수 있습니다."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"차단 해제"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"차단 기능이 일시적으로 중지됨"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"긴급 전화번호로 전화를 걸거나 문자를 보내면 긴급 서비스를 사용할 수 있도록 차단 기능이 중지됩니다."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"지금 다시 사용 설정"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>번은 차단되었습니다."</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>번은 차단 해제되었습니다."</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"긴급 전화번호를 차단할 수 없습니다."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>번은 이미 차단되었습니다."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"전화를 걸 때 개인 다이얼러 사용"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"기본 다이얼러 앱을 변경하시겠습니까?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> 대신 <xliff:g id="NEW_APP">%1$s</xliff:g>을(를) 기본 다이얼러 앱으로 사용하시겠습니까?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g>을(를) 기본 다이얼러 앱으로 사용하시겠습니까?"</string>
 </resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 31d81df..c805165 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Чалууларды башкаруу"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Телефон чалууларын башкаруу"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Телефон"</string>
     <string name="unknown" msgid="6878797917991465859">"Белгисиз"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Кабыл алынбаган чалуу"</string>
@@ -31,7 +31,7 @@
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Азыр сүйлөшө албайм. Эмне болду?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Кайра чалам."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Кийинчерээк чалып коём."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Сүйлөшө албайм. Ананыраак чалчы?"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Сүйлөшө албайм. Кийин чаласызбы?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Тез жооптор"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Тез жоопторду өзгөртүү"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Үн почтасынын номери жок болуп жатат"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM-картада сакталган үн почтасынын номери жок."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Номер кошуу"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> колдонмосун демейки телефон колдонмосу кыласызбы?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Демейки шартта колдонуу"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Жокко чыгаруу"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> колдонмосу аркылуу чалып, алардын параметрлерин жөндөй аласыз. Демейки чалуулар үчүн ишеничтүү колдонмолорду гана пайдалануу керек."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Бөгөттөлгөн номерлер"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Бөгөттөлгөн номерлерден эч ким чалып же билдирүү жөнөтө албайт."</string>
-    <string name="block_number" msgid="1101252256321306179">"Номер кошуу"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> бөгөттөн чыгарылсынбы?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Бөгөттөн чыгаруу"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Төмөнкү номерден келген чалуулар менен SMS билдирүүлөрүн бөгөттөө"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Телефон номери"</string>
-    <string name="block_button" msgid="8822290682524373357">"Бөгөттөө"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Бөгөттөлгөн номерлерди түзмөк ээси гана көрүп жана башкара алат."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Бөгөттөн чыгаруу"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Бөгөттөө функциясы убактылуу өчүк"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Өзгөчө кырдаалдар кызматынын номерин терип же ошол номерге билдирүү жөнөтүлгөндөн кийин түзмөк бөгөттөн чыгарылат."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Кайра жандыруу"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> бөгөттөлдү"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> бөгөттөн чыгарылды"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Өзгөчө кырдаал кызматынын номери бөгөттөлбөй жатат."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> мурунтан эле бөгөттөлгөн."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Чалууларды аткаруу үчүн жеке тергич колдонулууда"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Демейки номер тергич колдонмо өзгөрүлсүнбү?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Демейки номер тергич колдонмо катары мурунку <xliff:g id="CURRENT_APP">%2$s</xliff:g> колдонмонун ордуна <xliff:g id="NEW_APP">%1$s</xliff:g> бул колдонмо колдонулсунбу?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Демейки номер тергич колдонмо катары <xliff:g id="NEW_APP">%s</xliff:g> колдонулсунбу?"</string>
 </resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index adc0d1a..02eda11 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"ການຈັດການການໂທ"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ການ​ຈັດ​ການການ​ໂທລະ​ສັບ"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ໂທລະສັບ"</string>
     <string name="unknown" msgid="6878797917991465859">"ບໍ່ຮູ້ຈັກ"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"ສາຍທີ່ບໍ່ໄດ້ຮັບ"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"ບໍ່ມີເບີຂໍ້ຄວາມສຽງ"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"ບໍ່ມີເບີຂໍ້ຄວາມສຽງຖືກບັນທຶກໃນ SIM card."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"ເພີ່ມໝາຍເລກ"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"ຕັ້ງໃຫ້ <xliff:g id="NEW_APP">%s</xliff:g> ເປັນແອັບໂທລະສັບເລີ່ມຕົ້ນຂອງທ່ານບໍ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ຕັ້ງເປັນຄ່າເລີ່ມຕົ້ນ"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"ຍົກເລີກ"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ຈະສາມາດໂທ ແລະ ຄວບຄຸມທຸກແງ່ມຸມຂອງການໂທຕ່າງໆໄດ້. ທ່ານຄວນຕັ້ງໃຫ້ແອັບໂທລະສັບທີ່ທ່ານໄວ້ໃຈໄດ້ເທົ່ານັ້ນເປັນແອັບເລີ່ມຕົ້ນ."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"ເບີໂທລະສັບທີ່ບລັອກໄວ້"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"ທ່ານຈະບໍ່ໄດ້ຮັບສາຍ ຫຼື ຂໍ້ຄວາມຈາກເບີທີ່ບລັອກໄວ້."</string>
-    <string name="block_number" msgid="1101252256321306179">"ເພີ່ມເບີໂທລະສັບ"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"ຍົກເລີກການບລັອກ <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ບໍ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"ຍົກເລີກການບລັອກ"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ບລັອກການໂທ ແລະ ຂໍ້ຄວາມຈາກ"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ເບີໂທລະສັບ"</string>
-    <string name="block_button" msgid="8822290682524373357">"ບລັອກ"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"ມີແຕ່ເຈົ້າຂອງອຸປະກອນເທົ່ານັ້ນທີ່ສາມາດເບິ່ງ ແລະ ຈັດການເບີທີ່ຖືກບລັອກໄວ້."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"ຍົກເລີກການບລັອກ"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ຍົກເລີກການບລັອກຊົ່ວຄາວ"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"ຫຼັງຈາກທີ່ທ່ານໂທ ຫຼື ສົ່ງຂໍ້ຄວາມຫາເບີສຸກເສີນໃດໜຶ່ງແລ້ວ, ການບລັອກຈະຖືກປິດໄວ້ເພື່ອໃຫ້ແນ່ໃຈວ່າບໍລິການສຸກເສີນດັ່ງກ່າວຈະສາມາດຕິດຕໍ່ຫາທ່ານໄດ້."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"ເປີດໃຊ້ຄືນໃໝ່ດຽວນີ້"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"ບລັອກ <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ແລ້ວ"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"ປົດບລັອກ <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> ແລ້ວ"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"ບໍ່ສາມາດບລັອກເບີໂທສຸກເສີນໄດ້."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ຖືກບລັອກຢູ່ກ່ອນແລ້ວ."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"ໃຊ້ແປ້ນໂທສ່ວນຕົວເພື່ອໂທອອກ"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ປ່ຽນ​ແປງ​ແອັບ​ແຜ່ນ​ກົດ​ມາດ​ຕະ​ຖານ?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"ໃຊ້ <xliff:g id="NEW_APP">%1$s</xliff:g> ແທນ <xliff:g id="CURRENT_APP">%2$s</xliff:g> ເປັນ​ແອັບ​ແຜ່ນ​ກົດ​ມາດ​ຕະ​ຖານ​ຂອງ​ທ່ານ?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"ໃຊ້ <xliff:g id="NEW_APP">%s</xliff:g> ເປັນ​ແອັບ​ແຜ່ນ​ກົດ​ມາດ​ຕະ​ຖານ​ຂອງ​ທ່ານ?"</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 00bc892..c801acd 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Skambučių tvarkymas"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefono skambučių tvarkymas"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefonas"</string>
     <string name="unknown" msgid="6878797917991465859">"Nežinomas"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Praleistas skambutis"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Trūksta balso pašto numerio"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kortelėje nėra išsaugoto balso pašto numerio."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Pridėti numerį"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Nustatyti „<xliff:g id="NEW_APP">%s</xliff:g>“ kaip numatytąją telefono programą?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Nustatyti numatytuosius nustatymus"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Atšaukti"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"„<xliff:g id="NEW_APP">%s</xliff:g>“ galės atlikti ir valdyti įvairius skambučius. Tik patikimą programą turėtumėte nustatyti kaip numatytąją telefono programą."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Užblokuoti numeriai"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Negausite skambučių ar teksto pranešimų iš užblokuotų numerių."</string>
-    <string name="block_number" msgid="1101252256321306179">"Pridėti numerį"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Panaikinti <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> blokavimą?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Atblokuoti"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokuoti skambučius ir teksto pranešimus nuo"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefono numeris"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokuoti"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Tik įrenginio savininkas gali peržiūrėti ir tvarkyti užblokuotus numerius."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Panaikinti blokavimą"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokavimo funkcija laikinai išjungta"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Surinkus pagalbos numerį ar išsiuntus juo pranešimą blokavimo funkcija išjungiama, siekiant užtikrinti, kad pagalbos tarnybos galėtų su jumis susisiekti."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Dabar įgalinti iš naujo"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> užblokuotas"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> blokavimas panaikintas"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Negalima užblokuoti pagalbos numerio."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> jau užblokuotas."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Asmeninio numerio rinkiklio naudojimas skambinant"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Pakeisti numatytąją numerio rinkiklio programą?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Naudoti „<xliff:g id="NEW_APP">%1$s</xliff:g>“ vietoje „<xliff:g id="CURRENT_APP">%2$s</xliff:g>“ kaip numatytąją numerio rinkiklio programą?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Naudoti „<xliff:g id="NEW_APP">%s</xliff:g>“ kaip numatytąją numerio rinkiklio programą?"</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 2238f9d..8f86db9 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Zvanu pārvaldība"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Tālruņa zvanu pārvaldība"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Tālrunis"</string>
     <string name="unknown" msgid="6878797917991465859">"Nezināms"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Neatbildēts zvans"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Trūkst balss pasta numura"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartē neviens balss pasta numurs nav saglabāts."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Pievienot numuru"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Vai iestatīt <xliff:g id="NEW_APP">%s</xliff:g> kā tālruņa noklusējuma lietotni?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Iestatīt kā noklusējumu"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Atcelt"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"Lietotne <xliff:g id="NEW_APP">%s</xliff:g> varēs veikt zvanus un kontrolēt visas zvanu funkcijas. Tālruņa noklusējuma lietotnes iestatīšanai izmantojiet tikai uzticamas lietotnes."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Bloķētie numuri"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Jūs nesaņemsiet zvanus vai īsziņas no bloķētajiem numuriem."</string>
-    <string name="block_number" msgid="1101252256321306179">"Pievienot numuru"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Vai atbloķēt numuru <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Atbloķēt"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloķēt ienākošos zvanus un īsziņas no numura"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Tālruņa numurs"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloķēt"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Tikai ierīces īpašnieks var skatīt un pārvaldīt bloķētos numurus."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Atbloķēt"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Bloķēšana īslaicīgi izslēgta"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Pēc avārijas dienesta numura sastādīšanas vai īsziņas sūtīšanas uz to tiek izslēgta bloķēšana, lai avārijas dienesti varētu ar jums sazināties."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Atkārtoti iespējot tūlīt"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bloķēts"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> atbloķēts"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Ārkārtas numuru nevar bloķēt."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> jau ir bloķēts."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Zvans tiek veikts, izmantojot personisko numura sastādītāju"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Vai mainīt numura sastādītāja noklusējuma lietotni?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Vai lietotnes <xliff:g id="CURRENT_APP">%2$s</xliff:g> vietā izmantot <xliff:g id="NEW_APP">%1$s</xliff:g> kā numura sastādītāja noklusējuma lietotni?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Vai izmantot <xliff:g id="NEW_APP">%s</xliff:g> kā numura sastādītāja noklusējuma lietotni?"</string>
 </resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index bc47335..6ce21c0 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Управување со повик"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Управување со телефонски повици"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Телефон"</string>
     <string name="unknown" msgid="6878797917991465859">"Непознато"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Пропуштен повик"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Недостасува број на говорна пошта"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Нема мемориран број на говорна пошта на СИМ картичката."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Додај број"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Да се направи <xliff:g id="NEW_APP">%s</xliff:g> ваша стандардна апликација Телефон?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Поставете стандардна"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Откажете"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ќе може да ги поставува и контролира сите аспекти на повикувањето. Само апликации на кои им веруваш треба да се поставуваат како стандардната апликација Телефон."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Блокирани броеви"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Нема да добивате повици или SMS од блокирани броеви."</string>
-    <string name="block_number" msgid="1101252256321306179">"Додај број"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Одблокирајте го <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Одблокирај"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Блокирај повици и пораки од"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Телефонски број"</string>
-    <string name="block_button" msgid="8822290682524373357">"Блокирај"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Само сопственикот на уредот може да ги прикаже и да управува со блокираните броеви."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Одблокирај"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Блокирањето е привремено исклучено"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Откако ќе повикате или ќе испратите SMS на број за итни случаи, блокирањето се исклучува за да може да ве контактираат службите за итни случаи."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Овозможи сега повторно"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> е блокиран"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> е деблокиран"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Бројот за итни случаи не може да се блокира."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> е веќе блокиран."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Користење на личниот бирач за остварување повик"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Смени ја стандардната апликација Бирач?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Користи <xliff:g id="NEW_APP">%1$s</xliff:g> наместо <xliff:g id="CURRENT_APP">%2$s</xliff:g> како стандардна апликација за бирање?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Користи <xliff:g id="NEW_APP">%s</xliff:g> како стандардна апликација за бирање?"</string>
 </resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index d16e447..e51f662 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"കോൾ മാനേജുമെന്റ്"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ഫോൺ കോൾ മാനേജ്‌മെന്റ്"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ഫോണ്‍"</string>
     <string name="unknown" msgid="6878797917991465859">"അജ്ഞാതം"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"മിസ്‌ഡ് കോൾ"</string>
@@ -32,7 +32,7 @@
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"ഞാൻ നിങ്ങളെ ഉടൻ തിരിച്ചുവിളിക്കാം."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ഞാൻ നിങ്ങളെ പിന്നീട് വിളിക്കാം."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ഇപ്പോൾ സംസാരിക്കാനാകില്ല. എന്നെ പിന്നീട് വിളിക്കാമോ?"</string>
-    <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"അതിവേഗ പ്രതികരണങ്ങൾ"</string>
+    <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ദ്രുത പ്രതികരണങ്ങൾ"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"പ്രതികരണം എഡിറ്റുചെയ്യൂ"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
     <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"ദ്രുത പ്രതികരണം"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"വോയ്‌സ്മെയിൽ നമ്പർ കാണുന്നില്ല"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"സിം കാർഡിൽ വോയ്‌സ്‌മെയിൽ നമ്പറൊന്നും സംഭരിച്ചിട്ടില്ല."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"നമ്പർ ചേർക്കുക"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> എന്നതിനെ നിങ്ങളുടെ ഡിഫോൾട്ട് ഫോൺ ആപ്പാക്കണോ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ഡിഫോൾട്ട് ഫോൺ ആപ്പ് സജ്ജമാക്കുക"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"റദ്ദാക്കുക"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ആപ്പിന് എല്ലാ തരത്തിലുമുള്ള കോളുകൾ ചെയ്യാനും നിയന്ത്രിക്കാനുമാവും. നിങ്ങൾക്ക് വിശ്വാസമുള്ള ആപ്‌സിനെ മാത്രമേ ഡിഫോൾട്ട് ഫോൺ ആപ്പായി സജ്ജമാക്കാവൂ."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"ബ്ലോക്കുചെയ്ത നമ്പറുകൾ"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"ബ്ലോക്കുചെയ്‌ത നമ്പറുകളിൽ നിന്ന് നിങ്ങൾക്ക് കോളുകളോ സന്ദേശങ്ങളോ ലഭിക്കില്ല."</string>
-    <string name="block_number" msgid="1101252256321306179">"ഒരു നമ്പർ ചേർക്കുക"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> അൺബ്ലോക്കുചെയ്യണോ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"അൺബ്ലോക്കുചെയ്യുക"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ഇനിപ്പറയുന്നതിൽ നിന്നുള്ള കോളുകളും ടെക്സ്റ്റുകളും ബ്ലോക്കുചെയ്യുക"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ഫോൺ നമ്പർ"</string>
-    <string name="block_button" msgid="8822290682524373357">"ബ്ലോക്കുചെയ്യുക"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"ബ്ലോക്കുചെയ്ത നമ്പറുകൾ ഉപകരണ ഉടമയ്ക്ക് മാത്രമേ കാണാനും മാനേജുചെയ്യാനും കഴിയൂ."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"അൺബ്ലോക്കുചെയ്യുക"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ബ്ലോക്കുചെയ്യൽ താൽക്കാലികമായി ഓഫാണ്"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"നിങ്ങൾ ഒരു എമർജൻസി നമ്പർ ഡയൽ ചെയ്‌ത് കഴിയുമ്പോഴോ അതിലേക്ക് സന്ദേശമയച്ചുകഴിയുമ്പോഴോ, എമർജൻസി സേവനങ്ങൾ നിങ്ങളിലേക്ക് എത്തുമെന്ന് ഉറപ്പാക്കാൻ കോൾ ബ്ലോക്കിംഗ് ഓഫാക്കും."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"ഇപ്പോൾ വീണ്ടും പ്രവർത്തനക്ഷമമാക്കുക"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ബ്ലോക്കുചെയ്‌തു"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> അൺബ്ലോക്കുചെയ്‌തു"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"അടിയന്തര നമ്പർ ബ്ലോക്കുചെയ്യാനാകുന്നില്ല."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> മുമ്പേതന്നെ ബ്ലോക്കുചെയ്‌തതാണ്."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"കോൾ ചെയ്യുന്നതിന് സ്വകാര്യ ഡയലർ ഉപയോഗിക്കുന്നു"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"സ്ഥിര ഡയലർ ആപ്പ് മാറ്റണോ?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> എന്നതിനുപകരം <xliff:g id="NEW_APP">%1$s</xliff:g> എന്നതിനെ നിങ്ങളുടെ സ്ഥിര ഡയലർ ആപ്പ് ആയി ഉപയോഗിക്കണോ?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> എന്നതിനെ നിങ്ങളുടെ സ്ഥിര ഡയലർ ആപ്പ് ആയി ഉപയോഗിക്കണോ?"</string>
 </resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 8e0b39b..12a17aa 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Дуудлагын удирдлага"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Гар утасны Дуудлагын Удирдлага"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Утас"</string>
     <string name="unknown" msgid="6878797917991465859">"Тодорхойгүй"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Аваагүй дуудлага"</string>
@@ -25,15 +25,15 @@
     <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> аваагүй дуудлага"</string>
     <string name="notification_missedCallTicker" msgid="504686252427747209">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>-н аваагүй дуудлага"</string>
     <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Буцааж залгах"</string>
-    <string name="notification_missedCall_message" msgid="3049928912736917988">"Мессэж"</string>
+    <string name="notification_missedCall_message" msgid="3049928912736917988">"Зурвас"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Дууг хаасан."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Чанга яригчийг идэвхжүүлсэн."</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Ярих боломжгүй байна. Сонин юу байна?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Би тань руу одоо буцаагаад залгая."</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Би тань руу яг одоо буцаагаад залгана."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Би тань руу дараа залгана."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ярих боломжгүй байна. Дараа залгах уу?"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Одоо ярих боломжгүй байна. Дараа надруу залгах уу?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Шуурхай хариунууд"</string>
-    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Шуурхай хариуг засах"</string>
+    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Шуурхай хариунуудыг засах"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
     <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Шуурхай хариу"</string>
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Зурвасыг <xliff:g id="PHONE_NUMBER">%s</xliff:g> руу илгээв."</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Дуут шуудангийн дугаар байхгүй"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM карт дээр дуут шуудангийн дугаар хадгалагдаагүй байна."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Дугаар нэмэх"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g>-г өөрийн өгөгдмөл Утасны апп болгох уу?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Өгөгдмөл болгох"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Цуцлах"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> бүх төрлийн дуудлага хийх, хянах боломжтой болно. Зөвхөн өөрийн итгэдэг апп-г өгөгдмөл Утасны апп-р тохируулах нь зүйтэй."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Блоклосон дугаар"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Та хориглосон дугаараас дуудлага, мессеж хүлээн авахгүй."</string>
-    <string name="block_number" msgid="1101252256321306179">"Дугаар нэмэх"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>-г блокоос гаргах уу?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Блокоос гаргах"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Дараахаас ирэх дуудлага, текстийг блоклох"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Утасны дугаар"</string>
-    <string name="block_button" msgid="8822290682524373357">"Блоклох"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Зөвхөн энэ төхөөрөмжийн эзэн блоклосон дугаарыг харж, өөрчлөх боломжтой."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Хоригийг тайлах"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Дугаар хориглох түр хугацаанд идэвхгүй болсон"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Түргэн тусламжийн дугаар руу залгах буюу мессеж бичсэний дараа түргэн тусламжаас тантай холбогдох боломжтой байлгахын тулд дугаар хориглохыг идэвхгүй болгоно."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Одоо дахин идэвхжүүлэх"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>-г хориглосон"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>-н хоригийг авсан"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Яаралтай дугаарыг хориглох боломжгүй."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>-г аль хэдийн хориглосон байна."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Дуудлага хийхийн тулд хувийн залгагчийг ашиглаж байна"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Үндсэн залгагч апп-ыг өөрчлөх үү?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="NEW_APP">%1$s</xliff:g>-ыг <xliff:g id="CURRENT_APP">%2$s</xliff:g>-ын оронд таны үндсэн залгагч апп болгон тохируулах уу?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g>-ыг таны үндсэн залгагч апп болгон тохируулах уу?"</string>
 </resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index a4f55fb..6c9a25d 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"कॉल व्यवस्थापन"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"फोन कॉल व्यवस्थापन"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"फोन"</string>
     <string name="unknown" msgid="6878797917991465859">"अज्ञात"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"सुटलेला कॉल"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"व्हॉइसमेल नंबर गहाळ"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"सिम कार्डवर कोणताही व्हॉइसमेल नंबर संचयित केला नाही."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"नंबर जोडा"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> ला आपला डीफॉल्ट अॅप बनवायचा?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"डीफॉल्ट म्हणून सेट करा"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"रद्द करा"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> कॉल करण्यात आणि त्याचे सर्व पैलू नियंत्रित करण्‍यात सक्षम असेल. ज्या अॅप्सवर आपला विश्वास आहे फक्त त्यांंनाच आपला डीफॉल्ट फोन अॅप म्हणून सेट करावे."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"अवरोधित केलेले नंबर"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"आपल्याला अवरोधित नंबरवरून कॉल किंवा मजकूर प्राप्त होणार नाहीत."</string>
-    <string name="block_number" msgid="1101252256321306179">"एक नंबर जोडा"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> अनावरोधित करायचा?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"अनावरोधित करा"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"यावरील कॉल आणि मजकूर अवरोधित करा"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"फोन नंबर"</string>
-    <string name="block_button" msgid="8822290682524373357">"अवरोधित करा"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"फक्त डिव्हाइस मालक अवरोधित केलेले नंबर पाहू आणि व्यवस्थापित करू शकतो."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"अनावरोधित करा"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"अवरोधित करणे तात्पुरते बंद आहे"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"आपण एखादा आणीबाणी नंबर डायल केला किंवा त्यावर मजकूर पाठविल्यानंतर, आणीबाणी सेवा आपल्याशी संपर्क साधू शकतात हे सुनिश्चित करण्यासाठी अवरोधित करणे बंद करते."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"आता पुन्हा-सक्षम करा"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> अवरोधित केला"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> अनावरोधित केला"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"आणीबाणी नंबर अवरोधित करण्यात अक्षम."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> आधीपासून अवरोधित केला आहे."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"कॉल करण्यासाठी वैयक्तिक डायलर वापरणे"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"डीफॉल्ट डायलर अॅप बदलायचा?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"आपला डीफॉल्ट डायलर अॅप म्हणून <xliff:g id="CURRENT_APP">%2$s</xliff:g> ऐवजी <xliff:g id="NEW_APP">%1$s</xliff:g> वापरायचा?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"आपला डीफॉल्ट डायलर अॅप म्हणून <xliff:g id="NEW_APP">%s</xliff:g> वापरायचा?"</string>
 </resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 208dcb1..0504627 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Pengurusan Panggilan"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Pengurusan Panggilan Telefon"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Tidak diketahui"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Panggilan tidak dijawab"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Nombor mel suara tiada"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Tidak ada nombor mel suara disimpan pada kad SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Tambah nombor"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Jadikan <xliff:g id="NEW_APP">%s</xliff:g> apl Telefon lalai anda?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Tetapkan Lalai"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Batal"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> akan dapat membuat dan mengawal semua aspek panggilan. Hanya apl yang anda percayai sahaja yang seharusnya ditetapkan sebagai apl Telefon lalai."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Nombor yang disekat"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Anda tidak akan menerima panggilan atau teks daripada nombor yang disekat."</string>
-    <string name="block_number" msgid="1101252256321306179">"Tambahkan nombor"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Nyahsekat <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Nyahsekat"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Sekat panggilan dan teks daripada"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Nombor telefon"</string>
-    <string name="block_button" msgid="8822290682524373357">"Sekat"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Hanya pemilik peranti boleh melihat dan menguruskan nombor yang disekat."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Nyahsekat"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Sekatan dimatikan untuk sementara waktu"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Sekatan dimatikan selepas anda mendail atau menghantar teks kepada nombor kecemasan untuk memastikan perkhidmatan kecemasan dapat menghubungi anda."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Dayakan semula sekarang"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> disekat"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> dinyahsekat"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Tidak dapat menyekat nombor kecemasan."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> sudah disekat."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Menggunakan pendail peribadi untuk membuat panggilan"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Tukar apl Pendail lalai?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Gunakan <xliff:g id="NEW_APP">%1$s</xliff:g> dan bukannya <xliff:g id="CURRENT_APP">%2$s</xliff:g> sebagai apl pendail lalai anda?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Gunakan <xliff:g id="NEW_APP">%s</xliff:g> sebagai apl pendail lalai anda?"</string>
 </resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index da191da..5db1d5b 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"ခေါ်ဆိုမှုစီမံခန့်ခွဲရေး"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ဖုန်းခေါ်ဆိုခြင်း စီမံမှု"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ဖုန်း"</string>
     <string name="unknown" msgid="6878797917991465859">"အကြောင်းအရာ မသိရှိ"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"လွဲသွားသော ဖုန်းခေါ်မှု"</string>
@@ -28,10 +28,10 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"စာတို"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"နားထောင်ရုံသာ (စကားပြောပိတ်ထားသည်)"</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"စပီကာဖုန်း သုံးလို့ရသည်"</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"အခုပြောလို့မရဘူး။ အကြောင်းထူးရှိလား။"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"အခုပြောလို့မရဘူး။အကြောင်းထူးရှိလား?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"ပြန်ခေါ်လိုက်မယ်နော်"</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"နောက်မှ ပြန်ခေါ်လိုက်မယ်"</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"အခုပြောလို့မရဘူး။ ပြန်ခေါ်ပါလား။"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"အခုပြောလို့မရဘူး။ထပ်ခေါ်နော်?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"အမြန်တုံ့ပြန်ချက်များ"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"အမြန်တုံ့ပြန်ချက်များပြင်ခြင်း"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"အသံစာပို့စနစ် နံပါတ် ပျောက်နေပါသည်"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"ဆင်းမ်ကဒ်ပေါ်တွင် အသံစာပို့စနစ် နံပါတ် သိမ်းဆည်ထားခြင်း မရှိပါ"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"နံပါတ်ထပ်ထည့်ရန်"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> ကို သင့်ဖုန်း၏မူရင်းအက်ပ်အဖြစ် ထားမလား။"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"မူရင်း သတ်မှတ်ရန်"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"မလုပ်တော့"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> သည် ခေါ်ဆိုမှုများကို ဘက်စုံပြုလုပ်ထိန်းချုပ်သွားနိုင်မည်ဖြစ်သည်။ သင်ယုံကြည်သော အက်ပ်များကိုသာ မူရင်း Phone အက်ပ်အဖြစ် သတ်မှတ်သင့်ပါသည်။"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"ပိတ်ဆို့ထားသည့် နံပါတ်များ"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"သင်သည် ဘလော့ခ်လုပ်ထားသော နံပါတ်များမှ ဖုန်းခေါ်ခြင်း (သို့) စာသားပို့ခြင်းတို့ကို လက်ခံရရှိမည် မဟုတ်ပါ။"</string>
-    <string name="block_number" msgid="1101252256321306179">"နံပါတ်တစ်ခု ထည့်ပါ"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ကို ပိတ်ဆို့မှုပြန်ဖွင့်မလား။"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"ပိတ်ဆို့မှုပြန်ဖွင့်ပါ"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ဖော်ပြပါပုဂ္ဂိုလ်ထံမှ စာနှင့် ခေါ်ဆိုမှုများကို ပိတ်ဆို့ပါ"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ဖုန်းနံပါတ်"</string>
-    <string name="block_button" msgid="8822290682524373357">"ပိတ်ဆို့ပါ"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"ပိတ်ဆို့ထားသည့် နံပါတ်များကို စက်ပစ္စည်းပိုင်ရှင်သာလျှင် ကြည့်ရှု၍ စီမံခန့်ခွဲနိုင်ပါသည်။"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"မပိတ်ဆို့တော့ပါ"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ဘလော့ခ်လုပ်ခြင်းကို ပိတ်ထားပါသည်"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"သင် အရေးပေါ်နံပါတ်တစ်ခုကို ဖုန်းခေါ် (သို့) စာသားပို့ပြီးနောက် အရေးပေါ်ဝန်ဆောင်မှုများက သင့်ကို ဆက်သွယ်နိုင်ကြောင်း သေချာစေရန် ဘလော့ခ်လုပ်ခြင်းကို ပိတ်ထားပါသည်။"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"ယခု ပြန်ဖွင့်လိုက်ပါ"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ကို ပိတ်ဆို့ပြီးပါပြီ"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> ကို မပိတ်ဆို့တော့ပါ"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"အရေးပေါ်နံပါတ်ကို  ပိတ်ဆို့၍ မရပါ။"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ကို ပိတ်ဆို့ထားပြီး ဖြစ်သည်။"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"ဖုန်းခေါ်ဆိုမှုပြုလုပ်ရန် ကိုယ်ရေးကိုယ်တာ ဖုန်းခေါ်ဆိုမှုစနစ်ကို အသုံးပြုခြင်း"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"စက်ရုံထုတ်ဖုန်းခေါ်အပ်ဖ်ကိုပြောင်းလိုပါသလား"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> အစား <xliff:g id="NEW_APP">%1$s</xliff:g> ကိုသင့်ရဲ့ စက်ရုံထုတ်ဖုန်းခေါ်အပ်ဖ်အဖြစ် သုံးလိုပါသလား"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> ကိုသင့်ရဲ့စက်ရုံထုတ်ဖုန်းခေါ်အပ်ဖ်အဖြစ် သုံးလိုပါသလား"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 230e9c3..04588eb 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Administrering av samtaler"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Administrering av telefonsamtaler"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Ukjent"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Tapt anrop"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Mangler nummer til talepostkasse"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Det er ikke lagret noe nummer for talepostkasse på SIM-kortet."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Legg til nummer"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Vil du bruke <xliff:g id="NEW_APP">%s</xliff:g> som standard telefonapp?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Angi som standard"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Avbryt"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> kan håndtere alt som har med telefonanrop å gjøre. Bruk bare apper du stoler på som standard telefonapp."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokkerte numre"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Du mottar ingen anrop eller tekstmeldinger fra blokkerte numre."</string>
-    <string name="block_number" msgid="1101252256321306179">"Legg til et nummer"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Vil du oppheve blokkeringen av <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Opphev blokkering"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokkér anrop og meldinger fra"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonnummer"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokkér"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Bare enhetseieren kan se og administrere blokkerte numre."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Opphev blokkeringen"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokkeringen er midlertidig slått av"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Når du har ringt eller sendt tekstmelding til et nødnummer, blir blokkeringen slått av, sånn at nødtjenesten har mulighet til å kontakte deg."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Slå på igjen nå"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> er blokkert"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Blokkeringen av <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> er opphevet"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Kan ikke blokkere nødnumre."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> er allerede blokkert."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Ring via den personlige ringeappen"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Vil du endre standard telefonapp?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Vil du bruke <xliff:g id="NEW_APP">%1$s</xliff:g> i stedet for <xliff:g id="CURRENT_APP">%2$s</xliff:g> som standard telefonapp?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Vil du bruke <xliff:g id="NEW_APP">%s</xliff:g> som standard telefonapp?"</string>
 </resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index d1b89bc..a804221 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"कल व्यवस्थापन"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"फोन कल व्यवस्थापन"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"फोन"</string>
     <string name="unknown" msgid="6878797917991465859">"अज्ञात"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"छुटेका कल"</string>
@@ -31,7 +31,7 @@
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"अहिले कुरा गर्न मिल्दैन। के भइरहेको छ?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"मैले तपाईंलाई तुरुन्तै कल गर्ने छु।"</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"म तपाईंलाई पछि कल गर्ने छु।"</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"अहिले कुरा गर्न सक्नु हुन्न। मलाई पछि कल गर्नुहुन्छ?"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"अहिले कुरा गर्न सक्नु हुन्न। मलाई पछि कल गर्नुहोस्?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"द्रुत प्रतिक्रियाहरू"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"द्रुत प्रतिक्रियाहरू सम्पादन गर्नुहोस्"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"भ्वाइसमेल नम्बर हराइरहेको छ"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM कार्डमा कुनै पनि भ्वाइसमेल नम्बर भण्डारण भएको छैन।"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"नम्बर थप्नुहोस्"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"तपाईंको पूर्वनिर्धारित फोन अनुप्रयोग <xliff:g id="NEW_APP">%s</xliff:g> बनाउने हो?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"पूर्वनिर्धारित रूपमा सेट गर्नुहोस्"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"रद्द गर्नुहोस्"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> कलका सबै पक्षहरूलाई स्थापित गर्न र नियन्त्रण गर्न सक्षम हुने छ। तपाईंलाई विश्वास लाग्ने अनुप्रयोगहरूलाई मात्र फोनमा पूर्वनिर्धारित अनुप्रयोगका रूपमा सेट गर्नुपर्छ।"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"रोकिएका नम्बरहरू"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"तपाईँले रोक लगाइएका नम्बरहरूबाट फोन वा पाठ सन्देशहरू प्राप्त गर्नुहुने छैन।"</string>
-    <string name="block_number" msgid="1101252256321306179">"नम्बर थप्नुहोस्"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> लाई अनब्लक गर्ने हो?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"अनब्लक गर्नुहोस्"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"यस नम्बरबाट कल र पाठ सन्देशहरूलाई रोक्नुहोस्"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"फोन नम्बर"</string>
-    <string name="block_button" msgid="8822290682524373357">"रोक्नुहोस्"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"यन्त्रको मालिकले रोकिएका नम्बरहरूलाई हेर्न र व्यवस्थापन गर्न सक्छ।"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"अनब्लक गर्नुहोस्"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"रोक लगाउने काम अस्थायी रूपमा निष्क्रिय छ"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"तपाईँले आपतकालीन नम्बरमा डायल गरेपछि वा पाठ सन्देश पठाएपछि आपतकालीन सेवाहरूले तपाईँलाई सम्पर्क गर्न सकून् भन्ने कुरा सुनिश्चित गर्न कलमाथिको अवरोध निष्क्रिय गरिन्छ।"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"अब पुन:-सक्रिय गर्नुहोस्"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> माथि रोक लगाइयो"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> माथिको रोक हटाइयो"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"आपतकालीन नम्बरमाथि रोक लगाउन सकिएन।"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> लाई पहिले नै रोकिएको छ।"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"कल गर्न व्यक्तिगत डायलर प्रयोग गर्दै"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"पूर्वनिर्धारित डायलर अनुप्रयोग फेर्ने हो?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g>को सट्टामा <xliff:g id="NEW_APP">%1$s</xliff:g>लाई पूर्वनिर्धारित डायलर अनुप्रयोगको रूपमा प्रयोग गर्ने हो?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g>लाई तपाईँको पूर्वनिर्धारित डायलर अनुप्रयोगको रूपमा प्रयोग गर्ने हो?"</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 7f8821a..829bf0b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Oproepbeheer"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefoonoproepbeheer"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefoon"</string>
     <string name="unknown" msgid="6878797917991465859">"Onbekend"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Gemiste oproep"</string>
@@ -31,7 +31,7 @@
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Kan nu niet opnemen. Alles goed?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Ik bel je zo terug."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ik bel je later."</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan nu niet opnemen. Bel je me later?"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan nu niet opnemen. Bel me later."</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Snelle reacties"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Snelle reacties bewerken"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Voicemailnummer ontbreekt"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Er is geen voicemailnummer op de SIM-kaart opgeslagen."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Nummer toevoegen"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Wil je <xliff:g id="NEW_APP">%s</xliff:g> instellen als je standaard telefoon-app?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Standaard instellen"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Annuleren"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> kan oproepen plaatsen en alle aspecten hiervan beheren. Stel alleen apps in als je standaard telefoon-app als je ze vertrouwt."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Geblokkeerde nummers"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Je ontvangt geen oproepen of sms\'jes van geblokkeerde nummers."</string>
-    <string name="block_number" msgid="1101252256321306179">"Een nummer toevoegen"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Blokkering van <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> opheffen?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Blokkering opheffen"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Oproepen en sms\'jes blokkeren van"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefoonnummer"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokkeren"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Alleen de eigenaar van het apparaat kan geblokkeerd nummers bekijken en beheren."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Blokkering opheffen"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokkering tijdelijk uitgeschakeld"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Als je een noodnummer belt of er een sms naartoe stuurt, wordt de blokkering uitgeschakeld om te zorgen dat hulpdiensten contact met je kunnen opnemen."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Nu opnieuw inschakelen"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> geblokkeerd"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Blokkering van <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> opgeheven"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Kan alarmnummer niet blokkeren."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> is al geblokkeerd."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"De persoonlijke kiezer gebruiken om te bellen"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Standaard kiezerapp wijzigen?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="NEW_APP">%1$s</xliff:g> in plaats van <xliff:g id="CURRENT_APP">%2$s</xliff:g> gebruiken als standaard kiezerapp?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> gebruiken als standaard kiezerapp?"</string>
 </resources>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
index 1f4cb3e..41e1a4a 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa-rIN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"ਕਾਲ ਪ੍ਰਬੰਧਨ"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ਫ਼ੋਨ - ਕਾਲ ਪ੍ਰਬੰਧਨ"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ਫ਼ੋਨ"</string>
     <string name="unknown" msgid="6878797917991465859">"ਅਗਿਆਤ"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"ਮਿਸਡ ਕਾਲ"</string>
@@ -28,10 +28,10 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"ਸੁਨੇਹਾ"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"ਕਾਲ ਮਿਊਟ ਕੀਤੀ।"</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"ਸਪੀਕਰਫੋਨ ਸਮਰਥਿਤ।"</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"ਹੁਣ ਗੱਲ ਨਹੀਂ ਹੋ ਸਕਦੀ। ਕੀ ਮਾਜ਼ਰਾ ਹੈ?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"ਮੈਂ ਤੁਹਾਨੂੰ ਹੁਣੇ ਵਾਪਸ ਕਾਲ ਕਰਾਂਗਾ/ਗੀ।"</string>
-    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ਮੈਂ ਤੁਹਾਨੂੰ ਬਾਅਦ ਵਿੱਚ ਕਾਲ ਕਰਾਂਗਾ/ਗੀ।"</string>
-    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ਹੁਣ ਗੱਲ ਨਹੀਂ ਹੋ ਸਕਦੀ। ਕੀ ਮੈਨੂੰ ਬਾਅਦ ਵਿੱਚ ਫ਼ੋਨ ਕਰ ਸਕਦੇ ਹੋ?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"ਹੁਣ ਗੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਕੀ ਹੋ ਰਿਹਾ ਹੈ?"</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"ਮੈਂ ਤੁਹਾਨੂੰ ਹੁਣੇ ਵਾਪਸ ਕਾਲ ਕਰਾਂਗਾ।"</string>
+    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ਮੈਂ ਤੁਹਾਨੂੰ ਬਾਅਦ ਵਿੱਚ ਕਾਲ ਕਰਾਂਗਾ।"</string>
+    <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ਹੁਣ ਗੱਲ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਕੀ ਮੈਨੂੰ ਬਾਅਦ ਵਿੱਚ ਫੋਨ ਕਰ ਸਕਦੇ ਹੋ?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ਤਤਕਾਲ ਜਵਾਬ"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ਤਤਕਾਲ ਜਵਾਬ ਸੰਪਾਦਿਤ ਕਰੋ"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"ਲੁਪਤ ਵੌਇਸਮੇਲ ਨੰਬਰ"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM ਕਾਰਡ ਤੇ ਕੋਈ ਵੌਇਸਮੇਲ ਨੰਬਰ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਹੈ।"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"ਨੰਬਰ ਜੋੜੋ"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"ਕੀ <xliff:g id="NEW_APP">%s</xliff:g> ਨੂੰ ਆਪਣੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਫ਼ੋਨ ਐਪ ਬਣਾਉਣਾ ਹੈ?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈੱਟ ਕਰੋ"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"ਰੱਦ ਕਰੋ"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ਕਾਲਾਂ ਕਰ ਸਕੇਗੀ ਅਤੇ ਕਾਲਾਂ ਦੇ ਸਾਰੇ ਪੱਖਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰ ਸਕੇਗੀ। ਸਿਰਫ਼ ਉਹਨਾਂ ਐਪਾਂ ਨੂੰ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਫ਼ੋਨ ਐਪ ਵਜੋਂ ਸੈੱਟ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜਿੰਨ੍ਹਾਂ \'ਤੇ ਤੁਸੀਂ ਭਰੋਸਾ ਕਰਦੇ ਹੋ।"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"ਬਲੌਕ ਕੀਤੇ ਗਏ ਨੰਬਰ"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"ਤੁਹਾਨੂੰ ਬਲੌਕ ਕੀਤੇ ਨੰਬਰਾਂ ਤੋਂ ਕਾਲਾਂ ਜਾਂ ਲਿਖਤ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹੋਣਗੇ।"</string>
-    <string name="block_number" msgid="1101252256321306179">"ਇੱਕ ਨੰਬਰ ਸ਼ਾਮਲ ਕਰੋ"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"ਕੀ <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ਨੂੰ ਅਣਬਲੌਕ ਕਰਨਾ ਹੈ?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"ਅਣਬਲੌਕ ਕਰੋ"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ਇਸ ਨੰਬਰ ਤੋਂ ਕਾਲਾਂ ਅਤੇ ਲਿਖਤੀ ਸੁਨੇਹਿਆਂ ਨੂੰ ਬਲੌਕ ਕਰੋ"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ਫ਼ੋਨ ਨੰਬਰ"</string>
-    <string name="block_button" msgid="8822290682524373357">"ਬਲੌਕ ਕਰੋ"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"ਸਿਰਫ਼ ਡੀਵਾਈਸ ਮਾਲਕ ਹੀ ਬਲੌਕ ਕੀਤੇ ਗਏ ਨੰਬਰਾਂ ਨੂੰ ਵੇਖ ਅਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰ ਸਕਦਾ ਹੈ।"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"ਅਨਬਲੌਕ ਕਰੋ"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ਬਲੌਕਿੰਗ ਆਰਜ਼ੀ ਤੌਰ \'ਤੇ ਬੰਦ ਹੈ"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੱਕ ਐਮਰਜੈਂਸੀ ਨੰਬਰ ਨੂੰ ਡਾਇਲ ਕੀਤੇ ਜਾਣ ਜਾਂ ਲਿਖਤ ਸੁਨੇਹਾ ਭੇਜੇ ਜਾਣ ਤੋਂ ਬਾਅਦ, ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਬਲੌਕਿੰਗ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਕਿ ਐਮਰਜੈਂਸੀ ਸੇਵਾਵਾਂ ਤੁਹਾਨੂੰ ਸੰਪਰਕ ਕਰ ਸਕਣ।"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"ਹੁਣੇ ਦੁਬਾਰਾ ਯੋਗ ਬਣਾਓ"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ਬਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> ਅਣਬਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"ਐਮਰਜੈਂਸੀ ਨੰਬਰ ਨੂੰ ਬਲੌਕ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ।"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ।"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"ਕਾਲ ਕਰਨ ਲਈ ਨਿੱਜੀ ਡਾਇਲਰ ਦੀ ਵਰਤੋਂ ਕਰਨੀ"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ਕੀ ਡਿਫ਼ੌਲਟ ਡਾਇਲਰ ਐਪ ਨੂੰ ਬਦਲਣਾ ਹੈ?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"ਕੀ <xliff:g id="CURRENT_APP">%2$s</xliff:g> ਦੀ ਬਜਾਏ <xliff:g id="NEW_APP">%1$s</xliff:g> ਨੂੰ ਆਪਣੀ ਡਿਫ਼ੌਲਟ ਡਾਇਲਰ ਐਪ ਦਾ ਉਪਯੋਗ ਕਰਨਾ ਹੈ?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"ਕੀ <xliff:g id="NEW_APP">%s</xliff:g> ਨੂੰ ਆਪਣੀ ਡਿਫ਼ੌਲਟ ਡਾਇਲਰ ਐਪ ਦਾ ਉਪਯੋਗ ਕਰਨਾ ਹੈ?"</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index e460463..813bf29 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Zarządzanie połączeniami"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefon – zarządzanie połączeniami"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Nieznany"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Nieodebrane połączenie"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Brakuje numeru poczty głosowej"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Na karcie SIM nie ma zapisanego numeru poczty głosowej."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj numer"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Ustawić <xliff:g id="NEW_APP">%s</xliff:g> jako domyślną aplikację telefoniczną?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Ustaw jako aplikację domyślną"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Anuluj"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> uzyska możliwość nawiązywania połączeń i kontrolowania wszystkich ich aspektów. Tylko zaufane aplikacje powinny być ustawiane jako domyślna aplikacja telefoniczna."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Zablokowane numery"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Nie będziesz otrzymywać połączeń ani SMS-ów z zablokowanych numerów."</string>
-    <string name="block_number" msgid="1101252256321306179">"Dodaj numer"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Odblokować <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Odblokuj"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokuj połączenia i SMS-y z:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Numer telefonu"</string>
-    <string name="block_button" msgid="8822290682524373357">"Zablokuj"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Tylko właściciel urządzenia może przeglądać zablokowane numery i nimi zarządzać."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Odblokuj"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokada tymczasowo wyłączona"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Gdy wybierzesz numer awaryjny lub wyślesz pod ten numer SMS-a, blokada zostanie wyłączona, aby odpowiednie służby mogły się z Tobą skontaktować."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Włącz ponownie"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Numer <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> został zablokowany"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Numer <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> został odblokowany"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Nie można zablokować numeru alarmowego."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Numer <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> jest już zablokowany."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Wykonuję połączenie z osobistego telefonu"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Zmienić domyślną aplikację telefonu?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Zmienić <xliff:g id="CURRENT_APP">%2$s</xliff:g> na <xliff:g id="NEW_APP">%1$s</xliff:g> jako domyślną aplikację telefonu?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Ustawić <xliff:g id="NEW_APP">%s</xliff:g> jako domyślną aplikację telefonu?"</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index b2e576e..cc3db6e 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gestão de chamadas"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Gestão de chamadas do telemóvel"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefone"</string>
     <string name="unknown" msgid="6878797917991465859">"Desconhecido"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada não atendida"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Número do correio de voz em falta"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Não existe um número de correio de voz armazenado no cartão SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Adicionar número"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Predefinir <xliff:g id="NEW_APP">%s</xliff:g> como a sua aplicação Telefone?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Predefinir"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancelar"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"A aplicação <xliff:g id="NEW_APP">%s</xliff:g> poderá efetuar chamadas e controlar todos os aspetos das mesmas. Apenas as aplicações em que confia devem ser escolhidas como a aplicação de telefone predefinida."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Números bloqueados"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Não irá receber chamadas ou mensagens de texto de números bloqueados."</string>
-    <string name="block_number" msgid="1101252256321306179">"Adicionar um número"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Pretende desbloquear <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Desbloquear"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloquear chamadas e mensagens de texto de"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Número de telefone"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloquear"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Apenas o proprietário do dispositivo pode ver e gerir os números bloqueados."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Desbloquear"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Bloqueio temporariamente desativado"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Após marcar ou enviar uma mensagem de texto para um número de emergência, o bloqueio é desativado para garantir que os serviços de emergência conseguem contactá-lo."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Reativar agora"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> bloqueado"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> desbloqueado"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Não é possível bloquear números de emergência."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> já está bloqueado."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"A utilizar o telefone pessoal para efetuar a chamada"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Alterar aplicação de Telefone predefinida?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Utilizar <xliff:g id="NEW_APP">%1$s</xliff:g> em vez de <xliff:g id="CURRENT_APP">%2$s</xliff:g> como a aplicação de telefone predefinida?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Utilizar <xliff:g id="NEW_APP">%s</xliff:g> como a aplicação de telefone predefinida?"</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 6d4271c..9dea13f 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gerenciamento de chamadas"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Gerenciamento de chamadas telefônicas"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefone"</string>
     <string name="unknown" msgid="6878797917991465859">"Desconhecido"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada perdida"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Número correio de voz ausente"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Não há um número correio de voz armazenado no cartão SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Adicionar número"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Usar o <xliff:g id="NEW_APP">%s</xliff:g> como seu aplicativo de smartphone padrão?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Definir padrão"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Cancelar"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"O <xliff:g id="NEW_APP">%s</xliff:g> poderá ligar e controlar todos os aspectos das chamadas. Defina como aplicativo de smartphone padrão somente aqueles em que você confia."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Números bloqueados"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Você não receberá chamadas nem mensagens de texto dos números bloqueados."</string>
-    <string name="block_number" msgid="1101252256321306179">"Adicionar um número"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Desbloquear <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Desbloquear"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Bloquear chamadas e mensagens de texto de"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Nº de telefone"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloquear"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Apenas o proprietário do dispositivo pode ver e gerenciar os números bloqueados."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Desbloquear"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Bloqueio temporariamente desativado"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Após discar ou enviar uma mensagem de texto para um número de emergência, o bloqueio é desativado para garantir o contato do serviço de emergência com você."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Reativar agora"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"O número <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> está bloqueado."</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"O número <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> está desbloqueado."</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Não é possível bloquear o número de emergência."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"O número <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> já está bloqueado."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Usando o discador pessoal para fazer a chamada"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Alterar o app discador padrão?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Usar <xliff:g id="NEW_APP">%1$s</xliff:g> em vez de <xliff:g id="CURRENT_APP">%2$s</xliff:g> como seu app discador padrão?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Usar <xliff:g id="NEW_APP">%s</xliff:g> como seu app discador padrão?"</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 4c204fb..fd7050d 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Gestionarea apelurilor"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefon – Gestionarea apelurilor"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Necunoscut"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Apel nepreluat"</string>
@@ -29,8 +29,8 @@
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Apel cu sunet dezactivat."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Difuzor activat."</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Nu pot acum. Despre ce e vorba?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Sun eu imediat."</string>
-    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Sun eu mai târziu."</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Te sun imediat înapoi."</string>
+    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Te sun mai târziu."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nu pot acum. Vorbim mai târziu?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Răspunsuri rapide"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editați răspunsurile rapide"</string>
@@ -42,29 +42,10 @@
     <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"Această aplicație nu poate efectua apeluri fără permisiunea Telefon."</string>
     <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Pentru a apela, introduceți un număr valid."</string>
     <string name="duplicate_video_call_not_allowed" msgid="3749211605014548386">"Apelul nu poate fi adăugat în acest moment."</string>
-    <string name="no_vm_number" msgid="4164780423805688336">"Lipsește numărul mesageriei vocale"</string>
+    <string name="no_vm_number" msgid="4164780423805688336">"Lipseşte numărul mesageriei vocale"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Niciun număr de mesagerie vocală nu este stocat pe cardul SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Adăugați numărul"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Setați <xliff:g id="NEW_APP">%s</xliff:g> ca aplicație prestabilită a telefonului?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Setați ca prestabilită"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Anulați"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> va putea iniția apeluri și va putea controla toate aspectele acestora. E recomandat să setați ca aplicație prestabilită a telefonului numai aplicații în care aveți încredere."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Numere blocate"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Nu veți primi apeluri sau mesaje text de la numerele blocate."</string>
-    <string name="block_number" msgid="1101252256321306179">"Adăugați un număr"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Deblocați <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Deblocați"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blocați apelurile și mesajele text de la"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Număr de telefon"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blocați"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Numai proprietarul dispozitivului poate vedea și gestiona numerele blocate."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Deblocați"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blocarea este dezactivată temporar"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"După ce formați un număr de urgență sau trimiteți un mesaj la acesta, blocarea este dezactivată pentru ca serviciile de urgență să vă poată contacta."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Reactivați acum"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> este blocat"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> este deblocat"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Numărul de urgență nu poate fi blocat."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> este deja blocat."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Utilizarea telefonului personal pentru a apela"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Schimbați aplicația Telefon prestabilită?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Folosiți <xliff:g id="NEW_APP">%1$s</xliff:g> și nu <xliff:g id="CURRENT_APP">%2$s</xliff:g> ca aplicație de telefonie prestabilită?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Folosiți <xliff:g id="NEW_APP">%s</xliff:g> ca aplicație de telefonie prestabilită?"</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index d6623cd..54d5711 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Управление звонками"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Телефон – управление звонками"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Телефон"</string>
     <string name="unknown" msgid="6878797917991465859">"Неизвестный абонент"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Пропущенный вызов"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Не указан номер голосовой почты"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM-карте нет ни одного номера голосовой почты."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Добавить номер"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Сделать <xliff:g id="NEW_APP">%s</xliff:g> приложением по умолчанию для звонков?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Использовать по умолчанию"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Отмена"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> будет отвечать за выполнение всех вызовов и настройку их параметров. Только надежные приложения следует использовать для звонков по умолчанию."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Заблокированные номера"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Звонки и сообщения с заблокированных номеров поступать не будут."</string>
-    <string name="block_number" msgid="1101252256321306179">"Добавить номер"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Разблокировать номер <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Разблокировать"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Блокировать звонки и сообщения от"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Номер телефона"</string>
-    <string name="block_button" msgid="8822290682524373357">"Заблокировать"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Просматривать и изменять список заблокированных номеров может только владелец устройства."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Разблокировать"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Блокировка временно снята"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"После набора или отправки сообщения на номер экстренной службы блокировка будет выключена, чтобы специалисты могли связаться с вами."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Включить блокировку"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Номер <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> заблокирован"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Номер <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> разблокирован"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Невозможно заблокировать номер экстренной службы."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Номер <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> уже заблокирован."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Набор номера с помощью персонализированной панели"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Новое приложение для звонков"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"\"<xliff:g id="NEW_APP">%1$s</xliff:g>\" станет приложением для звонков по умолчанию вместо \"<xliff:g id="CURRENT_APP">%2$s</xliff:g>\". Продолжить?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"\"<xliff:g id="NEW_APP">%s</xliff:g>\" станет приложением для звонков по умолчанию. Продолжить?"</string>
 </resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index caf3edd..f1b014c 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"ඇමතුම් කළමනාකරණය"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"දුරකථන ඇමතුම් කළමනාකරණය"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"දුරකථනය"</string>
     <string name="unknown" msgid="6878797917991465859">"නොදනී"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"මඟ හැරුණු ඇමතුම"</string>
@@ -33,7 +33,7 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"මම ඔබට පසුව අමතන්නම්."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"දැන් කථා කරන්න බෑ. පසුව අමතන්නද?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ක්ෂණික ප්‍රතිචාර"</string>
-    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ක්ෂණික ප්‍රතිචාර සංස්කරණය"</string>
+    <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ක්ෂණික ප්‍රතිචාර සංස්කරණය කරන්න"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
     <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"ක්ෂණික ප්‍රතිචාරය"</string>
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"<xliff:g id="PHONE_NUMBER">%s</xliff:g> හට පණිවිඩය යවන්න."</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"හඬ තැපැල් අංකය නැත"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM කාඩ් පතෙහි හඬ තැපැල් අංකයක් ආචිත වී නැත."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"අංකයක් එක් කරන්න"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> ඔබේ පෙරනිමි දුරකථන යෙදුම කරන්නද?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"පෙරනිමිය සකසන්න"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"අවලංගු කරන්න"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ඇමතුම් ලබා ගැනීමට සහ එවායේ සියලු අංග පාලනය කිරීමට හැකි වනු ඇත. ඔබ විශ්වාස කරන යෙදුම් පමණක් පෙරනිමි දුරකථන යෙදුම ලෙස සැකසිය යුතුය."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"අවහිර කළ අංක"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"ඔබට අවහිර කළ අංකවලින් ඇමතුම් හෝ පෙළ නොලැබෙනු ඇත."</string>
-    <string name="block_number" msgid="1101252256321306179">"අංකයක් එක් කරන්න"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> අවහිර නොකරන්නද?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"අවහිර නොකරන්න"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"ඇමතුම් හා පෙළ අවහිර කරන්න"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"දුරකථන අංකය"</string>
-    <string name="block_button" msgid="8822290682524373357">"අවහිර කරන්න"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"උපාංගය හිමිකරුට පමණක් අවහිර අංක බැලීමට සහ කළමනාකරණය කිරීමට හැකිය."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"අවහිර කිරීමෙන් ඉවත් කරන්න"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"අවහිර කිරීම තාවකාලිකව අක්‍රියයි"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"ඔබ හදිසි ඇමතුම් අංකයක් ඩයල් කිරීමෙන් හෝ පෙළ පණිවිඩයක් යැවීමෙන් පසු, හදිසි අවස්ථා සේවාවලට ඔබට ඇමතිය හැකි බව තහවුරු කිරීමට අවහිර කිරීම අක්‍රිය කරයි."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"දැන් නැවත-සබල කරන්න"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> අවහිර කරන ලදී"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> අවහිර කිරීමෙන් ඉවත් කරන ලදී"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"හදිසි අවස්ථා අංකය අවහිර කිරීමට නොහැකිය."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> දැනටමත් අවහිර කර ඇත."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"ඇමතුම ගැනීමට පුද්ගලික අමතනය භාවිත කරමින්"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"සුපුරුදු දුරකථන යෙදුම වෙනස් කරන්න ද?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> වෙනුවට <xliff:g id="NEW_APP">%1$s</xliff:g> ඔබගේ සුපුරුදු දුරකථන යෙදුම ලෙස භාවිතා කරන්නද?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> ඔබගේ සුපුරුදු දුරකථන යෙදුම ලෙස භාවිතා කරන්නද?"</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 28227a8..9139650 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Správa hovorov"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Správa telefónnych hovorov"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefón"</string>
     <string name="unknown" msgid="6878797917991465859">"Neznáme"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Zmeškaný hovor"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Chýba číslo hlasovej schránky"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Na SIM karte nie je uložené žiadne číslo hlasovej schránky."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Pridať číslo"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Nastaviť <xliff:g id="NEW_APP">%s</xliff:g> ako predvolanú aplikáciu na telefonovanie?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Nastaviť ako predvolené"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Zrušiť"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> bude môcť uskutočňovať hovory a ovládať všetky aspekty hovorov. Ako predvolenú aplikáciu na telefonovanie by ste si mali nastaviť len aplikáciu, ktorej dôverujete."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokované čísla"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Z blokovaných čísel nebudete prijímať hovory ani textové správy."</string>
-    <string name="block_number" msgid="1101252256321306179">"Pridať číslo"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Odblokovať číslo <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Odblokovať"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokovať hovory a textové správy z čísla"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefónne číslo"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokovať"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Iba vlastník zariadenia môže zobrazovať a spravovať blokované čísla."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Odblokovať"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokovanie je dočasne vypnuté"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Keď vytočíte číslo tiesňového volania alebo naň odošlete textovú správu, blokovanie bude vypnuté, aby vás mohli pohotovostné služby kontaktovať."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Znova zapnúť"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Číslo <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je blokované"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Číslo <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> je odblokované"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Číslo tiesňového volania sa nedá zablokovať."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Číslo <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je už zablokované."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Na volanie sa používa osobné vytáčanie"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Chcete zmeniť predvolenú aplikáciu vytáčania?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Chcete použiť aplikáciu <xliff:g id="NEW_APP">%1$s</xliff:g> namiesto aplikácie <xliff:g id="CURRENT_APP">%2$s</xliff:g> ako predvolenú aplikáciu vytáčania?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Chcete použiť aplikáciu <xliff:g id="NEW_APP">%s</xliff:g> ako predvolenú aplikáciu vytáčania?"</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index b328c69..374266e 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Upravljanje klicev"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Upravljanje telefonskih klicev"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Neznano"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Neodgovorjeni klic"</string>
@@ -29,8 +29,8 @@
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Klic izključen."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Zvočnik omogočen."</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Zdaj ne morem govoriti. Za kaj gre?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Pokličem takoj."</string>
-    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Pokličem pozneje."</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Takoj bom poklical."</string>
+    <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Poklical bom pozneje."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Zdaj ne morem govoriti. Pozneje?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hitri odgovori"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Urejanje hitrih odgovorov"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Manjkajoča številka glasovne pošte"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Na kartici SIM ni shranjena številka glasovne pošte."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj številko"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Želite, da je <xliff:g id="NEW_APP">%s</xliff:g> privzeta aplikacija za klicanje?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Nastavi za privzeto"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Prekliči"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"V aplikaciji <xliff:g id="NEW_APP">%s</xliff:g> bo mogoče opravljati klice in nadzirati vse vidike klicev. Kot privzeto aplikacijo za klicanje nastavite samo aplikacije, ki jim zaupate."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blokirane številke"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Z blokiranih številk ne boste prejemali klicev ali sporočil SMS."</string>
-    <string name="block_number" msgid="1101252256321306179">"Dodaj številko"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Želite odblokirati številko <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Odblokiraj"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blokiranje klicev in SMS-jev s številke"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonska številka"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blokiraj"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Samo lastnik naprave si lahko ogleda blokirane številke in jih upravlja."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Odblokiraj"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blokiranje je začasno izklopljeno"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Ko izberete številko za klic v sili ali nanjo pošljete sporočilo SMS, se blokiranje izklopi, s čimer se zagotovi, da vas lahko pokličejo iz služb za pomoč v sili."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Znova omogoči"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Številka <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je blokirana"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Številka <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> je odblokirana"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Številke za klic v sili ni mogoče blokirati."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Številka <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> je že blokirana."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Uporaba osebnega klicalnika za klic"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Želite spremeniti privzeto aplikacijo za klicanje?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Želite <xliff:g id="NEW_APP">%1$s</xliff:g> uporabljati kot privzeto aplikacijo za klicanje namesto <xliff:g id="CURRENT_APP">%2$s</xliff:g>?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Želite <xliff:g id="NEW_APP">%s</xliff:g> uporabljati kot privzeto aplikacijo za klicanje?"</string>
 </resources>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
index 00660d0..b328b7f 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq-rAL/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Menaxhimi i thirrjes"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Menaxhimi i telefonatave"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefoni"</string>
     <string name="unknown" msgid="6878797917991465859">"I panjohur"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Telefonatë e humbur"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Mungon numri i postës zanore"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Nuk ka numër të ruajtur në kartën SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Shto numër"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Të bëhet <xliff:g id="NEW_APP">%s</xliff:g> aplikacioni yt i parazgjedhur në telefon?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Vendos të parazgjedhurën"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Anulo"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> do të mund të bëjë dhe kontrollojë të gjitha aspektet e telefonatave. Vetëm aplikacionet të cilave u beson duhet të caktohen si aplikacioni Telefon i parazgjedhur."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Numrat e bllokuar"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Nuk do të marrësh telefonata ose mesazhe me tekst nga numrat e bllokuar."</string>
-    <string name="block_number" msgid="1101252256321306179">"Shto një numër"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Zhblloko <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Zhblloko"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blloko telefonatat dhe mesazhet me tekst nga"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Numri i telefonit"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blloko"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Vetëm zotëruesi i pajisjes mund të shikojë dhe të menaxhojë numrat e bllokuar."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Zhblloko"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Bllokimi përkohësisht joaktiv"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Pasi shtypet ose dërgohet mesazh me tekst te një numër i urgjencës, bllokimi është çaktivizuar për të siguruar që shërbimet e emergjencës të mund të të kontaktojnë."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Riaktivizo tani"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> u bllokua"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> u zhbllokua"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Numri i urgjencës nuk mund të bllokohet."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> është i bllokuar tashmë."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Po përdor formuesin personal të numrave për të kryer telefonatën"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Të ndryshohet apl. parazgjedhur i formuesit të numrave?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Të përdoret <xliff:g id="NEW_APP">%1$s</xliff:g> në vend të <xliff:g id="CURRENT_APP">%2$s</xliff:g> si aplikacioni i parazgjedhur i formuesit të numrave?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Të përdoret <xliff:g id="NEW_APP">%s</xliff:g> si aplikacioni i parazgjedhur i formuesit të numrave?"</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 23c2441..2eaadc5 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Управљање позивима"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Управљање телефонским позивима"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Телефон"</string>
     <string name="unknown" msgid="6878797917991465859">"Непознато"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Пропуштен позив"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Недостаје број за говорну пошту"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Није ускладиштен ниједан број говорне поште на SIM картици."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Додај број"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Желите ли да <xliff:g id="NEW_APP">%s</xliff:g> постане подразумевана апликација Телефон?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Постави као подразумевано"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Откажи"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ће моћи да упућује позиве и контролише све њихове аспекте. Апликацију подесите као подразумевану за телефонирање само ако је сматрате поузданом."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Блокирани бројеви"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Нећете примати позиве ни SMS-ове са блокираних бројева."</string>
-    <string name="block_number" msgid="1101252256321306179">"Додај број"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Желите ли да деблокирате <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Деблокирај"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Блокирајте позиве и SMS-ове од"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Број телефона"</string>
-    <string name="block_button" msgid="8822290682524373357">"Блокирај"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Само власник уређаја може да прегледа блокиране бројеве и управља њима."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Деблокирајте"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Блокирање је привремено искључено"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Кад позовете број хитне службе или на тај број пошаљете SMS, блокирање се искључује да би хитне службе могле да вас контактирају."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Поново омогући"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> је блокиран"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> је деблокиран"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Није могуће блокирати број хитне службе."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> је већ блокиран."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Коришћење бројчаника из личног профила за упућивање позива"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Променити подразумевану апликацију Телефон?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Желите ли да користите апликацију <xliff:g id="NEW_APP">%1$s</xliff:g> уместо апликације <xliff:g id="CURRENT_APP">%2$s</xliff:g> као подразумевану апликацију за позивање телефонских бројева?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Желите ли да користите апликацију <xliff:g id="NEW_APP">%s</xliff:g> као подразумевану апликацију за позивање телефонских бројева?"</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 1ecd70d..ddd421c 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Samtalshantering"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Samtalshantering"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Okänd"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Missat samtal"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Nummer till röstbrevlåda saknas"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Det finns inget nummer till röstbrevlådan sparat på SIM-kortet."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Lägg till nummer"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Gör <xliff:g id="NEW_APP">%s</xliff:g> till standardtelefonapp?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Ange standard"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Avbryt"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> kan ringa och styra allt omkring samtal. Endast appar du litar på bör ställas in som standardtelefonapp."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Blockerade nummer"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Du kommer inte ta emot samtal eller sms från blockerade nummer."</string>
-    <string name="block_number" msgid="1101252256321306179">"Lägg till ett telefonnummer"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Vill du häva blockeringen av <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Häv blockering"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Blockera samtal och sms från"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefonnummer"</string>
-    <string name="block_button" msgid="8822290682524373357">"Blockera"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Bara enhetens ägare kan se och hantera blockerade nummer."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Avblockera"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Blockeringen har inaktiverats tillfälligt"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"När du ringer eller sms:ar ett nödnummer inaktiveras blockering för att säkerställa att räddningstjänsten kan kontakta dig."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Återaktivera nu"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> blockerat"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> avblockerat"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Det går inte att blockera nödnummer."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> är redan blockerat."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Ringer med den egna uppringningsfunktionen"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Vill du byta standardapp för uppringning?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Vill du använda <xliff:g id="NEW_APP">%1$s</xliff:g> i stället för <xliff:g id="CURRENT_APP">%2$s</xliff:g> som standardapp för uppringning?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Vill du använda <xliff:g id="NEW_APP">%s</xliff:g> som standardapp för uppringning?"</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index ce01517..4686e15 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -16,20 +16,20 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Kudhibiti Simu"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Usimamizi wa Mazunguzo ya Simu"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Simu"</string>
     <string name="unknown" msgid="6878797917991465859">"Haijulikani"</string>
-    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Simu uliyokosa"</string>
+    <string name="notification_missedCallTitle" msgid="7554385905572364535">"Simu isiyojibiwa"</string>
     <string name="notification_missedWorkCallTitle" msgid="6242489980390803090">"Simu ya kazini ambayo hukujibu"</string>
     <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Simu zisizojibiwa"</string>
     <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> simu ambazo hazijajibiwa"</string>
-    <string name="notification_missedCallTicker" msgid="504686252427747209">"Ulikosa simu kutoka kwa <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+    <string name="notification_missedCallTicker" msgid="504686252427747209">"Simu isiyojibiwa kutoka <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
     <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Mpigie"</string>
     <string name="notification_missedCall_message" msgid="3049928912736917988">"Ujumbe"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Simu imezimwa."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Spika za simu zimewezeshwa"</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Siwezi kuongea sasa. Kuna nini?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Nitakupigia baada ya dakika chache."</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Nitakupigia sasa hivi."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Nitakupigia baadaye."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Siwezi kuongea sasa. Nipigie baadaye"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Majibu ya haraka"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Nambari ya sauti inayokosekana"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Hakuna nambari ya ujumbe wa sauti iliyohifadhiwa katika SIM kadi."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Ongeza nambari"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Unataka kufanya <xliff:g id="NEW_APP">%s</xliff:g> iwe programu chaguo-msingi ya simu?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Fanya iwe Chaguo-Msingi"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Ghairi"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> itaweza kupiga simu na kudhibiti kila kipengele cha simu. Unastahili kuweka programu unazoziamini tu kama programu chaguo-msingi ya kupiga simu."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Nambari zilizozuiwa"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Hutapokea simu au SMS kutoka kwa nambari zilizozuiwa."</string>
-    <string name="block_number" msgid="1101252256321306179">"Ongeza nambari"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Ungependa kuacha kuzuia <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Acha kuzuia"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Zuia simu na SMS kutoka kwa"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Nambari ya simu"</string>
-    <string name="block_button" msgid="8822290682524373357">"Zuia"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Ni mmiliki wa kifaa pekee anayeweza kuangalia na kuthibiti nambari zilizozuiwa."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Acha kuzuia"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Kipengele cha kuzuia kimezimwa kwa muda"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Ukishapiga au kutuma ujumbe kwa nambari ya dharura, kipengele cha kuzuia anwani huzimwa ili watoa huduma za dharura waweze kuwasiliana nawe."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Kiwashe tena sasa"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> imezuiwa"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> imeacha kuzuiwa"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Huwezi kuzuia nambari ya dharura."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> tayari imezuiwa."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Kupiga simu kwa kutumia kipiga simu cha binafsi"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Ungependa kubadilisha programu chaguo-msingi ya simu?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Ungependa kutumia <xliff:g id="NEW_APP">%1$s</xliff:g> badala ya <xliff:g id="CURRENT_APP">%2$s</xliff:g> kama programu ya chaguo-msingi ya kupigia simu?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Ungependa kutumia <xliff:g id="NEW_APP">%s</xliff:g> kama programu ya chaguo-msingi ya kupigia simu?"</string>
 </resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index e39a199..d22d047 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"அழைப்பு நிர்வாகம்"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ஃபோன் அழைப்பு நிர்வாகம்"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ஃபோன்"</string>
     <string name="unknown" msgid="6878797917991465859">"தெரியாதவர்"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"தவறிய அழைப்பு"</string>
@@ -28,7 +28,7 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"செய்தி"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"அழைப்பு முடக்கப்பட்டது."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"ஸ்பீக்கர்ஃபோன் இயக்கப்பட்டது."</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"இப்போது பேசமுடியாது. என்ன விஷேசம்?"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"இப்போது பேச முடியாது. ஏதேனும் முக்கிய செய்தியா?"</string>
     <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"சிறிதுநேரம் கழித்து நான் அழைக்கிறேன்."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"பிறகு அழைக்கிறேன்."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"இப்போது பேச முடியவில்லை. பிறகு அழைக்க முடியுமா?"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"குரலஞ்சல் எண் இல்லை"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"சிம் கார்டில் குரலஞ்சலுக்கான எண் எதுவும் சேமிக்கப்படவில்லை."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"எண்ணைச் சேர்"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g>ஐ இயல்புநிலை ஃபோன் பயன்பாடாக அமைக்கவா?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"இயல்புநிலையாக அமை"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"ரத்துசெய்"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"அழைப்புகளின் எல்லா அம்சங்களையும் <xliff:g id="NEW_APP">%s</xliff:g> ஆல் செயல்படுத்தவும் கட்டுப்படுத்தவும் முடியும். நீங்கள் நம்பகமானது என கருதும் பயன்பாடுகளை மட்டுமே இயல்புநிலை ஃபோன் பயன்பாடாக அமைக்க வேண்டும்."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"தடுக்கப்பட்ட எண்கள்"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"தடுக்கப்பட்ட எண்களிலிருந்து அழைப்புகள் அல்லது உரைச் செய்திகளைப் பெறமாட்டீர்கள்."</string>
-    <string name="block_number" msgid="1101252256321306179">"எண்ணைச் சேர்"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>ஐ அனுமதிக்கவா?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"அனுமதி"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"இந்த எண்ணிலிருந்து வரும் அழைப்புகளையும் உரைச்செய்திகளையும் தடு:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"மொபைல் எண்"</string>
-    <string name="block_button" msgid="8822290682524373357">"தடு"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"சாதன உரிமையாளர் மட்டுமே தடுக்கப்பட்ட எண்களைப் பார்க்கவும் நிர்வகிக்கவும் முடியும்."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"அனுமதிக்கும்"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"அழைப்புத் தடுப்பு அம்சம் தற்காலிகமாக முடக்கப்பட்டுள்ளது"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"அவசர அழைப்பு எண்ணை அழைத்த பிறகு அல்லது அதற்கு உரைச் செய்தியை அனுப்பிய பிறகு, அவசர அழைப்புச் சேவைகள் உங்களைத் தொடர்புகொள்வதற்காக அழைப்புத் தடுப்பு அம்சம் முடக்கப்படுகிறது."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"இப்போதே மீண்டும் இயக்கு"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> தடுக்கப்பட்டது"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> அனுமதிக்கப்பட்டது"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"அவசர அழைப்பு எண்ணைத் தடுக்க முடியவில்லை."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ஏற்கனவே தடுக்கப்பட்டது."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"தனிப்பட்ட டயலரைப் பயன்படுத்தி அழைக்கவும்"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"இயல்புநிலை டயலர் பயன்பாட்டை மாற்றவா?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="NEW_APP">%1$s</xliff:g>ஐ <xliff:g id="CURRENT_APP">%2$s</xliff:g>க்குப் பதிலாக, இயல்புநிலை டயலர் பயன்பாடாகப் பயன்படுத்தவா?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g>ஐ இயல்புநிலை டயலர் பயன்பாடாகப் பயன்படுத்தவா?"</string>
 </resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 09bc4cf..83d2074 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"కాల్ నిర్వహణ"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"ఫోన్ కాల్ నిర్వహణ"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"ఫోన్"</string>
     <string name="unknown" msgid="6878797917991465859">"తెలియదు"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"సమాధానం ఇవ్వని కాల్"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"వాయిస్ మెయిల్ నంబర్ లేదు"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"సిమ్ కార్డులో వాయిస్ మెయిల్ నంబర్ ఏదీ నిల్వ చేయబడలేదు."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"నంబర్‌ను జోడించు"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g>ని మీ డిఫాల్ట్ ఫోన్ అనువర్తనంగా చేయాలా?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"డిఫాల్ట్‌గా సెట్ చేయండి"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"రద్దు చేయి"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> అన్ని రకాల కాల్‌లను చేయగలదు మరియు సంబంధిత అన్ని అంశాలను నియంత్రించగలదు. మీరు విశ్వసించే అనువర్తనాలను మాత్రమే డిఫాల్ట్ ఫోన్ అనువర్తనంగా సెట్ చేయాలి."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"బ్లాక్ చేయబడిన నంబర్‌లు"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"మీరు బ్లాక్ చేయబడిన నంబర్‌ల నుండి కాల్‌లు లేదా వచన సందేశాలను స్వీకరించరు."</string>
-    <string name="block_number" msgid="1101252256321306179">"నంబర్‌ను జోడించు"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>ని అన్‌బ్లాక్ చేయాలా?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"అన్‌బ్లాక్ చేయి"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"దీని నుండి కాల్‌లు మరియు సందేశాలను బ్లాక్ చేయండి"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"ఫోన్ నంబర్"</string>
-    <string name="block_button" msgid="8822290682524373357">"బ్లాక్ చేయి"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"కేవలం పరికర యజమాని మాత్రమే బ్లాక్ చేసిన నంబర్‌లను వీక్షించగలరు మరియు నిర్వహించగలరు."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"అన్‌బ్లాక్ చేస్తుంది"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"బ్లాకింగ్ తాత్కాలికంగా ఆఫ్ చేయబడింది"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"మీరు అత్యవసర నంబర్‌కి డయల్ చేసాక లేదా వచన సందేశం పంపాక, అత్యవసర సేవలు తిరిగి మిమ్మల్ని సంప్రదించగలిగేలా చేయడానికి బ్లాకింగ్ ఆఫ్ చేయబడుతుంది."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"ఇప్పుడే మళ్లీ ప్రారంభించు"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> బ్లాక్ చేయబడింది"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> అన్‌బ్లాక్ చేయబడింది"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"అత్యవసర నంబర్‌ను బ్లాక్ చేయడం సాధ్యపడలేదు."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ఇప్పటికే బ్లాక్ చేయబడింది."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"కాల్ చేయడానికి వ్యక్తిగత డయలర్‌ను ఉపయోగిస్తోంది"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"డిఫాల్ట్ డయలర్ అనువర్తనాన్ని మార్చాలా?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"మీ డిఫాల్ట్ డయలర్ అనువర్తనంగా <xliff:g id="CURRENT_APP">%2$s</xliff:g> బదులు <xliff:g id="NEW_APP">%1$s</xliff:g>ని ఉపయోగించాలా?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"మీ డిఫాల్ట్ డయలర్ అనువర్తనంగా <xliff:g id="NEW_APP">%s</xliff:g>ని ఉపయోగించాలా?"</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 2acead3..ee9b6fd 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"การจัดการการโทร"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"การจัดการการโทรศัพท์"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"โทรศัพท์"</string>
     <string name="unknown" msgid="6878797917991465859">"ไม่ทราบ"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"สายที่ไม่ได้รับ"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"ไม่มีหมายเลขข้อความเสียง"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"ไม่มีหมายเลขข้อความเสียงจัดเก็บอยู่ในซิมการ์ด"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"เพิ่มหมายเลข"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"ต้องการตั้งค่าให้ <xliff:g id="NEW_APP">%s</xliff:g> เป็นแอปโทรศัพท์เริ่มต้นหรือไม่"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ตั้งเป็นค่าเริ่มต้น"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"ยกเลิก"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> จะจัดการการโทรและควบคุมการติดต่อทุกด้าน โปรดติดตั้งเฉพาะแอปที่คุณไว้วางใจให้เป็นแอปโทรศัพท์เริ่มต้น"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"หมายเลขที่ถูกบล็อก"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"คุณจะไม่สามารถรับสายหรือข้อความจากหมายเลขที่บล็อกได้"</string>
-    <string name="block_number" msgid="1101252256321306179">"เพิ่มหมายเลข"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"เลิกบล็อก <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> ใช่ไหม"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"เลิกบล็อก"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"บล็อกสายเรียกเข้าและข้อความจาก"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"หมายเลขโทรศัพท์"</string>
-    <string name="block_button" msgid="8822290682524373357">"บล็อก"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"มีเพียงเจ้าของอุปกรณ์เท่านั้นที่สามารถดูและจัดการหมายเลขที่ถูกบล็อก"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"เลิกบล็อก"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"ปิดการบล็อกไว้ชั่วคราว"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"หลังจากส่งข้อความถึงหรือกดหมายเลขโทรศัพท์ฉุกเฉิน ระบบจะปิดการบล็อกเพื่อให้บริการฉุกเฉินติดต่อคุณได้"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"เปิดใช้งานอีกครั้งเลย"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"บล็อก <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> แล้ว"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"เลิกบล็อก <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> แล้ว"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"ไม่สามารถบล็อกหมายเลขฉุกเฉินได้"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ถูกบล็อกอยู่แล้ว"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"การใช้โทรศัพท์ส่วนตัวเพื่อทำการโทร"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"เปลี่ยนแอปแป้นโทรศัพท์เริ่มต้นไหม"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"ใช้ <xliff:g id="NEW_APP">%1$s</xliff:g> เป็นแอปแป้นโทรศัพท์เริ่มต้นแทน <xliff:g id="CURRENT_APP">%2$s</xliff:g> ไหม"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"ใช้ <xliff:g id="NEW_APP">%s</xliff:g> เป็นแอปแป้นโทรศัพท์เริ่มต้นไหม"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index b711f07..2de1ac5 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Pamamahala sa Tawag"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Pamamahala sa Tawag sa Telepono"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telepono"</string>
     <string name="unknown" msgid="6878797917991465859">"Di-kilala"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Hindi nasagot na tawag"</string>
@@ -29,7 +29,7 @@
     <string name="accessibility_call_muted" msgid="2776111226185342220">"Naka-mute ang tawag."</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"Pinapagana ang speakerphone."</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Di masagot ngayon. Ano\'ng meron?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Tawagan kita muli."</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Tawagan kita ulit."</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Tawagan kita mamaya."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Di masagot ngayon. Tawag ka mamaya?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Mga mabilisang tugon"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Nawawala ang numero ng voicemail"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Walang nakaimbak na numero ng voicemail sa SIM card."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Magdagdag ng numero"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Gawing iyong default na app na Telepono ang <xliff:g id="NEW_APP">%s</xliff:g>?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Magtakda ng Default"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Kanselahin"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"Ang <xliff:g id="NEW_APP">%s</xliff:g> ay magagawang tumawag at kontrolin ang lahat ng aspeto ng tawag. Mga app na pinagkakatiwalaan mo lang ang dapat itakda bilang default na app na Telepono."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Mga naka-block na numero"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Hindi ka makakatanggap ng mga tawag o mga text mula sa mga naka-block na numero."</string>
-    <string name="block_number" msgid="1101252256321306179">"Magdagdag ng numero"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Aalisin ba sa pagkaka-block ang <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Alisin sa pagkaka-block"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"I-block ang mga tawag at text mula sa"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Numero ng telepono"</string>
-    <string name="block_button" msgid="8822290682524373357">"I-block"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Ang may-ari ng device lang ang makakakita at makakapamahala sa mga naka-block na numero."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Inaalis sa pagkaka-block"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Pansamantalang naka-off ang pag-block"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Pagkatapos mong i-dial o i-text ang isang pang-emergency na numero, ino-off ang pag-block upang matiyak na maaaring makipag-ugnayan sa iyo ang mga serbisyong pang-emergency."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"I-enable muli ngayon"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Naka-block ang <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Naka-unblock ang <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Hindi ma-block ang numerong pang-emergency."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Naka-block na ang <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Ginagamit ang personal na dialer upang tumawag"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Baguhin ang iyong default na Dialer app?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Gamitin ang <xliff:g id="NEW_APP">%1$s</xliff:g> sa halip na <xliff:g id="CURRENT_APP">%2$s</xliff:g> bilang default na dialer app mo?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Gamitin ang <xliff:g id="NEW_APP">%s</xliff:g> bilang default na dialer app mo?"</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 5c20656..b3c6698 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Çağrı Yönetimi"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefon Çağrısı Yönetimi"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Bilinmiyor"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Cevapsız çağrı"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Eksik sesli mesaj numarası"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartta depolanan sesli mesaj numarası yok."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Numara ekle"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> varsayılan Telefon uygulamanız yapılsın mı?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Varsayılan Uygulamayı Ayarla"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"İptal"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> uygulaması üzerinden çağrı yapabilecek ve çağrıları her yönüyle kontrol edebileceksiniz. Yalnızca güvendiğiniz uygulamalar varsayılan Telefon uygulaması olarak ayarlanmalıdır."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Engellenen numaralar"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Engellenen numaralardan gelen çağrıları veya kısa mesajları almazsınız."</string>
-    <string name="block_number" msgid="1101252256321306179">"Numara ekle"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> numaralı telefonun engellemesi kaldırılsın mı?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Engellemeyi kaldır"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Şu numaradan gelen çağrıları ve kısa mesajları engelle:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefon numarası"</string>
-    <string name="block_button" msgid="8822290682524373357">"Engelle"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Yalnızca cihaz sahibi engellenen numaraları görüntüleyebilir ve yönetebilir."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Engellemeyi kaldır"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Engelleme geçici olarak kapalı"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Bir acil durum numarasını çevirmenizin veya acil durum numarasına kısa mesaj göndermenizin ardından acil durum hizmetlerinin size ulaşabilmesi için engelleme kapatılır."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Şimdi yeniden etkinleştir"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> engellendi"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> numaralı telefonun engellemesi kaldırıldı"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Acil durum numarası engellenemedi."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> zaten engellenmiş durumda."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Telefon etmek için kişisel numara çeviriciyi kullanma"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Varsayılan Numara Çeviri uygulaması değiştirilsin mi?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Varsayılan numara çevirici uygulamanız olarak <xliff:g id="CURRENT_APP">%2$s</xliff:g> yerine <xliff:g id="NEW_APP">%1$s</xliff:g> kullanılsın mı?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Varsayılan numara çevirici uygulamanız olarak <xliff:g id="NEW_APP">%s</xliff:g> kullanılsın mı?"</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 036ea40..7bdfe8c 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Керування дзвінками"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Керування дзвінками"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Телефон"</string>
     <string name="unknown" msgid="6878797917991465859">"Невідомий"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Пропущений виклик"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Відстуній номер голосової пошти"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM-карті немає збереж. номерів голос. пошти."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Додати номер"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Зробити <xliff:g id="NEW_APP">%s</xliff:g> додатком для викликів за умовчанням?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Установити за умовчанням"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Скасувати"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"За допомогою додатка <xliff:g id="NEW_APP">%s</xliff:g> ви зможете здійснювати та контролювати виклики. Лише довірені додатки можна встановлювати як додатки для викликів за умовчанням."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Заблоковані номери"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Ви не отримуватимете виклики й повідомлення із заблокованих номерів."</string>
-    <string name="block_number" msgid="1101252256321306179">"Додати номер"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Розблокувати <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Розблокувати"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Заблокувати виклики та SMS із"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Номер телефону"</string>
-    <string name="block_button" msgid="8822290682524373357">"Заблокувати"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Лише власник пристрою може переглядати заблоковані номери та керувати ними."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Розблокувати"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Блокування тимчасово вимкнено"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Після набору або введення екстреного номеру блокування вимикається, щоб із вами могли зв’язатися представники екстрених служб."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Відновити"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Номер <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> заблоковано"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Номер <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> розблоковано"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Неможливо заблокувати номер екстреної служби."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"Номер <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> уже заблоковано."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Для дзвінків використовується особистий додаток набору номерів"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Змінити додаток для дзвінків за умовчанням?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Зробити <xliff:g id="NEW_APP">%1$s</xliff:g> додатком для дзвінків за умовчанням замість додатка <xliff:g id="CURRENT_APP">%2$s</xliff:g>?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Зробити <xliff:g id="NEW_APP">%s</xliff:g> додатком для дзвінків за умовчанням?"</string>
 </resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index b917066..ccb3eb0 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"کال مینجمنٹ"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"فون کال کا نظم"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"فون"</string>
     <string name="unknown" msgid="6878797917991465859">"نامعلوم"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"چھوٹی ہوئی کال"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"صوتی میل نمبر درج نہیں ہے"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"‏SIM کارڈ پر کوئی بھی صوتی میل نمبر اسٹور نہیں ہے۔"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"نمبر شامل کریں"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"<xliff:g id="NEW_APP">%s</xliff:g> کو اپنی ڈیفالٹ فون ایپ بنائیں؟"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"ڈیفالٹ سیٹ کریں"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"منسوخ کریں"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> کال کرنے اور اس کے باقی تمام پہلوؤں کو کنٹرول کر پائے گی۔ صرف ان ایپس کو بطور ڈیفالٹ فون ایپ سیٹ کرنا چاہئیے جن پر آپ کو اعتماد ہے۔"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"مسدود کردہ نمبرز"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"آپ مسدود کردہ نمبروں سے کالیں یا متنی پیغامات وصول نہیں کریں گے۔"</string>
-    <string name="block_number" msgid="1101252256321306179">"ایک نمبر شامل کریں"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> غیر مسدود کریں؟"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"غیر مسدود کریں"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"اس نمبر سے کالز اور پیغامات مسدود کریں"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"فون نمبر"</string>
-    <string name="block_button" msgid="8822290682524373357">"مسدود کریں"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"صرف آلہ کا مالک مسدود کردہ نمبرز کو دیکھ سکتا ہے اور ان کا نظم کر سکتا ہے۔"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"غیر مسدود کریں"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"مسدود کرنا عارضی طور پر آف ہے"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"جب آپ کوئی ایمرجنسی نمبر ڈائل کرتے یا اسے متن بھیجتے ہیں تو انسداد کو آ‌ف کر دیا جاتا ہے تاکہ ہنگامی سروسز آپ سے رابطہ کر سکیں۔"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"اب دوبارہ فعال کریں"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> مسدود ہے"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> غیر مسدود ہے"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"ہنگامی نمبر مسدود کرنے سے قاصر۔"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> پہلے ہی مسدود ہے۔"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"کال کرنے کیلئے ذاتی ڈائلر استعمال ہو رہا ہے"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"ڈیفالٹ ڈائلر ایپ تبدیل کریں"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"<xliff:g id="CURRENT_APP">%2$s</xliff:g> کی بجائے <xliff:g id="NEW_APP">%1$s</xliff:g> کو بطور اپنی ڈیفالٹ ڈائلر ایپ استعمال کریں؟"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> کو بطور اپنی ڈیفالٹ ڈائلر ایپ استعمال کریں؟"</string>
 </resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 8e8ab26..c42152f 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Qo‘ng‘iroqlar boshqaruvi"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Telefon – qo‘ng‘iroqlarni boshqarish"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Telefon"</string>
     <string name="unknown" msgid="6878797917991465859">"Noma’lum"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Javobsiz qo‘ng‘iroq"</string>
@@ -37,7 +37,7 @@
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
     <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"Tezkor javob"</string>
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"Xabar <xliff:g id="PHONE_NUMBER">%s</xliff:g>ga jo‘natildi."</string>
-    <string name="enable_account_preference_title" msgid="2021848090086481720">"Qo‘ng‘iroq uchun hisoblar"</string>
+    <string name="enable_account_preference_title" msgid="2021848090086481720">"Qo‘ng‘iroq hisoblari"</string>
     <string name="outgoing_call_not_allowed_user_restriction" msgid="6872406278300131364">"Faqat favqulodda qo‘ng‘iroqlarga ruxsat berilgan."</string>
     <string name="outgoing_call_not_allowed_no_permission" msgid="1996571596464271228">"Bu ilova Telefon ruxsatnomasisiz chiquvchi qo‘ng‘iroqlarni amalga oshira olmaydi."</string>
     <string name="outgoing_call_error_no_phone_number_supplied" msgid="1940125199802007505">"Qo‘ng‘iroq qilish uchun raqamni to‘g‘ri kiriting."</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Ovozli pochta raqami ko‘rsatilmagan"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartada birorta ham ovozli pochta raqami yo‘q."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Raqam qo‘shish"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Qo‘ng‘iroq. uchun <xliff:g id="NEW_APP">%s</xliff:g> asosiy ilova sifatida o‘rnatilsinmi?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Asosiy ilova sifatida o‘rnatish"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Bekor qilish"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> ilovasi qo‘ng‘iroq qilishga yodam beradi va qo‘ng‘iroqlarga tegishli boshqa barcha parametrlarni boshqaradi. Qo‘ng‘iroqlar uchun faqat ishonarli ilovani asosiy ilova qilib o‘rnatish lozim."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Bloklangan raqamlar"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Bloklangan raqamlardan keladigan qo‘ng‘iroq yoki SMS xabarlar qabul qilinmaydi."</string>
-    <string name="block_number" msgid="1101252256321306179">"Raqam qo‘shish"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> raqami blokdan chiqarilsinmi?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Blokdan chiqarish"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Quyidagi raqamdan keladigan qo‘ng‘iroq va SMS xabarlar bloklansin"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Telefon raqami"</string>
-    <string name="block_button" msgid="8822290682524373357">"Bloklash"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Faqat qurilma egasi bloklangan raqamlarni ko‘rishi va boshqarishi mumkin."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Blokdan chiqarish"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Telefon raqamini bloklash xususiyati vaqtinchalik o‘chirib qo‘yilgan"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Favqulodda chaqiruv raqamiga qo‘ng‘iroq qilganda yoki unga matnli xabar yuborganingizda, favqulodda holatlar xizmati xodimlari siz bilan bog‘lana olishlari uchun telefoningizda telefon raqamlarini bloklash xususiyati o‘chirib qo‘yiladi."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Qayta faollashtirish"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> raqami bloklandi"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> raqami blokdan chiqarildi"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Favqulodda qo‘ng‘iroq raqamini bloklab bo‘lmadi."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> raqami allaqachon bloklangan."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Qo‘ng‘iroq qilish uchun shaxsiy raqam tergichdan foydalanilmoqda"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Birlamchi raqam terish ilovasi o‘zgartirilsinmi?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Raqam terish uchun birlamchi ilova sifatida <xliff:g id="CURRENT_APP">%2$s</xliff:g> o‘rniga <xliff:g id="NEW_APP">%1$s</xliff:g> ilovasi tanlansinmi?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"<xliff:g id="NEW_APP">%s</xliff:g> raqam terish uchun birlamchi ilova sifatida tanlansinmi?"</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 2308246..df5f1c4 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Quản lý cuộc gọi"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Quản lý cuộc gọi điện thoại"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Điện thoại"</string>
     <string name="unknown" msgid="6878797917991465859">"Không xác định"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Cuộc gọi nhỡ"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Thiếu số thư thoại"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Không có số thư thoại nào được lưu trữ trên thẻ SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Thêm số điện thoại"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Đặt <xliff:g id="NEW_APP">%s</xliff:g> làm ứng dụng Điện thoại mặc định của bạn?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Đặt làm mặc định"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Hủy"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> sẽ có thể đặt và kiểm soát mọi khía cạnh của cuộc gọi. Chỉ nên đặt những ứng dụng mà bạn tin cậy làm ứng dụng Điện thoại mặc định."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Số bị chặn"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Bạn sẽ không nhận được cuộc gọi hoặc tin nhắn từ các số bị chặn."</string>
-    <string name="block_number" msgid="1101252256321306179">"Thêm số điện thoại"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Bỏ chặn <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Bỏ chặn"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Chặn cuộc gọi và tin nhắn từ"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Số điện thoại"</string>
-    <string name="block_button" msgid="8822290682524373357">"Chặn"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Chỉ chủ sở hữu thiết bị mới có thể xem và quản lý các số bị chặn."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Bỏ chặn"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Chế độ chặn tạm thời tắt"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Sau khi bạn quay số hoặc gửi tin nhắn tới số khẩn cấp, chế độ chặn sẽ bị tắt để đảm bảo dịch vụ khẩn cấp có thể liên hệ với bạn."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Bật lại ngay bây giờ"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"Đã chặn <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"Đã bỏ chặn <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Không thể chặn số khẩn cấp."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> đã bị chặn."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Sử dụng trình quay số cá nhân để gọi điện"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Thay đổi ứng dụng Trình quay số mặc định?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Sử dụng <xliff:g id="NEW_APP">%1$s</xliff:g> làm ứng dụng trình quay số mặc định của bạn thay vì <xliff:g id="CURRENT_APP">%2$s</xliff:g>?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Sử dụng <xliff:g id="NEW_APP">%s</xliff:g> làm ứng dụng trình quay số mặc định của bạn?"</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 8374edb..eda2169 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"通话管理"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"通话管理"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"电话"</string>
     <string name="unknown" msgid="6878797917991465859">"未知"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"未接电话"</string>
@@ -25,7 +25,7 @@
     <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 个未接电话"</string>
     <string name="notification_missedCallTicker" msgid="504686252427747209">"来自<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>的未接电话"</string>
     <string name="notification_missedCall_call_back" msgid="2684890353590890187">"回拨"</string>
-    <string name="notification_missedCall_message" msgid="3049928912736917988">"发短信"</string>
+    <string name="notification_missedCall_message" msgid="3049928912736917988">"短信"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"通话已静音。"</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"扬声器已启用。"</string>
     <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"现在无法接听。有什么事吗?"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"缺少语音信箱号码"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM卡上未存储语音信箱号码。"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"添加号码"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"要将 <xliff:g id="NEW_APP">%s</xliff:g> 设为默认电话应用吗?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"设为默认电话应用"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"取消"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> 将可用于拨打电话和全面管理通话。请务必仅将您信任的应用设为默认电话应用。"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"已屏蔽的号码"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"您不会收到来自已屏蔽的号码的来电或短信。"</string>
-    <string name="block_number" msgid="1101252256321306179">"添加电话号码"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"要取消屏蔽 <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> 吗?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"取消屏蔽"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"屏蔽以下号码的来电和短信:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"电话号码"</string>
-    <string name="block_button" msgid="8822290682524373357">"屏蔽"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"只有机主才能查看和管理已屏蔽的号码。"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"取消屏蔽"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"已暂时关闭来电拦截功能"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"您拨打紧急服务电话或向其发送短信后,系统会关闭来电拦截功能,以确保紧急服务人员能与您联系。"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"立即重新启用"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"已屏蔽 <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"已取消屏蔽 <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"无法屏蔽紧急服务号码。"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> 已被屏蔽。"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"使用个人拨号器拨打电话"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"要更改默认拨号器应用吗?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"要使用<xliff:g id="NEW_APP">%1$s</xliff:g>(而非<xliff:g id="CURRENT_APP">%2$s</xliff:g>)作为您的默认拨号器应用吗?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"要使用<xliff:g id="NEW_APP">%s</xliff:g>作为您的默认拨号器应用吗?"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 0dff76b..7310bc0 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"通話管理"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"手機通話管理"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"電話"</string>
     <string name="unknown" msgid="6878797917991465859">"未知"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"未接來電"</string>
@@ -28,8 +28,8 @@
     <string name="notification_missedCall_message" msgid="3049928912736917988">"短訊"</string>
     <string name="accessibility_call_muted" msgid="2776111226185342220">"通話已靜音。"</string>
     <string name="accessibility_speakerphone_enabled" msgid="1988512040421036359">"擴音器已啟用"</string>
-    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"我現在不方便通話,有什麼事嗎?"</string>
-    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"我很快會打電話給你。"</string>
+    <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"我現在不方便通話,有什麼事?"</string>
+    <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"我待會就打電話給你。"</string>
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"我晚點打電話給你。"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"我現在不方便通話,晚點再打來好嗎?"</string>
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"快速回應"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"未填留言信箱號碼"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 卡中沒有儲存任何留言信箱號碼。"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"新增電話號碼"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"要將<xliff:g id="NEW_APP">%s</xliff:g>設為預設電話應用程式嗎?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"設為預設"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"取消"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"「<xliff:g id="NEW_APP">%s</xliff:g>」將可撥打電話並控制所有相關功能。只有您信任的應用程式,才應設為預設手機應用程式。"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"已封鎖的號碼"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"您不會收到已封鎖號碼的來電或短訊。"</string>
-    <string name="block_number" msgid="1101252256321306179">"新增號碼"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"要解除封鎖 <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> 嗎?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"解除封鎖"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"封鎖下列號碼的來電和短訊:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"電話號碼"</string>
-    <string name="block_button" msgid="8822290682524373357">"封鎖"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"只有裝置擁有者可查看和管理已封鎖的號碼。"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"解除封鎖"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"暫時關閉封鎖功能"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"在您撥打或發短訊至緊急號碼後,封鎖功能會停用,以確保緊急服務可與您聯絡。"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"立即重新啟用"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"已封鎖 <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"已解除對 <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> 的封鎖"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"無法封鎖緊急電話號碼。"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"已封鎖 <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>。"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"使用個人撥號器撥打電話"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"變更預設撥號器應用程式?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"使用 <xliff:g id="NEW_APP">%1$s</xliff:g> 取代 <xliff:g id="CURRENT_APP">%2$s</xliff:g> 作為預設撥號器應用程式?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"使用 <xliff:g id="NEW_APP">%s</xliff:g> 為預設撥號器應用程式?"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 7bb98a9..137f641 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"通話管理"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"通話管理"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"電話"</string>
     <string name="unknown" msgid="6878797917991465859">"不明"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"未接來電"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"遺失語音信箱號碼"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 卡中未儲存語音信箱號碼。"</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"新增號碼"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"確定要將 <xliff:g id="NEW_APP">%s</xliff:g> 設為預設電話應用程式嗎?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"設為預設電話應用程式"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"取消"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"這樣一來,<xliff:g id="NEW_APP">%s</xliff:g> 將能撥打電話及控管所有通話設定。請務必只將您信任的應用程式設為預設電話應用程式。"</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"已封鎖的號碼"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"您不會收到已封鎖號碼的來電或簡訊。"</string>
-    <string name="block_number" msgid="1101252256321306179">"新增號碼"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"要解除封鎖 <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g> 嗎?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"解除封鎖"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"封鎖以下號碼的來電和簡訊:"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"電話號碼"</string>
-    <string name="block_button" msgid="8822290682524373357">"封鎖"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"只有裝置擁有者能夠查看及管理已封鎖的號碼。"</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"解除封鎖"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"已暫時停用來電封鎖功能"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"當您撥打或傳送簡訊到緊急服務電話後,系統就會停用來電封鎖功能,以確保緊急服務人員能夠與您聯絡。"</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"立即重新啟用"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"已封鎖 <xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"已解除封鎖 <xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g>"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"無法封鎖緊急服務電話號碼。"</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> 已在封鎖清單中。"</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"使用個人撥號程式撥打電話"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"要變更預設撥號應用程式嗎?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"要將 <xliff:g id="NEW_APP">%1$s</xliff:g> (而非 <xliff:g id="CURRENT_APP">%2$s</xliff:g>) 設為預設撥號應用程式嗎?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"要將 <xliff:g id="NEW_APP">%s</xliff:g> 設為預設撥號應用程式嗎?"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index b65700c..5e1cad7 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="telecommAppLabel" product="default" msgid="382363169988504520">"Ukuphathwa kwekholi"</string>
+    <string name="telecommAppLabel" product="default" msgid="9166784827254469057">"Ukuphathwa kwekholi yefoni"</string>
     <string name="userCallActivityLabel" product="default" msgid="5415173590855187131">"Ifoni"</string>
     <string name="unknown" msgid="6878797917991465859">"Akwaziwa"</string>
     <string name="notification_missedCallTitle" msgid="7554385905572364535">"Ikholi ekulahlekele"</string>
@@ -45,26 +45,7 @@
     <string name="no_vm_number" msgid="4164780423805688336">"Inombolo engekho yomyalezo wezwi"</string>
     <string name="no_vm_number_msg" msgid="1300729501030053828">"Ayikho inombolo yomlayezo wezwi egcinwe ekhadini le-SIM."</string>
     <string name="add_vm_number_str" msgid="4676479471644687453">"Engeza inombolo"</string>
-    <string name="change_default_dialer_dialog_title" msgid="9101655962941740507">"Yenza i-<xliff:g id="NEW_APP">%s</xliff:g> uhlelo lwakho lwefoni oluzenzakalelayo?"</string>
-    <string name="change_default_dialer_dialog_affirmative" msgid="8606546663509166276">"Setha okuzenzakalelayo"</string>
-    <string name="change_default_dialer_dialog_negative" msgid="9078144617060173845">"Khansela"</string>
-    <string name="change_default_dialer_warning_message" msgid="1417671460801684999">"<xliff:g id="NEW_APP">%s</xliff:g> Uzokwazi ukubeka nokulawula zonke izinto zamakholi. Izinhlelo zokusebenza kuphela ozithembayo ezingasethwa njengohlelo lokusebenza oluzenzakalelayo lefoni."</string>
-    <string name="blocked_numbers" msgid="2751843139572970579">"Izinombolo ezivinjiwe"</string>
-    <string name="blocked_numbers_msg" msgid="1045015186124965643">"Ngeke uthole amakholi noma imibhalo kusuka kuzinombolo ezivinjelwe."</string>
-    <string name="block_number" msgid="1101252256321306179">"Engeza inombolo"</string>
-    <string name="unblock_dialog_body" msgid="1614238499771862793">"Vulela i-<xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
-    <string name="unblock_button" msgid="3078048901972674170">"Vulela"</string>
-    <string name="add_blocked_dialog_body" msgid="9030243212265516828">"Vimba amakholi nemibhalo kusukela ku-"</string>
-    <string name="add_blocked_number_hint" msgid="6847675097085433553">"Inombolo yefoni"</string>
-    <string name="block_button" msgid="8822290682524373357">"Vimba"</string>
-    <string name="non_primary_user" msgid="5180129233352533459">"Umnikazi wedivayisi kuphela ongabuka aphinde aphathe izinombolo ezivinjelwe."</string>
-    <string name="delete_icon_description" msgid="8903995728252556724">"Vulela"</string>
-    <string name="blocked_numbers_butter_bar_title" msgid="438170866438793182">"Ukuvimble kuvaliwe okwesikhashana"</string>
-    <string name="blocked_numbers_butter_bar_body" msgid="2223244484319442431">"Ngemuva kokudayela noma ubhalele inombolo yesimo esiphuthumayo, ukuvimbela kuvaliwe ukuqinisekisa amasevisi esimo esiphuthumayo angakwazi ukuxhumana nawe."</string>
-    <string name="blocked_numbers_butter_bar_button" msgid="2197943354922010696">"Nika amandla manje"</string>
-    <string name="blocked_numbers_number_blocked_message" msgid="7678509606805029540">"I-<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ivinjiwe"</string>
-    <string name="blocked_numbers_number_unblocked_message" msgid="977894647366750418">"I-<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> ayivinjiwe"</string>
-    <string name="blocked_numbers_block_emergency_number_message" msgid="917851876780698387">"Ayikwazi ukuvimba inombolo yesimo esiphuthumayo."</string>
-    <string name="blocked_numbers_number_already_blocked_message" msgid="4392247814500811798">"I-<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> isivele ivinjiwe."</string>
-    <string name="toast_personal_call_msg" msgid="5115361633476779723">"Ukusebenzisa okokudayila komuntu siqu ukwenza ikholi"</string>
+    <string name="change_default_dialer_dialog_title" msgid="4430590714918044425">"Guqula uhlelo lwakho lokusebenza oluzenzakalelayo lokudayela?"</string>
+    <string name="change_default_dialer_with_previous_app_set_text" msgid="3213396537499337949">"Sebenzisa i-<xliff:g id="NEW_APP">%1$s</xliff:g> esikhundleni se-<xliff:g id="CURRENT_APP">%2$s</xliff:g> njengohlelo lwakho lokusebenza oluzenzakalelayo lokokudayela?"</string>
+    <string name="change_default_dialer_no_previous_app_set_text" msgid="7608426684114545221">"Sebenzisa i-<xliff:g id="NEW_APP">%s</xliff:g> njengohlelo lwakho lokusebenza oluzenzakalelayo lokokudayela?"</string>
 </resources>
diff --git a/scripts/telecom_testing.sh b/scripts/telecom_testing.sh
index 105ec8b..6884f5f 100644
--- a/scripts/telecom_testing.sh
+++ b/scripts/telecom_testing.sh
@@ -13,12 +13,12 @@
   -h                    This help message.
   "
 
-  OPTIND=1
-  class=
-  install=false
-  installwdep=false
-  debug=false
-  coverage=false
+  local OPTIND=1
+  local class=
+  local install=false
+  local installwdep=false
+  local debug=false
+  local coverage=false
 
   while getopts "c:hadie" opt; do
     case "$opt" in
@@ -42,17 +42,20 @@
     esac
   done
 
-  T=$(gettop)
+  local T=$(gettop)
 
   if [ $install = true ] ; then
-    olddir=$(pwd)
+    local olddir=$(pwd)
+    local emma_opt=
     cd $T
+    # Build and exit script early if build fails
+
     if [ $coverage = true ] ; then
       emma_opt="EMMA_INSTRUMENT_STATIC=true"
     else
       emma_opt="EMMA_INSTRUMENT_STATIC=false"
     fi
-    # Build and exit script early if build fails
+
     if [ $installwdep = true ] ; then
       mmma -j40 "packages/services/Telecomm/tests" ${emma_opt}
     else
@@ -63,7 +66,10 @@
       return
     fi
 
-    adb install -r -t "out/target/product/$TARGET_PRODUCT/data/app/TelecomUnitTests/TelecomUnitTests.apk"
+    # Strip off any possible aosp_ prefix from the target product
+    local canonical_product=$(sed 's/^aosp_//' <<< "$TARGET_PRODUCT")
+
+    adb install -r -t "out/target/product/$canonical_product/data/app/TelecomUnitTests/TelecomUnitTests.apk"
     if [ $? -ne 0 ] ; then
       cd "$olddir"
       return $?
@@ -71,7 +77,7 @@
     cd "$olddir"
   fi
 
-  e_options=""
+  local e_options=""
   if [ -n "$class" ] ; then
     e_options="${e_options} -e class com.android.server.telecom.tests.${class}"
   fi
diff --git a/src/com/android/server/telecom/Analytics.java b/src/com/android/server/telecom/Analytics.java
index 2b6ace5..4daa525 100644
--- a/src/com/android/server/telecom/Analytics.java
+++ b/src/com/android/server/telecom/Analytics.java
@@ -18,9 +18,11 @@
 
 import android.telecom.Connection;
 import android.telecom.DisconnectCause;
+import android.telecom.Logging.EventManager;
 import android.telecom.ParcelableCallAnalytics;
 import android.telecom.TelecomAnalytics;
 import android.util.Base64;
+import android.telecom.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IndentingPrintWriter;
@@ -49,92 +51,92 @@
 
     public static final Map<String, Integer> sLogEventToAnalyticsEvent =
             new HashMap<String, Integer>() {{
-                put(Log.Events.SET_SELECT_PHONE_ACCOUNT, AnalyticsEvent.SET_SELECT_PHONE_ACCOUNT);
-                put(Log.Events.REQUEST_HOLD, AnalyticsEvent.REQUEST_HOLD);
-                put(Log.Events.REQUEST_UNHOLD, AnalyticsEvent.REQUEST_UNHOLD);
-                put(Log.Events.SWAP, AnalyticsEvent.SWAP);
-                put(Log.Events.SKIP_RINGING, AnalyticsEvent.SKIP_RINGING);
-                put(Log.Events.CONFERENCE_WITH, AnalyticsEvent.CONFERENCE_WITH);
-                put(Log.Events.SPLIT_FROM_CONFERENCE, AnalyticsEvent.SPLIT_CONFERENCE);
-                put(Log.Events.SET_PARENT, AnalyticsEvent.SET_PARENT);
-                put(Log.Events.MUTE, AnalyticsEvent.MUTE);
-                put(Log.Events.UNMUTE, AnalyticsEvent.UNMUTE);
-                put(Log.Events.AUDIO_ROUTE_BT, AnalyticsEvent.AUDIO_ROUTE_BT);
-                put(Log.Events.AUDIO_ROUTE_EARPIECE, AnalyticsEvent.AUDIO_ROUTE_EARPIECE);
-                put(Log.Events.AUDIO_ROUTE_HEADSET, AnalyticsEvent.AUDIO_ROUTE_HEADSET);
-                put(Log.Events.AUDIO_ROUTE_SPEAKER, AnalyticsEvent.AUDIO_ROUTE_SPEAKER);
-                put(Log.Events.SILENCE, AnalyticsEvent.SILENCE);
-                put(Log.Events.SCREENING_COMPLETED, AnalyticsEvent.SCREENING_COMPLETED);
-                put(Log.Events.BLOCK_CHECK_FINISHED, AnalyticsEvent.BLOCK_CHECK_FINISHED);
-                put(Log.Events.DIRECT_TO_VM_FINISHED, AnalyticsEvent.DIRECT_TO_VM_FINISHED);
-                put(Log.Events.REMOTELY_HELD, AnalyticsEvent.REMOTELY_HELD);
-                put(Log.Events.REMOTELY_UNHELD, AnalyticsEvent.REMOTELY_UNHELD);
-                put(Log.Events.REQUEST_PULL, AnalyticsEvent.REQUEST_PULL);
-                put(Log.Events.REQUEST_ACCEPT, AnalyticsEvent.REQUEST_ACCEPT);
-                put(Log.Events.REQUEST_REJECT, AnalyticsEvent.REQUEST_REJECT);
-                put(Log.Events.SET_ACTIVE, AnalyticsEvent.SET_ACTIVE);
-                put(Log.Events.SET_DISCONNECTED, AnalyticsEvent.SET_DISCONNECTED);
-                put(Log.Events.SET_HOLD, AnalyticsEvent.SET_HOLD);
-                put(Log.Events.SET_DIALING, AnalyticsEvent.SET_DIALING);
-                put(Log.Events.START_CONNECTION, AnalyticsEvent.START_CONNECTION);
-                put(Log.Events.BIND_CS, AnalyticsEvent.BIND_CS);
-                put(Log.Events.CS_BOUND, AnalyticsEvent.CS_BOUND);
-                put(Log.Events.SCREENING_SENT, AnalyticsEvent.SCREENING_SENT);
-                put(Log.Events.DIRECT_TO_VM_INITIATED, AnalyticsEvent.DIRECT_TO_VM_INITIATED);
-                put(Log.Events.BLOCK_CHECK_INITIATED, AnalyticsEvent.BLOCK_CHECK_INITIATED);
-                put(Log.Events.FILTERING_INITIATED, AnalyticsEvent.FILTERING_INITIATED);
-                put(Log.Events.FILTERING_COMPLETED, AnalyticsEvent.FILTERING_COMPLETED);
-                put(Log.Events.FILTERING_TIMED_OUT, AnalyticsEvent.FILTERING_TIMED_OUT);
+                put(LogUtils.Events.SET_SELECT_PHONE_ACCOUNT, AnalyticsEvent.SET_SELECT_PHONE_ACCOUNT);
+                put(LogUtils.Events.REQUEST_HOLD, AnalyticsEvent.REQUEST_HOLD);
+                put(LogUtils.Events.REQUEST_UNHOLD, AnalyticsEvent.REQUEST_UNHOLD);
+                put(LogUtils.Events.SWAP, AnalyticsEvent.SWAP);
+                put(LogUtils.Events.SKIP_RINGING, AnalyticsEvent.SKIP_RINGING);
+                put(LogUtils.Events.CONFERENCE_WITH, AnalyticsEvent.CONFERENCE_WITH);
+                put(LogUtils.Events.SPLIT_FROM_CONFERENCE, AnalyticsEvent.SPLIT_CONFERENCE);
+                put(LogUtils.Events.SET_PARENT, AnalyticsEvent.SET_PARENT);
+                put(LogUtils.Events.MUTE, AnalyticsEvent.MUTE);
+                put(LogUtils.Events.UNMUTE, AnalyticsEvent.UNMUTE);
+                put(LogUtils.Events.AUDIO_ROUTE_BT, AnalyticsEvent.AUDIO_ROUTE_BT);
+                put(LogUtils.Events.AUDIO_ROUTE_EARPIECE, AnalyticsEvent.AUDIO_ROUTE_EARPIECE);
+                put(LogUtils.Events.AUDIO_ROUTE_HEADSET, AnalyticsEvent.AUDIO_ROUTE_HEADSET);
+                put(LogUtils.Events.AUDIO_ROUTE_SPEAKER, AnalyticsEvent.AUDIO_ROUTE_SPEAKER);
+                put(LogUtils.Events.SILENCE, AnalyticsEvent.SILENCE);
+                put(LogUtils.Events.SCREENING_COMPLETED, AnalyticsEvent.SCREENING_COMPLETED);
+                put(LogUtils.Events.BLOCK_CHECK_FINISHED, AnalyticsEvent.BLOCK_CHECK_FINISHED);
+                put(LogUtils.Events.DIRECT_TO_VM_FINISHED, AnalyticsEvent.DIRECT_TO_VM_FINISHED);
+                put(LogUtils.Events.REMOTELY_HELD, AnalyticsEvent.REMOTELY_HELD);
+                put(LogUtils.Events.REMOTELY_UNHELD, AnalyticsEvent.REMOTELY_UNHELD);
+                put(LogUtils.Events.REQUEST_PULL, AnalyticsEvent.REQUEST_PULL);
+                put(LogUtils.Events.REQUEST_ACCEPT, AnalyticsEvent.REQUEST_ACCEPT);
+                put(LogUtils.Events.REQUEST_REJECT, AnalyticsEvent.REQUEST_REJECT);
+                put(LogUtils.Events.SET_ACTIVE, AnalyticsEvent.SET_ACTIVE);
+                put(LogUtils.Events.SET_DISCONNECTED, AnalyticsEvent.SET_DISCONNECTED);
+                put(LogUtils.Events.SET_HOLD, AnalyticsEvent.SET_HOLD);
+                put(LogUtils.Events.SET_DIALING, AnalyticsEvent.SET_DIALING);
+                put(LogUtils.Events.START_CONNECTION, AnalyticsEvent.START_CONNECTION);
+                put(LogUtils.Events.BIND_CS, AnalyticsEvent.BIND_CS);
+                put(LogUtils.Events.CS_BOUND, AnalyticsEvent.CS_BOUND);
+                put(LogUtils.Events.SCREENING_SENT, AnalyticsEvent.SCREENING_SENT);
+                put(LogUtils.Events.DIRECT_TO_VM_INITIATED, AnalyticsEvent.DIRECT_TO_VM_INITIATED);
+                put(LogUtils.Events.BLOCK_CHECK_INITIATED, AnalyticsEvent.BLOCK_CHECK_INITIATED);
+                put(LogUtils.Events.FILTERING_INITIATED, AnalyticsEvent.FILTERING_INITIATED);
+                put(LogUtils.Events.FILTERING_COMPLETED, AnalyticsEvent.FILTERING_COMPLETED);
+                put(LogUtils.Events.FILTERING_TIMED_OUT, AnalyticsEvent.FILTERING_TIMED_OUT);
             }};
 
     public static final Map<String, Integer> sLogSessionToSessionId =
             new HashMap<String, Integer> () {{
-                put(Log.Sessions.ICA_ANSWER_CALL, SessionTiming.ICA_ANSWER_CALL);
-                put(Log.Sessions.ICA_REJECT_CALL, SessionTiming.ICA_REJECT_CALL);
-                put(Log.Sessions.ICA_DISCONNECT_CALL, SessionTiming.ICA_DISCONNECT_CALL);
-                put(Log.Sessions.ICA_HOLD_CALL, SessionTiming.ICA_HOLD_CALL);
-                put(Log.Sessions.ICA_UNHOLD_CALL, SessionTiming.ICA_UNHOLD_CALL);
-                put(Log.Sessions.ICA_MUTE, SessionTiming.ICA_MUTE);
-                put(Log.Sessions.ICA_SET_AUDIO_ROUTE, SessionTiming.ICA_SET_AUDIO_ROUTE);
-                put(Log.Sessions.ICA_CONFERENCE, SessionTiming.ICA_CONFERENCE);
-                put(Log.Sessions.CSW_HANDLE_CREATE_CONNECTION_COMPLETE,
+                put(LogUtils.Sessions.ICA_ANSWER_CALL, SessionTiming.ICA_ANSWER_CALL);
+                put(LogUtils.Sessions.ICA_REJECT_CALL, SessionTiming.ICA_REJECT_CALL);
+                put(LogUtils.Sessions.ICA_DISCONNECT_CALL, SessionTiming.ICA_DISCONNECT_CALL);
+                put(LogUtils.Sessions.ICA_HOLD_CALL, SessionTiming.ICA_HOLD_CALL);
+                put(LogUtils.Sessions.ICA_UNHOLD_CALL, SessionTiming.ICA_UNHOLD_CALL);
+                put(LogUtils.Sessions.ICA_MUTE, SessionTiming.ICA_MUTE);
+                put(LogUtils.Sessions.ICA_SET_AUDIO_ROUTE, SessionTiming.ICA_SET_AUDIO_ROUTE);
+                put(LogUtils.Sessions.ICA_CONFERENCE, SessionTiming.ICA_CONFERENCE);
+                put(LogUtils.Sessions.CSW_HANDLE_CREATE_CONNECTION_COMPLETE,
                         SessionTiming.CSW_HANDLE_CREATE_CONNECTION_COMPLETE);
-                put(Log.Sessions.CSW_SET_ACTIVE, SessionTiming.CSW_SET_ACTIVE);
-                put(Log.Sessions.CSW_SET_RINGING, SessionTiming.CSW_SET_RINGING);
-                put(Log.Sessions.CSW_SET_DIALING, SessionTiming.CSW_SET_DIALING);
-                put(Log.Sessions.CSW_SET_DISCONNECTED, SessionTiming.CSW_SET_DISCONNECTED);
-                put(Log.Sessions.CSW_SET_ON_HOLD, SessionTiming.CSW_SET_ON_HOLD);
-                put(Log.Sessions.CSW_REMOVE_CALL, SessionTiming.CSW_REMOVE_CALL);
-                put(Log.Sessions.CSW_SET_IS_CONFERENCED, SessionTiming.CSW_SET_IS_CONFERENCED);
-                put(Log.Sessions.CSW_ADD_CONFERENCE_CALL, SessionTiming.CSW_ADD_CONFERENCE_CALL);
+                put(LogUtils.Sessions.CSW_SET_ACTIVE, SessionTiming.CSW_SET_ACTIVE);
+                put(LogUtils.Sessions.CSW_SET_RINGING, SessionTiming.CSW_SET_RINGING);
+                put(LogUtils.Sessions.CSW_SET_DIALING, SessionTiming.CSW_SET_DIALING);
+                put(LogUtils.Sessions.CSW_SET_DISCONNECTED, SessionTiming.CSW_SET_DISCONNECTED);
+                put(LogUtils.Sessions.CSW_SET_ON_HOLD, SessionTiming.CSW_SET_ON_HOLD);
+                put(LogUtils.Sessions.CSW_REMOVE_CALL, SessionTiming.CSW_REMOVE_CALL);
+                put(LogUtils.Sessions.CSW_SET_IS_CONFERENCED, SessionTiming.CSW_SET_IS_CONFERENCED);
+                put(LogUtils.Sessions.CSW_ADD_CONFERENCE_CALL, SessionTiming.CSW_ADD_CONFERENCE_CALL);
 
             }};
 
     public static final Map<String, Integer> sLogEventTimingToAnalyticsEventTiming =
             new HashMap<String, Integer>() {{
-                put(Log.Events.Timings.ACCEPT_TIMING,
+                put(LogUtils.Events.Timings.ACCEPT_TIMING,
                         ParcelableCallAnalytics.EventTiming.ACCEPT_TIMING);
-                put(Log.Events.Timings.REJECT_TIMING,
+                put(LogUtils.Events.Timings.REJECT_TIMING,
                         ParcelableCallAnalytics.EventTiming.REJECT_TIMING);
-                put(Log.Events.Timings.DISCONNECT_TIMING,
+                put(LogUtils.Events.Timings.DISCONNECT_TIMING,
                         ParcelableCallAnalytics.EventTiming.DISCONNECT_TIMING);
-                put(Log.Events.Timings.HOLD_TIMING,
+                put(LogUtils.Events.Timings.HOLD_TIMING,
                         ParcelableCallAnalytics.EventTiming.HOLD_TIMING);
-                put(Log.Events.Timings.UNHOLD_TIMING,
+                put(LogUtils.Events.Timings.UNHOLD_TIMING,
                         ParcelableCallAnalytics.EventTiming.UNHOLD_TIMING);
-                put(Log.Events.Timings.OUTGOING_TIME_TO_DIALING_TIMING,
+                put(LogUtils.Events.Timings.OUTGOING_TIME_TO_DIALING_TIMING,
                         ParcelableCallAnalytics.EventTiming.OUTGOING_TIME_TO_DIALING_TIMING);
-                put(Log.Events.Timings.BIND_CS_TIMING,
+                put(LogUtils.Events.Timings.BIND_CS_TIMING,
                         ParcelableCallAnalytics.EventTiming.BIND_CS_TIMING);
-                put(Log.Events.Timings.SCREENING_COMPLETED_TIMING,
+                put(LogUtils.Events.Timings.SCREENING_COMPLETED_TIMING,
                         ParcelableCallAnalytics.EventTiming.SCREENING_COMPLETED_TIMING);
-                put(Log.Events.Timings.DIRECT_TO_VM_FINISHED_TIMING,
+                put(LogUtils.Events.Timings.DIRECT_TO_VM_FINISHED_TIMING,
                         ParcelableCallAnalytics.EventTiming.DIRECT_TO_VM_FINISHED_TIMING);
-                put(Log.Events.Timings.BLOCK_CHECK_FINISHED_TIMING,
+                put(LogUtils.Events.Timings.BLOCK_CHECK_FINISHED_TIMING,
                         ParcelableCallAnalytics.EventTiming.BLOCK_CHECK_FINISHED_TIMING);
-                put(Log.Events.Timings.FILTERING_COMPLETED_TIMING,
+                put(LogUtils.Events.Timings.FILTERING_COMPLETED_TIMING,
                         ParcelableCallAnalytics.EventTiming.FILTERING_COMPLETED_TIMING);
-                put(Log.Events.Timings.FILTERING_TIMED_OUT_TIMING,
+                put(LogUtils.Events.Timings.FILTERING_TIMED_OUT_TIMING,
                         ParcelableCallAnalytics.EventTiming.FILTERING_TIMED_OUT_TIMING);
             }};
 
@@ -170,7 +172,7 @@
         public void setCallConnectionService(String connectionServiceName) {
         }
 
-        public void setCallEvents(Log.CallEventRecord records) {
+        public void setCallEvents(EventManager.EventRecord records) {
         }
 
         public void setCallIsVideo(boolean isVideo) {
@@ -211,7 +213,7 @@
         public String connectionService;
         public boolean isEmergency = false;
 
-        public Log.CallEventRecord callEvents;
+        public EventManager.EventRecord callEvents;
 
         public boolean isVideo = false;
         public List<TelecomLogClass.VideoEvent> videoEvents;
@@ -310,7 +312,7 @@
         }
 
         @Override
-        public void setCallEvents(Log.CallEventRecord records) {
+        public void setCallEvents(EventManager.EventRecord records) {
             this.callEvents = records;
         }
 
@@ -647,10 +649,10 @@
     }
 
     private static TelecomLogClass.Event[] convertLogEventsToProtoEvents(
-            List<Log.CallEvent> logEvents) {
+            List<EventManager.Event> logEvents) {
         long timeOfLastEvent = -1;
         ArrayList<TelecomLogClass.Event> events = new ArrayList<>(logEvents.size());
-        for (Log.CallEvent logEvent : logEvents) {
+        for (EventManager.Event logEvent : logEvents) {
             if (sLogEventToAnalyticsEvent.containsKey(logEvent.eventId)) {
                 TelecomLogClass.Event event = new TelecomLogClass.Event();
                 event.setEventName(sLogEventToAnalyticsEvent.get(logEvent.eventId));
@@ -664,7 +666,7 @@
     }
 
     private static TelecomLogClass.EventTimingEntry logEventTimingToProtoEventTiming(
-            Log.CallEventRecord.EventTiming logEventTiming) {
+            EventManager.EventRecord.EventTiming logEventTiming) {
         int analyticsEventTimingName =
                 sLogEventTimingToAnalyticsEventTiming.containsKey(logEventTiming.name) ?
                         sLogEventTimingToAnalyticsEventTiming.get(logEventTiming.name) :
diff --git a/src/com/android/server/telecom/AsyncRingtonePlayer.java b/src/com/android/server/telecom/AsyncRingtonePlayer.java
index d2a7614..7ed1c85 100644
--- a/src/com/android/server/telecom/AsyncRingtonePlayer.java
+++ b/src/com/android/server/telecom/AsyncRingtonePlayer.java
@@ -21,6 +21,7 @@
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Message;
+import android.telecom.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.os.SomeArgs;
@@ -137,8 +138,8 @@
                 Uri ringtoneUri = incomingCall.getRingtone();
                 String ringtoneUriString = (ringtoneUri == null) ? "null" :
                         ringtoneUri.toSafeString();
-                Log.event(null, Log.Events.ERROR_LOG, "Failed to get ringtone from factory. " +
-                        "Skipping ringing. Uri was: " + ringtoneUriString);
+                Log.addEvent(null, LogUtils.Events.ERROR_LOG, "Failed to get ringtone from " +
+                        "factory. Skipping ringing. Uri was: " + ringtoneUriString);
                 return;
             }
         }
diff --git a/src/com/android/server/telecom/BluetoothManager.java b/src/com/android/server/telecom/BluetoothManager.java
index d31c69d..d043cc5 100644
--- a/src/com/android/server/telecom/BluetoothManager.java
+++ b/src/com/android/server/telecom/BluetoothManager.java
@@ -26,6 +26,8 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.SystemClock;
+import android.telecom.Log;
+import android.telecom.Logging.Runnable;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IndentingPrintWriter;
diff --git a/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java b/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java
index 400ae66..0ad5d4c 100644
--- a/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java
+++ b/src/com/android/server/telecom/BluetoothPhoneServiceImpl.java
@@ -29,6 +29,7 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.telecom.Connection;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telecom.VideoProfile;
 import android.telephony.PhoneNumberUtils;
@@ -497,6 +498,8 @@
                 return true;
             }
         } else if (chld == CHLD_TYPE_RELEASEACTIVE_ACCEPTHELD) {
+            if (activeCall == null && ringingCall == null && heldCall == null)
+                return false;
             if (activeCall != null) {
                 mCallsManager.disconnectCall(activeCall);
                 if (ringingCall != null) {
@@ -506,6 +509,12 @@
                 }
                 return true;
             }
+            if (ringingCall != null) {
+                mCallsManager.answerCall(ringingCall, ringingCall.getVideoState());
+            } else if (heldCall != null) {
+                mCallsManager.unholdCall(heldCall);
+            }
+            return true;
         } else if (chld == CHLD_TYPE_HOLDACTIVE_ACCEPTHELD) {
             if (activeCall != null && activeCall.can(Connection.CAPABILITY_SWAP_CONFERENCE)) {
                 activeCall.swapConference();
diff --git a/src/com/android/server/telecom/Call.java b/src/com/android/server/telecom/Call.java
index 18c9c05..61dd99c 100644
--- a/src/com/android/server/telecom/Call.java
+++ b/src/com/android/server/telecom/Call.java
@@ -31,6 +31,8 @@
 import android.telecom.DisconnectCause;
 import android.telecom.Connection;
 import android.telecom.GatewayInfo;
+import android.telecom.Log;
+import android.telecom.Logging.EventManager;
 import android.telecom.ParcelableConnection;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
@@ -49,8 +51,10 @@
 import com.android.internal.util.Preconditions;
 
 import java.lang.String;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
@@ -64,7 +68,7 @@
  *  connected etc).
  */
 @VisibleForTesting
-public class Call implements CreateConnectionResponse {
+public class Call implements CreateConnectionResponse, EventManager.Loggable {
     public final static String CALL_ID_UNKNOWN = "-1";
     public final static long DATA_USAGE_NOT_SET = -1;
 
@@ -370,7 +374,6 @@
     // Set to true once the NewOutgoingCallIntentBroadcast comes back and is processed.
     private boolean mIsNewOutgoingCallIntentBroadcastDone = false;
 
-
     /**
      * Indicates whether the call is remotely held.  A call is considered remotely held when
      * {@link #onConnectionEvent(String)} receives the {@link Connection#EVENT_ON_HOLD_TONE_START}
@@ -379,6 +382,12 @@
     private boolean mIsRemotelyHeld = false;
 
     /**
+     * Indicates whether the {@link PhoneAccount} associated with this call is self-managed.
+     * See {@link PhoneAccount#CAPABILITY_SELF_MANAGED} for more information.
+     */
+    private boolean mIsSelfManaged = false;
+
+    /**
      * Indicates whether the {@link PhoneAccount} associated with this call supports video calling.
      * {@code True} if the phone account supports video calling, {@code false} otherwise.
      */
@@ -450,7 +459,6 @@
                 || callDirection == CALL_DIRECTION_INCOMING;
         maybeLoadCannedSmsResponses();
         mAnalytics = new Analytics.CallInfo();
-
     }
 
     /**
@@ -522,7 +530,7 @@
                 analyticsDirection = Analytics.UNKNOWN_DIRECTION;
         }
         mAnalytics = Analytics.initiateCallAnalytics(mId, analyticsDirection);
-        Log.event(this, Log.Events.CREATED);
+        Log.addEvent(this, LogUtils.Events.CREATED);
     }
 
     public Analytics.CallInfo getAnalytics() {
@@ -530,7 +538,7 @@
     }
 
     public void destroy() {
-        Log.event(this, Log.Events.DESTROYED);
+        Log.addEvent(this, LogUtils.Events.DESTROYED);
     }
 
     /** {@inheritDoc} */
@@ -553,6 +561,20 @@
                 Connection.propertiesToString(getConnectionProperties()));
     }
 
+    @Override
+    public String getDescription() {
+        StringBuilder s = new StringBuilder("Call ");
+        s.append(getId());
+        s.append(" [");
+        s.append(SimpleDateFormat.getDateTimeInstance().format(new Date(getCreationTimeMillis())));
+        s.append("]");
+        s.append(isIncoming() ? "(MT - incoming)" : "(MO - outgoing)");
+        s.append("\n\tTo address: ");
+        s.append(Log.piiHandle(getHandle()));
+        s.append("\n");
+        return s.toString();
+    }
+
     /**
      * Builds a debug-friendly description string for a video state.
      * <p>
@@ -689,32 +711,32 @@
             Object data = null;
             switch (newState) {
                 case CallState.ACTIVE:
-                    event = Log.Events.SET_ACTIVE;
+                    event = LogUtils.Events.SET_ACTIVE;
                     break;
                 case CallState.CONNECTING:
-                    event = Log.Events.SET_CONNECTING;
+                    event = LogUtils.Events.SET_CONNECTING;
                     break;
                 case CallState.DIALING:
-                    event = Log.Events.SET_DIALING;
+                    event = LogUtils.Events.SET_DIALING;
                     break;
                 case CallState.PULLING:
-                    event = Log.Events.SET_PULLING;
+                    event = LogUtils.Events.SET_PULLING;
                     break;
                 case CallState.DISCONNECTED:
-                    event = Log.Events.SET_DISCONNECTED;
+                    event = LogUtils.Events.SET_DISCONNECTED;
                     data = getDisconnectCause();
                     break;
                 case CallState.DISCONNECTING:
-                    event = Log.Events.SET_DISCONNECTING;
+                    event = LogUtils.Events.SET_DISCONNECTING;
                     break;
                 case CallState.ON_HOLD:
-                    event = Log.Events.SET_HOLD;
+                    event = LogUtils.Events.SET_HOLD;
                     break;
                 case CallState.SELECT_PHONE_ACCOUNT:
-                    event = Log.Events.SET_SELECT_PHONE_ACCOUNT;
+                    event = LogUtils.Events.SET_SELECT_PHONE_ACCOUNT;
                     break;
                 case CallState.RINGING:
-                    event = Log.Events.SET_RINGING;
+                    event = LogUtils.Events.SET_RINGING;
                     break;
             }
             if (event != null) {
@@ -724,7 +746,7 @@
                     // If data exists, add it to tag.  If no tag, just use data.toString().
                     stringData = stringData == null ? data.toString() : stringData + "> " + data;
                 }
-                Log.event(this, event, stringData);
+                Log.addEvent(this, event, stringData);
             }
         }
     }
@@ -929,6 +951,17 @@
         return mIsVideoCallingSupported;
     }
 
+    public boolean isSelfManaged() {
+        return mIsSelfManaged;
+    }
+
+    public void setIsSelfManaged(boolean isSelfManaged) {
+        mIsSelfManaged = isSelfManaged;
+
+        // Connection properties will add/remove the PROPERTY_SELF_MANAGED.
+        setConnectionProperties(getConnectionProperties());
+    }
+
     private void configureIsWorkCall() {
         PhoneAccountRegistrar phoneAccountRegistrar = mCallsManager.getPhoneAccountRegistrar();
         boolean isWorkCall = false;
@@ -1035,7 +1068,7 @@
             }
 
             int xorCaps = previousCapabilities ^ mConnectionCapabilities;
-            Log.event(this, Log.Events.CAPABILITY_CHANGE,
+            Log.addEvent(this, LogUtils.Events.CAPABILITY_CHANGE,
                     "Current: [%s], Removed [%s], Added [%s]",
                     Connection.capabilitiesToStringShort(mConnectionCapabilities),
                     Connection.capabilitiesToStringShort(previousCapabilities & xorCaps),
@@ -1046,6 +1079,14 @@
     void setConnectionProperties(int connectionProperties) {
         Log.v(this, "setConnectionProperties: %s", Connection.propertiesToString(
                 connectionProperties));
+
+        // Ensure the ConnectionService can't change the state of the self-managed property.
+        if (isSelfManaged()) {
+            connectionProperties |= Connection.PROPERTY_SELF_MANAGED;
+        } else {
+            connectionProperties &= ~Connection.PROPERTY_SELF_MANAGED;
+        }
+
         if (mConnectionProperties != connectionProperties) {
             int previousProperties = mConnectionProperties;
             mConnectionProperties = connectionProperties;
@@ -1060,7 +1101,7 @@
             if (wasExternal != isExternal) {
                 Log.v(this, "setConnectionProperties: external call changed isExternal = %b",
                         isExternal);
-                Log.event(this, Log.Events.IS_EXTERNAL, isExternal);
+                Log.addEvent(this, LogUtils.Events.IS_EXTERNAL, isExternal);
                 for (Listener l : mListeners) {
                     l.onExternalCallChanged(this, isExternal);
                 }
@@ -1070,7 +1111,7 @@
             mAnalytics.addCallProperties(mConnectionProperties);
 
             int xorProps = previousProperties ^ mConnectionProperties;
-            Log.event(this, Log.Events.PROPERTY_CHANGE,
+            Log.addEvent(this, LogUtils.Events.PROPERTY_CHANGE,
                     "Current: [%s], Removed [%s], Added [%s]",
                     Connection.propertiesToStringShort(mConnectionProperties),
                     Connection.propertiesToStringShort(previousProperties & xorProps),
@@ -1282,7 +1323,7 @@
         } else {
             Log.i(this, "Send playDtmfTone to connection service for call %s", this);
             mConnectionService.playDtmfTone(this, digit);
-            Log.event(this, Log.Events.START_DTMF, Log.pii(digit));
+            Log.addEvent(this, LogUtils.Events.START_DTMF, Log.pii(digit));
         }
     }
 
@@ -1294,7 +1335,7 @@
             Log.w(this, "stopDtmfTone() request on a call without a connection service.");
         } else {
             Log.i(this, "Send stopDtmfTone to connection service for call %s", this);
-            Log.event(this, Log.Events.STOP_DTMF);
+            Log.addEvent(this, LogUtils.Events.STOP_DTMF);
             mConnectionService.stopDtmfTone(this);
         }
     }
@@ -1307,7 +1348,7 @@
             Log.w(this, "silence() request on a call without a connection service.");
         } else {
             Log.i(this, "Send silence to connection service for call %s", this);
-            Log.event(this, Log.Events.SILENCE);
+            Log.addEvent(this, LogUtils.Events.SILENCE);
             mConnectionService.silence(this);
         }
     }
@@ -1322,7 +1363,7 @@
      */
     @VisibleForTesting
     public void disconnect(boolean wasViaNewOutgoingCallBroadcaster) {
-        Log.event(this, Log.Events.REQUEST_DISCONNECT);
+        Log.addEvent(this, LogUtils.Events.REQUEST_DISCONNECT);
 
         // Track that the call is now locally disconnecting.
         setLocallyDisconnecting(true);
@@ -1402,7 +1443,7 @@
                 Log.e(this, new NullPointerException(),
                         "answer call failed due to null CS callId=%s", getId());
             }
-            Log.event(this, Log.Events.REQUEST_ACCEPT);
+            Log.addEvent(this, LogUtils.Events.REQUEST_ACCEPT);
         }
     }
 
@@ -1426,8 +1467,7 @@
                 Log.e(this, new NullPointerException(),
                         "reject call failed due to null CS callId=%s", getId());
             }
-            Log.event(this, Log.Events.REQUEST_REJECT);
-
+            Log.addEvent(this, LogUtils.Events.REQUEST_REJECT);
         }
     }
 
@@ -1442,7 +1482,7 @@
                 Log.e(this, new NullPointerException(),
                         "hold call failed due to null CS callId=%s", getId());
             }
-            Log.event(this, Log.Events.REQUEST_HOLD);
+            Log.addEvent(this, LogUtils.Events.REQUEST_HOLD);
         }
     }
 
@@ -1457,7 +1497,7 @@
                 Log.e(this, new NullPointerException(),
                         "unhold call failed due to null CS callId=%s", getId());
             }
-            Log.event(this, Log.Events.REQUEST_UNHOLD);
+            Log.addEvent(this, LogUtils.Events.REQUEST_UNHOLD);
         }
     }
 
@@ -1603,7 +1643,7 @@
         if (mConnectionService == null) {
             Log.w(this, "conference requested on a call without a connection service.");
         } else {
-            Log.event(this, Log.Events.CONFERENCE_WITH, otherCall);
+            Log.addEvent(this, LogUtils.Events.CONFERENCE_WITH, otherCall);
             mConnectionService.conference(this, otherCall);
         }
     }
@@ -1612,7 +1652,7 @@
         if (mConnectionService == null) {
             Log.w(this, "splitting from conference call without a connection service");
         } else {
-            Log.event(this, Log.Events.SPLIT_FROM_CONFERENCE);
+            Log.addEvent(this, LogUtils.Events.SPLIT_FROM_CONFERENCE);
             mConnectionService.splitFromConference(this);
         }
     }
@@ -1622,7 +1662,7 @@
         if (mConnectionService == null) {
             Log.w(this, "merging conference calls without a connection service.");
         } else if (can(Connection.CAPABILITY_MERGE_CONFERENCE)) {
-            Log.event(this, Log.Events.CONFERENCE_WITH);
+            Log.addEvent(this, LogUtils.Events.CONFERENCE_WITH);
             mConnectionService.mergeConference(this);
             mWasConferencePreviouslyMerged = true;
         }
@@ -1633,7 +1673,7 @@
         if (mConnectionService == null) {
             Log.w(this, "swapping conference calls without a connection service.");
         } else if (can(Connection.CAPABILITY_SWAP_CONFERENCE)) {
-            Log.event(this, Log.Events.SWAP);
+            Log.addEvent(this, LogUtils.Events.SWAP);
             mConnectionService.swapConference(this);
             switch (mChildCalls.size()) {
                 case 1:
@@ -1685,7 +1725,7 @@
             return;
         }
 
-        Log.event(this, Log.Events.REQUEST_PULL);
+        Log.addEvent(this, LogUtils.Events.REQUEST_PULL);
         mConnectionService.pullExternalCall(this);
     }
 
@@ -1726,7 +1766,7 @@
             mParentCall.addChildCall(this);
         }
 
-        Log.event(this, Log.Events.SET_PARENT, mParentCall);
+        Log.addEvent(this, LogUtils.Events.SET_PARENT, mParentCall);
         for (Listener l : mListeners) {
             l.onParentChanged(this);
         }
@@ -1763,7 +1803,7 @@
             mConferenceLevelActiveCall = call;
             mChildCalls.add(call);
 
-            Log.event(this, Log.Events.ADD_CHILD, call);
+            Log.addEvent(this, LogUtils.Events.ADD_CHILD, call);
 
             for (Listener l : mListeners) {
                 l.onChildrenChanged(this);
@@ -1773,7 +1813,7 @@
 
     private void removeChildCall(Call call) {
         if (mChildCalls.remove(call)) {
-            Log.event(this, Log.Events.REMOVE_CHILD, call);
+            Log.addEvent(this, LogUtils.Events.REMOVE_CHILD, call);
             for (Listener l : mListeners) {
                 l.onChildrenChanged(this);
             }
@@ -2047,7 +2087,7 @@
         int previousVideoState = mVideoState;
         mVideoState = videoState;
         if (mVideoState != previousVideoState) {
-            Log.event(this, Log.Events.VIDEO_STATE_CHANGED,
+            Log.addEvent(this, LogUtils.Events.VIDEO_STATE_CHANGED,
                     VideoProfile.videoStateToString(videoState));
             for (Listener l : mListeners) {
                 l.onVideoStateChanged(this, previousVideoState, mVideoState);
@@ -2205,10 +2245,10 @@
      * @param extras The extras.
      */
     public void onConnectionEvent(String event, Bundle extras) {
-        Log.event(this, Log.Events.CONNECTION_EVENT, event);
+        Log.addEvent(this, LogUtils.Events.CONNECTION_EVENT, event);
         if (Connection.EVENT_ON_HOLD_TONE_START.equals(event)) {
             mIsRemotelyHeld = true;
-            Log.event(this, Log.Events.REMOTELY_HELD);
+            Log.addEvent(this, LogUtils.Events.REMOTELY_HELD);
             // Inform listeners of the fact that a call hold tone was received.  This will trigger
             // the CallAudioManager to play a tone via the InCallTonePlayer.
             for (Listener l : mListeners) {
@@ -2216,7 +2256,7 @@
             }
         } else if (Connection.EVENT_ON_HOLD_TONE_END.equals(event)) {
             mIsRemotelyHeld = false;
-            Log.event(this, Log.Events.REMOTELY_UNHELD);
+            Log.addEvent(this, LogUtils.Events.REMOTELY_UNHELD);
             for (Listener l : mListeners) {
                 l.onHoldToneRequested(this);
             }
diff --git a/src/com/android/server/telecom/CallAudioManager.java b/src/com/android/server/telecom/CallAudioManager.java
index d7336cd..49f7701 100644
--- a/src/com/android/server/telecom/CallAudioManager.java
+++ b/src/com/android/server/telecom/CallAudioManager.java
@@ -20,6 +20,7 @@
 import android.media.IAudioService;
 import android.media.ToneGenerator;
 import android.telecom.CallAudioState;
+import android.telecom.Log;
 import android.telecom.VideoProfile;
 import android.util.SparseArray;
 
@@ -417,12 +418,8 @@
             call.silence();
         }
 
-        mRingingCalls.clear();
         mRinger.stopRinging();
         mRinger.stopCallWaiting();
-        mCallAudioModeStateMachine.sendMessageWithArgs(
-                CallAudioModeStateMachine.NO_MORE_RINGING_CALLS,
-                makeArgsForModeStateMachine());
     }
 
     @VisibleForTesting
diff --git a/src/com/android/server/telecom/CallAudioModeStateMachine.java b/src/com/android/server/telecom/CallAudioModeStateMachine.java
index 57043bc..7121a53 100644
--- a/src/com/android/server/telecom/CallAudioModeStateMachine.java
+++ b/src/com/android/server/telecom/CallAudioModeStateMachine.java
@@ -18,6 +18,9 @@
 
 import android.media.AudioManager;
 import android.os.Message;
+import android.telecom.Log;
+import android.telecom.Logging.Runnable;
+import android.telecom.Logging.Session;
 import android.util.SparseArray;
 
 import com.android.internal.util.IState;
@@ -528,4 +531,4 @@
             return mUnfocusedState;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/server/telecom/CallAudioRoutePeripheralAdapter.java b/src/com/android/server/telecom/CallAudioRoutePeripheralAdapter.java
index 9b62443..96646b2 100644
--- a/src/com/android/server/telecom/CallAudioRoutePeripheralAdapter.java
+++ b/src/com/android/server/telecom/CallAudioRoutePeripheralAdapter.java
@@ -16,66 +16,68 @@
 
 package com.android.server.telecom;
 
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
+
 /**
  * A class that acts as a listener to things that could change call audio routing, namely
  * bluetooth status, wired headset status, and dock status.
  */
 public class CallAudioRoutePeripheralAdapter implements WiredHeadsetManager.Listener,
-        DockManager.Listener, BluetoothManager.BluetoothStateListener {
+        DockManager.Listener, BluetoothRouteManager.BluetoothStateListener {
 
     private final CallAudioRouteStateMachine mCallAudioRouteStateMachine;
-    private final BluetoothManager mBluetoothManager;
+    private final BluetoothRouteManager mBluetoothRouteManager;
 
     public CallAudioRoutePeripheralAdapter(
             CallAudioRouteStateMachine callAudioRouteStateMachine,
-            BluetoothManager bluetoothManager,
+            BluetoothRouteManager bluetoothManager,
             WiredHeadsetManager wiredHeadsetManager,
             DockManager dockManager) {
         mCallAudioRouteStateMachine = callAudioRouteStateMachine;
-        mBluetoothManager = bluetoothManager;
+        mBluetoothRouteManager = bluetoothManager;
 
-        mBluetoothManager.setBluetoothStateListener(this);
+        mBluetoothRouteManager.setListener(this);
         wiredHeadsetManager.addListener(this);
         dockManager.addListener(this);
     }
 
     public boolean isBluetoothAudioOn() {
-        return mBluetoothManager.isBluetoothAudioConnected();
+        return mBluetoothRouteManager.isBluetoothAudioConnectedOrPending();
     }
 
     @Override
     public void onBluetoothStateChange(int oldState, int newState) {
         switch (oldState) {
-            case BluetoothManager.BLUETOOTH_DISCONNECTED:
-            case BluetoothManager.BLUETOOTH_UNINITIALIZED:
+            case BluetoothRouteManager.BLUETOOTH_DISCONNECTED:
+            case BluetoothRouteManager.BLUETOOTH_UNINITIALIZED:
                 switch (newState) {
-                    case BluetoothManager.BLUETOOTH_DEVICE_CONNECTED:
-                    case BluetoothManager.BLUETOOTH_AUDIO_CONNECTED:
+                    case BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED:
+                    case BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED:
                         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                                 CallAudioRouteStateMachine.CONNECT_BLUETOOTH);
                         break;
                 }
                 break;
-            case BluetoothManager.BLUETOOTH_DEVICE_CONNECTED:
+            case BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED:
                 switch (newState) {
-                    case BluetoothManager.BLUETOOTH_DISCONNECTED:
+                    case BluetoothRouteManager.BLUETOOTH_DISCONNECTED:
                         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                                 CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH);
                         break;
-                    case BluetoothManager.BLUETOOTH_AUDIO_CONNECTED:
+                    case BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED:
                         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                                 CallAudioRouteStateMachine.SWITCH_BLUETOOTH);
                         break;
                 }
                 break;
-            case BluetoothManager.BLUETOOTH_AUDIO_CONNECTED:
-            case BluetoothManager.BLUETOOTH_AUDIO_PENDING:
+            case BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED:
+            case BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING:
                 switch (newState) {
-                    case BluetoothManager.BLUETOOTH_DISCONNECTED:
+                    case BluetoothRouteManager.BLUETOOTH_DISCONNECTED:
                         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                                 CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH);
                         break;
-                    case BluetoothManager.BLUETOOTH_DEVICE_CONNECTED:
+                    case BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED:
                         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
                                 CallAudioRouteStateMachine.BT_AUDIO_DISCONNECT);
                         break;
diff --git a/src/com/android/server/telecom/CallAudioRouteStateMachine.java b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
index f88475a..10906b1 100644
--- a/src/com/android/server/telecom/CallAudioRouteStateMachine.java
+++ b/src/com/android/server/telecom/CallAudioRouteStateMachine.java
@@ -32,11 +32,14 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.telecom.CallAudioState;
+import android.telecom.Log;
+import android.telecom.Logging.Session;
 import android.util.SparseArray;
 
 import com.android.internal.util.IState;
 import com.android.internal.util.State;
 import com.android.internal.util.StateMachine;
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
 
 import java.util.HashMap;
 
@@ -116,10 +119,10 @@
     public static final int RINGING_FOCUS = 3;
 
     private static final SparseArray<String> AUDIO_ROUTE_TO_LOG_EVENT = new SparseArray<String>() {{
-        put(CallAudioState.ROUTE_BLUETOOTH, Log.Events.AUDIO_ROUTE_BT);
-        put(CallAudioState.ROUTE_EARPIECE, Log.Events.AUDIO_ROUTE_EARPIECE);
-        put(CallAudioState.ROUTE_SPEAKER, Log.Events.AUDIO_ROUTE_SPEAKER);
-        put(CallAudioState.ROUTE_WIRED_HEADSET, Log.Events.AUDIO_ROUTE_HEADSET);
+        put(CallAudioState.ROUTE_BLUETOOTH, LogUtils.Events.AUDIO_ROUTE_BT);
+        put(CallAudioState.ROUTE_EARPIECE, LogUtils.Events.AUDIO_ROUTE_EARPIECE);
+        put(CallAudioState.ROUTE_SPEAKER, LogUtils.Events.AUDIO_ROUTE_SPEAKER);
+        put(CallAudioState.ROUTE_WIRED_HEADSET, LogUtils.Events.AUDIO_ROUTE_HEADSET);
     }};
 
     private static final SparseArray<String> MESSAGE_CODE_TO_NAME = new SparseArray<String>() {{
@@ -227,13 +230,13 @@
         @Override
         public void enter() {
             super.enter();
-            Log.event(mCallsManager.getForegroundCall(), Log.Events.AUDIO_ROUTE,
+            Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE,
                     "Entering state " + getName());
         }
 
         @Override
         public void exit() {
-            Log.event(mCallsManager.getForegroundCall(), Log.Events.AUDIO_ROUTE,
+            Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE,
                     "Leaving state " + getName());
             super.exit();
         }
@@ -245,18 +248,18 @@
 
             switch (msg.what) {
                 case CONNECT_WIRED_HEADSET:
-                    Log.event(mCallsManager.getForegroundCall(), Log.Events.AUDIO_ROUTE,
+                    Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE,
                             "Wired headset connected");
                     removedRoutes |= ROUTE_EARPIECE;
                     addedRoutes |= ROUTE_WIRED_HEADSET;
                     break;
                 case CONNECT_BLUETOOTH:
-                    Log.event(mCallsManager.getForegroundCall(), Log.Events.AUDIO_ROUTE,
+                    Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE,
                             "Bluetooth connected");
                     addedRoutes |= ROUTE_BLUETOOTH;
                     break;
                 case DISCONNECT_WIRED_HEADSET:
-                    Log.event(mCallsManager.getForegroundCall(), Log.Events.AUDIO_ROUTE,
+                    Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE,
                             "Wired headset disconnected");
                     removedRoutes |= ROUTE_WIRED_HEADSET;
                     if (mDoesDeviceSupportEarpieceRoute) {
@@ -264,7 +267,7 @@
                     }
                     break;
                 case DISCONNECT_BLUETOOTH:
-                    Log.event(mCallsManager.getForegroundCall(), Log.Events.AUDIO_ROUTE,
+                    Log.addEvent(mCallsManager.getForegroundCall(), LogUtils.Events.AUDIO_ROUTE,
                             "Bluetooth disconnected");
                     removedRoutes |= ROUTE_BLUETOOTH;
                     break;
@@ -845,6 +848,7 @@
             super.enter();
             mHasUserExplicitlyLeftBluetooth = false;
             updateInternalCallAudioState();
+            setBluetoothOn(false);
         }
 
         @Override
@@ -1151,7 +1155,7 @@
     private final Context mContext;
     private final CallsManager mCallsManager;
     private final AudioManager mAudioManager;
-    private final BluetoothManager mBluetoothManager;
+    private final BluetoothRouteManager mBluetoothRouteManager;
     private final WiredHeadsetManager mWiredHeadsetManager;
     private final StatusBarNotifier mStatusBarNotifier;
     private final CallAudioManager.AudioServiceFactory mAudioServiceFactory;
@@ -1171,7 +1175,7 @@
     public CallAudioRouteStateMachine(
             Context context,
             CallsManager callsManager,
-            BluetoothManager bluetoothManager,
+            BluetoothRouteManager bluetoothManager,
             WiredHeadsetManager wiredHeadsetManager,
             StatusBarNotifier statusBarNotifier,
             CallAudioManager.AudioServiceFactory audioServiceFactory,
@@ -1191,7 +1195,7 @@
         mContext = context;
         mCallsManager = callsManager;
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
-        mBluetoothManager = bluetoothManager;
+        mBluetoothRouteManager = bluetoothManager;
         mWiredHeadsetManager = wiredHeadsetManager;
         mStatusBarNotifier = statusBarNotifier;
         mAudioServiceFactory = audioServiceFactory;
@@ -1306,7 +1310,7 @@
                 return;
             default:
                 Log.e(this, new IllegalStateException(),
-                        "Unexpected message code");
+                        "Unexpected message code %d", msg.what);
         }
     }
 
@@ -1366,14 +1370,13 @@
     }
 
     private void setBluetoothOn(boolean on) {
-        if (mBluetoothManager.isBluetoothAvailable()) {
-            boolean isAlreadyOn = mBluetoothManager.isBluetoothAudioConnectedOrPending();
-            if (on != isAlreadyOn) {
+        if (mBluetoothRouteManager.isBluetoothAvailable()) {
+            if (on != mBluetoothRouteManager.isBluetoothAudioConnectedOrPending()) {
                 Log.i(this, "connecting bluetooth %s", on);
                 if (on) {
-                    mBluetoothManager.connectBluetoothAudio();
+                    mBluetoothRouteManager.connectBluetoothAudio(null /*TODO: add real address*/);
                 } else {
-                    mBluetoothManager.disconnectBluetoothAudio();
+                    mBluetoothRouteManager.disconnectBluetoothAudio();
                 }
             }
         }
@@ -1381,8 +1384,8 @@
 
     private void setMuteOn(boolean mute) {
         mIsMuted = mute;
-        Log.event(mCallsManager.getForegroundCall(), mute ? Log.Events.MUTE : Log.Events.UNMUTE);
-
+        Log.addEvent(mCallsManager.getForegroundCall(), mute ?
+                LogUtils.Events.MUTE : LogUtils.Events.UNMUTE);
         if (mute != mAudioManager.isMicrophoneMute() && isInActiveState()) {
             IAudioService audio = mAudioServiceFactory.getAudioService();
             Log.i(this, "changing microphone mute state to: %b [serviceIsNull=%b]",
@@ -1438,9 +1441,9 @@
                     newCallAudioState);
             if (force || !newCallAudioState.equals(mLastKnownCallAudioState)) {
                 if (newCallAudioState.getRoute() != mLastKnownCallAudioState.getRoute()) {
-                    Log.event(mCallsManager.getForegroundCall(),
+                    Log.addEvent(mCallsManager.getForegroundCall(),
                             AUDIO_ROUTE_TO_LOG_EVENT.get(newCallAudioState.getRoute(),
-                                    Log.Events.AUDIO_ROUTE));
+                                    LogUtils.Events.AUDIO_ROUTE));
                 }
 
                 mCallsManager.onCallAudioStateChanged(mLastKnownCallAudioState, newCallAudioState);
@@ -1466,7 +1469,7 @@
             routeMask |= CallAudioState.ROUTE_EARPIECE;
         }
 
-        if (mBluetoothManager.isBluetoothAvailable()) {
+        if (mBluetoothRouteManager.isBluetoothAvailable()) {
             routeMask |=  CallAudioState.ROUTE_BLUETOOTH;
         }
 
diff --git a/src/com/android/server/telecom/CallIntentProcessor.java b/src/com/android/server/telecom/CallIntentProcessor.java
index 1219216..2126c48 100644
--- a/src/com/android/server/telecom/CallIntentProcessor.java
+++ b/src/com/android/server/telecom/CallIntentProcessor.java
@@ -11,6 +11,7 @@
 import android.os.UserManager;
 import android.telecom.Connection;
 import android.telecom.DefaultDialerManager;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
diff --git a/src/com/android/server/telecom/CallLogManager.java b/src/com/android/server/telecom/CallLogManager.java
index 80f1da2..15a4f58 100755
--- a/src/com/android/server/telecom/CallLogManager.java
+++ b/src/com/android/server/telecom/CallLogManager.java
@@ -29,6 +29,7 @@
 import android.os.PersistableBundle;
 import android.provider.CallLog.Calls;
 import android.telecom.DisconnectCause;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.VideoProfile;
@@ -172,7 +173,8 @@
                     new LogCallCompletedListener() {
                         @Override
                         public void onLogCompleted(@Nullable Uri uri) {
-                            mMissedCallNotifier.showMissedCallNotification(call);
+                            mMissedCallNotifier.showMissedCallNotification(
+                                    new MissedCallNotifier.CallInfo(call));
                         }
                     });
         } else {
@@ -261,7 +263,8 @@
         boolean okToLogEmergencyNumber = false;
         CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(
                 Context.CARRIER_CONFIG_SERVICE);
-        PersistableBundle configBundle = configManager.getConfig();
+        PersistableBundle configBundle = configManager.getConfigForSubId(
+                mPhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(accountHandle));
         if (configBundle != null) {
             okToLogEmergencyNumber = configBundle.getBoolean(
                     CarrierConfigManager.KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL);
diff --git a/src/com/android/server/telecom/CallerInfoLookupHelper.java b/src/com/android/server/telecom/CallerInfoLookupHelper.java
index 244a802..f67a7f7 100644
--- a/src/com/android/server/telecom/CallerInfoLookupHelper.java
+++ b/src/com/android/server/telecom/CallerInfoLookupHelper.java
@@ -23,6 +23,9 @@
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
+import android.telecom.Log;
+import android.telecom.Logging.Runnable;
+import android.telecom.Logging.Session;
 import android.text.TextUtils;
 
 import com.android.internal.annotations.VisibleForTesting;
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index d6462d7..e2b9c71 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -40,10 +40,12 @@
 import android.telecom.Connection;
 import android.telecom.DisconnectCause;
 import android.telecom.GatewayInfo;
+import android.telecom.Log;
 import android.telecom.ParcelableConference;
 import android.telecom.ParcelableConnection;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
+import android.telecom.Logging.Runnable;
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
 import android.telephony.PhoneNumberUtils;
@@ -55,7 +57,7 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.TelephonyProperties;
 import com.android.internal.util.IndentingPrintWriter;
-import com.android.server.telecom.TelecomServiceImpl.DefaultDialerManagerAdapter;
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
 import com.android.server.telecom.callfiltering.AsyncBlockCheckFilter;
 import com.android.server.telecom.callfiltering.BlockCheckerAdapter;
 import com.android.server.telecom.callfiltering.CallFilterResultCallback;
@@ -179,7 +181,7 @@
             new ConcurrentHashMap<CallsManagerListener, Boolean>(16, 0.9f, 1));
     private final HeadsetMediaButton mHeadsetMediaButton;
     private final WiredHeadsetManager mWiredHeadsetManager;
-    private final BluetoothManager mBluetoothManager;
+    private final BluetoothRouteManager mBluetoothRouteManager;
     private final DockManager mDockManager;
     private final TtyManager mTtyManager;
     private final ProximitySensorManager mProximitySensorManager;
@@ -192,7 +194,7 @@
     private final PhoneAccountRegistrar mPhoneAccountRegistrar;
     private final MissedCallNotifier mMissedCallNotifier;
     private final CallerInfoLookupHelper mCallerInfoLookupHelper;
-    private final DefaultDialerManagerAdapter mDefaultDialerManagerAdapter;
+    private final DefaultDialerCache mDefaultDialerCache;
     private final Timeouts.Adapter mTimeoutsAdapter;
     private final PhoneNumberUtilsAdapter mPhoneNumberUtilsAdapter;
     private final NotificationManager mNotificationManager;
@@ -221,10 +223,10 @@
             ProximitySensorManagerFactory proximitySensorManagerFactory,
             InCallWakeLockControllerFactory inCallWakeLockControllerFactory,
             CallAudioManager.AudioServiceFactory audioServiceFactory,
-            BluetoothManager bluetoothManager,
+            BluetoothRouteManager bluetoothManager,
             WiredHeadsetManager wiredHeadsetManager,
             SystemStateProvider systemStateProvider,
-            DefaultDialerManagerAdapter defaultDialerAdapter,
+            DefaultDialerCache defaultDialerCache,
             Timeouts.Adapter timeoutsAdapter,
             AsyncRingtonePlayer asyncRingtonePlayer,
             PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
@@ -238,8 +240,8 @@
         mMissedCallNotifier = missedCallNotifier;
         StatusBarNotifier statusBarNotifier = new StatusBarNotifier(context, this);
         mWiredHeadsetManager = wiredHeadsetManager;
-        mBluetoothManager = bluetoothManager;
-        mDefaultDialerManagerAdapter = defaultDialerAdapter;
+        mDefaultDialerCache = defaultDialerCache;
+        mBluetoothRouteManager = bluetoothManager;
         mDockManager = new DockManager(context);
         mTimeoutsAdapter = timeoutsAdapter;
         mCallerInfoLookupHelper = new CallerInfoLookupHelper(context, mCallerInfoAsyncQueryFactory,
@@ -274,7 +276,7 @@
         RingtoneFactory ringtoneFactory = new RingtoneFactory(this, context);
         SystemVibrator systemVibrator = new SystemVibrator(context);
         mInCallController = new InCallController(
-                context, mLock, this, systemStateProvider, defaultDialerAdapter, mTimeoutsAdapter);
+                context, mLock, this, systemStateProvider, defaultDialerCache, mTimeoutsAdapter);
         mRinger = new Ringer(playerFactory, context, systemSettingsUtil, asyncRingtonePlayer,
                 ringtoneFactory, systemVibrator, mInCallController);
 
@@ -365,8 +367,7 @@
         filters.add(new DirectToVoicemailCallFilter(mCallerInfoLookupHelper));
         filters.add(new AsyncBlockCheckFilter(mContext, new BlockCheckerAdapter()));
         filters.add(new CallScreeningServiceFilter(mContext, this, mPhoneAccountRegistrar,
-                mDefaultDialerManagerAdapter,
-                new ParcelableCallUtils.Converter(), mLock));
+                mDefaultDialerCache, new ParcelableCallUtils.Converter(), mLock));
         new IncomingCallFilter(mContext, this, incomingCall, mLock,
                 mTimeoutsAdapter, filters).performFiltering();
     }
@@ -415,7 +416,8 @@
                         result.shouldShowNotification);
             } else if (result.shouldShowNotification) {
                 Log.i(this, "onCallScreeningCompleted: blocked call, showing notification.");
-                mMissedCallNotifier.showMissedCallNotification(incomingCall);
+                mMissedCallNotifier.showMissedCallNotification(
+                        new MissedCallNotifier.CallInfo(incomingCall));
             }
         }
     }
@@ -728,6 +730,16 @@
                 false /* isConference */
         );
 
+        // Ensure new calls related to self-managed calls/connections are set as such.  This will
+        // be overridden when the actual connection is returned in startCreateConnection, however
+        // doing this now ensures the logs and any other logic will treat this call as self-managed
+        // from the moment it is created.
+        PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccountUnchecked(
+                phoneAccountHandle);
+        if (phoneAccount != null) {
+            call.setIsSelfManaged(phoneAccount.isSelfManaged());
+        }
+
         call.initAnalytics();
         if (getForegroundCall() != null) {
             getForegroundCall().getAnalytics().setCallIsInterrupted(true);
@@ -816,6 +828,9 @@
         boolean isReusedCall = true;
         Call call = reuseOutgoingCall(handle);
 
+        PhoneAccount account =
+                mPhoneAccountRegistrar.getPhoneAccount(phoneAccountHandle, initiatingUser);
+
         // Create a call with original handle. The handle may be changed when the call is attached
         // to a connection service, but in most cases will remain the same.
         if (call == null) {
@@ -836,6 +851,14 @@
             );
             call.initAnalytics();
 
+            // Ensure new calls related to self-managed calls/connections are set as such.  This
+            // will be overridden when the actual connection is returned in startCreateConnection,
+            // however doing this now ensures the logs and any other logic will treat this call as
+            // self-managed from the moment it is created.
+            if (account != null) {
+                call.setIsSelfManaged(account.isSelfManaged());
+            }
+
             call.setInitiatingUser(initiatingUser);
 
             isReusedCall = false;
@@ -852,9 +875,6 @@
             // Also, ensure we don't try to place an outgoing call with video if video is not
             // supported.
             if (VideoProfile.isVideo(videoState)) {
-                PhoneAccount account =
-                        mPhoneAccountRegistrar.getPhoneAccount(phoneAccountHandle, initiatingUser);
-
                 if (call.isEmergencyCall() && account != null &&
                         !account.hasCapabilities(PhoneAccount.CAPABILITY_EMERGENCY_VIDEO_CALLING)) {
                     // Phone account doesn't support emergency video calling, so fallback to
@@ -1104,7 +1124,7 @@
     public boolean isSpeakerphoneAutoEnabledForVideoCalls(int videoState) {
         return VideoProfile.isVideo(videoState) &&
             !mWiredHeadsetManager.isPluggedIn() &&
-            !mBluetoothManager.isBluetoothAvailable() &&
+            !mBluetoothRouteManager.isBluetoothAvailable() &&
             isSpeakerEnabledForVideoCalls();
     }
 
@@ -1118,7 +1138,7 @@
     private boolean isSpeakerphoneEnabledForDock() {
         return mDockManager.isDocked() &&
             !mWiredHeadsetManager.isPluggedIn() &&
-            !mBluetoothManager.isBluetoothAvailable();
+            !mBluetoothRouteManager.isBluetoothAvailable();
     }
 
     /**
@@ -1248,12 +1268,12 @@
                 // Only attempt to hold parent calls and not the individual children.
                 if (c != null && c.isAlive() && c != call && c.getParentCall() == null) {
                     otherCallHeld = true;
-                    Log.event(c, Log.Events.SWAP);
+                    Log.addEvent(c, LogUtils.Events.SWAP);
                     c.hold();
                 }
             }
             if (otherCallHeld) {
-                Log.event(call, Log.Events.SWAP);
+                Log.addEvent(call, LogUtils.Events.SWAP);
             }
             call.unhold();
         }
@@ -1510,24 +1530,32 @@
 
     boolean onMediaButton(int type) {
         if (hasAnyCalls()) {
+            Call ringingCall = getFirstCallWithState(CallState.RINGING);
             if (HeadsetMediaButton.SHORT_PRESS == type) {
-                Call ringingCall = getFirstCallWithState(CallState.RINGING);
                 if (ringingCall == null) {
-                    mCallAudioManager.toggleMute();
-                    return true;
+                    Call callToHangup = getFirstCallWithState(CallState.RINGING, CallState.DIALING,
+                            CallState.PULLING, CallState.ACTIVE, CallState.ON_HOLD);
+                    Log.addEvent(callToHangup, LogUtils.Events.INFO,
+                            "media btn short press - end call.");
+                    if (callToHangup != null) {
+                        callToHangup.disconnect();
+                        return true;
+                    }
                 } else {
                     ringingCall.answer(VideoProfile.STATE_AUDIO_ONLY);
                     return true;
                 }
             } else if (HeadsetMediaButton.LONG_PRESS == type) {
-                Log.d(this, "handleHeadsetHook: longpress -> hangup");
-                Call callToHangup = getFirstCallWithState(
-                        CallState.RINGING, CallState.DIALING, CallState.PULLING, CallState.ACTIVE,
-                        CallState.ON_HOLD);
-                if (callToHangup != null) {
-                    callToHangup.disconnect();
-                    return true;
+                if (ringingCall != null) {
+                    Log.addEvent( getForegroundCall(), LogUtils.Events.INFO,
+                            "media btn long press - reject");
+                    ringingCall.reject(false, null);
+                } else {
+                    Log.addEvent(getForegroundCall(), LogUtils.Events.INFO,
+                            "media btn long press - mute");
+                    mCallAudioManager.toggleMute();
                 }
+                return true;
             }
         }
         return false;
@@ -1779,11 +1807,11 @@
         updateCanAddCall();
         // onCallAdded for calls which immediately take the foreground (like the first call).
         for (CallsManagerListener listener : mListeners) {
-            if (Log.SYSTRACE_DEBUG) {
+            if (LogUtils.SYSTRACE_DEBUG) {
                 Trace.beginSection(listener.getClass().toString() + " addCall");
             }
             listener.onCallAdded(call);
-            if (Log.SYSTRACE_DEBUG) {
+            if (LogUtils.SYSTRACE_DEBUG) {
                 Trace.endSection();
             }
         }
@@ -1810,11 +1838,11 @@
         if (shouldNotify) {
             updateCanAddCall();
             for (CallsManagerListener listener : mListeners) {
-                if (Log.SYSTRACE_DEBUG) {
+                if (LogUtils.SYSTRACE_DEBUG) {
                     Trace.beginSection(listener.getClass().toString() + " onCallRemoved");
                 }
                 listener.onCallRemoved(call);
-                if (Log.SYSTRACE_DEBUG) {
+                if (LogUtils.SYSTRACE_DEBUG) {
                     Trace.endSection();
                 }
             }
@@ -1851,11 +1879,11 @@
             if (mCalls.contains(call)) {
                 updateCanAddCall();
                 for (CallsManagerListener listener : mListeners) {
-                    if (Log.SYSTRACE_DEBUG) {
+                    if (LogUtils.SYSTRACE_DEBUG) {
                         Trace.beginSection(listener.getClass().toString() + " onCallStateChanged");
                     }
                     listener.onCallStateChanged(call, oldState, newState);
-                    if (Log.SYSTRACE_DEBUG) {
+                    if (LogUtils.SYSTRACE_DEBUG) {
                         Trace.endSection();
                     }
                 }
@@ -1869,11 +1897,11 @@
         if (newCanAddCall != mCanAddCall) {
             mCanAddCall = newCanAddCall;
             for (CallsManagerListener listener : mListeners) {
-                if (Log.SYSTRACE_DEBUG) {
+                if (LogUtils.SYSTRACE_DEBUG) {
                     Trace.beginSection(listener.getClass().toString() + " updateCanAddCall");
                 }
                 listener.onCanAddCallChanged(mCanAddCall);
-                if (Log.SYSTRACE_DEBUG) {
+                if (LogUtils.SYSTRACE_DEBUG) {
                     Trace.endSection();
                 }
             }
@@ -2184,8 +2212,13 @@
     }
 
     private void reloadMissedCallsOfUser(UserHandle userHandle) {
-        mMissedCallNotifier.reloadFromDatabase(
-                mLock, this, mContactsAsyncHelper, mCallerInfoAsyncQueryFactory, userHandle);
+        mMissedCallNotifier.reloadFromDatabase(mCallerInfoLookupHelper,
+                new MissedCallNotifier.CallInfoFactory(), userHandle);
+    }
+
+    public void onBootCompleted() {
+        mMissedCallNotifier.reloadAfterBootComplete(mCallerInfoLookupHelper,
+                new MissedCallNotifier.CallInfoFactory());
     }
 
     /**
@@ -2225,6 +2258,13 @@
             pw.decreaseIndent();
         }
 
+        if (mDefaultDialerCache != null) {
+            pw.println("mDefaultDialerCache:");
+            pw.increaseIndent();
+            mDefaultDialerCache.dumpCache(pw);
+            pw.decreaseIndent();
+        }
+
         if (mConnectionServiceRepository != null) {
             pw.println("mConnectionServiceRepository:");
             pw.increaseIndent();
diff --git a/src/com/android/server/telecom/ConnectionServiceWrapper.java b/src/com/android/server/telecom/ConnectionServiceWrapper.java
index 6ec8945..eba6644 100644
--- a/src/com/android/server/telecom/ConnectionServiceWrapper.java
+++ b/src/com/android/server/telecom/ConnectionServiceWrapper.java
@@ -31,6 +31,8 @@
 import android.telecom.ConnectionService;
 import android.telecom.DisconnectCause;
 import android.telecom.GatewayInfo;
+import android.telecom.Log;
+import android.telecom.Logging.Session;
 import android.telecom.ParcelableConference;
 import android.telecom.ParcelableConnection;
 import android.telecom.PhoneAccountHandle;
@@ -66,8 +68,8 @@
 
         @Override
         public void handleCreateConnectionComplete(String callId, ConnectionRequest request,
-                ParcelableConnection connection) {
-            Log.startSession(Log.Sessions.CSW_HANDLE_CREATE_CONNECTION_COMPLETE);
+                ParcelableConnection connection, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_HANDLE_CREATE_CONNECTION_COMPLETE);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -82,8 +84,8 @@
         }
 
         @Override
-        public void setActive(String callId) {
-            Log.startSession(Log.Sessions.CSW_SET_ACTIVE);
+        public void setActive(String callId, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_SET_ACTIVE);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -102,8 +104,8 @@
         }
 
         @Override
-        public void setRinging(String callId) {
-            Log.startSession(Log.Sessions.CSW_SET_RINGING);
+        public void setRinging(String callId, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_SET_RINGING);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -122,8 +124,9 @@
         }
 
         @Override
-        public void setVideoProvider(String callId, IVideoProvider videoProvider) {
-            Log.startSession("CSW.sVP");
+        public void setVideoProvider(String callId, IVideoProvider videoProvider,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sVP");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -140,8 +143,8 @@
         }
 
         @Override
-        public void setDialing(String callId) {
-            Log.startSession(Log.Sessions.CSW_SET_DIALING);
+        public void setDialing(String callId, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_SET_DIALING);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -160,8 +163,8 @@
         }
 
         @Override
-        public void setPulling(String callId) {
-            Log.startSession(Log.Sessions.CSW_SET_PULLING);
+	    public void setPulling(String callId, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_SET_PULLING);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -178,8 +181,9 @@
         }
 
         @Override
-        public void setDisconnected(String callId, DisconnectCause disconnectCause) {
-            Log.startSession(Log.Sessions.CSW_SET_DISCONNECTED);
+        public void setDisconnected(String callId, DisconnectCause disconnectCause,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_SET_DISCONNECTED);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -199,8 +203,8 @@
         }
 
         @Override
-        public void setOnHold(String callId) {
-            Log.startSession(Log.Sessions.CSW_SET_ON_HOLD);
+        public void setOnHold(String callId, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_SET_ON_HOLD);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -219,8 +223,9 @@
         }
 
         @Override
-        public void setRingbackRequested(String callId, boolean ringback) {
-            Log.startSession("CSW.SRR");
+        public void setRingbackRequested(String callId, boolean ringback,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.SRR");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -239,8 +244,8 @@
         }
 
         @Override
-        public void removeCall(String callId) {
-            Log.startSession(Log.Sessions.CSW_REMOVE_CALL);
+        public void removeCall(String callId, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_REMOVE_CALL);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -262,8 +267,9 @@
         }
 
         @Override
-        public void setConnectionCapabilities(String callId, int connectionCapabilities) {
-            Log.startSession("CSW.sCC");
+        public void setConnectionCapabilities(String callId, int connectionCapabilities,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sCC");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -283,7 +289,8 @@
         }
 
         @Override
-        public void setConnectionProperties(String callId, int connectionProperties) {
+        public void setConnectionProperties(String callId, int connectionProperties,
+                Session.Info sessionInfo) {
             Log.startSession("CSW.sCP");
             long token = Binder.clearCallingIdentity();
             try {
@@ -301,8 +308,9 @@
         }
 
         @Override
-        public void setIsConferenced(String callId, String conferenceCallId) {
-            Log.startSession(Log.Sessions.CSW_SET_IS_CONFERENCED);
+        public void setIsConferenced(String callId, String conferenceCallId,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_SET_IS_CONFERENCED);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -327,8 +335,8 @@
         }
 
         @Override
-        public void setConferenceMergeFailed(String callId) {
-            Log.startSession("CSW.sCMF");
+        public void setConferenceMergeFailed(String callId, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sCMF");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -350,8 +358,9 @@
         }
 
         @Override
-        public void addConferenceCall(String callId, ParcelableConference parcelableConference) {
-            Log.startSession(Log.Sessions.CSW_ADD_CONFERENCE_CALL);
+        public void addConferenceCall(String callId, ParcelableConference parcelableConference,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, LogUtils.Sessions.CSW_ADD_CONFERENCE_CALL);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -437,8 +446,9 @@
         }
 
         @Override
-        public void onPostDialWait(String callId, String remaining) throws RemoteException {
-            Log.startSession("CSW.oPDW");
+        public void onPostDialWait(String callId, String remaining,
+                Session.Info sessionInfo) throws RemoteException {
+            Log.startSession(sessionInfo, "CSW.oPDW");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -457,8 +467,9 @@
         }
 
         @Override
-        public void onPostDialChar(String callId, char nextChar) throws RemoteException {
-            Log.startSession("CSW.oPDC");
+        public void onPostDialChar(String callId, char nextChar,
+                Session.Info sessionInfo) throws RemoteException {
+            Log.startSession(sessionInfo, "CSW.oPDC");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -477,9 +488,10 @@
         }
 
         @Override
-        public void queryRemoteConnectionServices(RemoteServiceCallback callback) {
+        public void queryRemoteConnectionServices(RemoteServiceCallback callback,
+                Session.Info sessionInfo) {
             final UserHandle callingUserHandle = Binder.getCallingUserHandle();
-            Log.startSession("CSW.qRCS");
+            Log.startSession(sessionInfo, "CSW.qRCS");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -494,8 +506,8 @@
         }
 
         @Override
-        public void setVideoState(String callId, int videoState) {
-            Log.startSession("CSW.sVS");
+        public void setVideoState(String callId, int videoState, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sVS");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -512,8 +524,8 @@
         }
 
         @Override
-        public void setIsVoipAudioMode(String callId, boolean isVoip) {
-            Log.startSession("CSW.sIVAM");
+        public void setIsVoipAudioMode(String callId, boolean isVoip, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sIVAM");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -530,8 +542,25 @@
         }
 
         @Override
-        public void setStatusHints(String callId, StatusHints statusHints) {
-            Log.startSession("CSW.sSH");
+        public void setAudioRoute(String callId, int audioRoute, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sAR");
+            long token = Binder.clearCallingIdentity();
+            try {
+                synchronized (mLock) {
+                    logIncoming("setAudioRoute %s %s", callId,
+                            CallAudioState.audioRouteToString(audioRoute));
+                    mCallsManager.setAudioRoute(audioRoute);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+                Log.endSession();
+            }
+        }
+
+        @Override
+        public void setStatusHints(String callId, StatusHints statusHints,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sSH");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -548,8 +577,8 @@
         }
 
         @Override
-        public void putExtras(String callId, Bundle extras) {
-            Log.startSession("CSW.pE");
+        public void putExtras(String callId, Bundle extras, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.pE");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -566,8 +595,8 @@
         }
 
         @Override
-        public void removeExtras(String callId, List<String> keys) {
-            Log.startSession("CSW.rE");
+        public void removeExtras(String callId, List<String> keys, Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.rE");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -584,8 +613,9 @@
         }
 
         @Override
-        public void setAddress(String callId, Uri address, int presentation) {
-            Log.startSession("CSW.sA");
+        public void setAddress(String callId, Uri address, int presentation,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sA");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -602,9 +632,9 @@
         }
 
         @Override
-        public void setCallerDisplayName(
-                String callId, String callerDisplayName, int presentation) {
-            Log.startSession("CSW.sCDN");
+        public void setCallerDisplayName(String callId, String callerDisplayName, int presentation,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sCDN");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -622,9 +652,9 @@
         }
 
         @Override
-        public void setConferenceableConnections(
-                String callId, List<String> conferenceableCallIds) {
-            Log.startSession("CSW.sCC");
+        public void setConferenceableConnections(String callId, List<String> conferenceableCallIds,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.sCC");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -651,8 +681,9 @@
         }
 
         @Override
-        public void addExistingConnection(String callId, ParcelableConnection connection) {
-            Log.startSession("CSW.aEC");
+	public void addExistingConnection(String callId, ParcelableConnection connection,
+	        Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.aEC");
             UserHandle userHandle = Binder.getCallingUserHandle();
             // Check that the Calling Package matches PhoneAccountHandle's Component Package
             PhoneAccountHandle callingPhoneAccountHandle = connection.getPhoneAccount();
@@ -723,8 +754,9 @@
         }
 
         @Override
-        public void onConnectionEvent(String callId, String event, Bundle extras) {
-            Log.startSession("CSW.oCE");
+        public void onConnectionEvent(String callId, String event, Bundle extras,
+                Session.Info sessionInfo) {
+            Log.startSession(sessionInfo, "CSW.oCE");
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -786,7 +818,7 @@
         if (isServiceValid("addConnectionServiceAdapter")) {
             try {
                 logOutgoing("addConnectionServiceAdapter %s", adapter);
-                mServiceInterface.addConnectionServiceAdapter(adapter);
+                mServiceInterface.addConnectionServiceAdapter(adapter, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
@@ -797,7 +829,7 @@
         if (isServiceValid("removeConnectionServiceAdapter")) {
             try {
                 logOutgoing("removeConnectionServiceAdapter %s", adapter);
-                mServiceInterface.removeConnectionServiceAdapter(adapter);
+                mServiceInterface.removeConnectionServiceAdapter(adapter, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
@@ -828,7 +860,7 @@
                             gatewayInfo.getOriginalAddress());
                 }
 
-                Log.event(call, Log.Events.START_CONNECTION, Log.piiHandle(call.getHandle()));
+                Log.addEvent(call, LogUtils.Events.START_CONNECTION, Log.piiHandle(call.getHandle()));
                 try {
                     mServiceInterface.createConnection(
                             call.getConnectionManagerPhoneAccount(),
@@ -838,9 +870,12 @@
                                     call.getHandle(),
                                     extras,
                                     call.getVideoState(),
-                                    callId),
+                                    callId,
+                                    false), // TODO(3pcalls): pass in true/false based on whether ux
+                                            // should show.
                             call.shouldAttachToExistingConnection(),
-                            call.isUnknown());
+                            call.isUnknown(),
+                            Log.getExternalSession());
                 } catch (RemoteException e) {
                     Log.e(this, e, "Failure to createConnection -- %s", getComponentName());
                     mPendingResponses.remove(callId).handleCreateConnectionFailure(
@@ -858,7 +893,7 @@
         mBinder.bind(callback, call);
     }
 
-    /** @see IConnectionService#abort(String) */
+    /** @see IConnectionService#abort(String, Session.Info)  */
     void abort(Call call) {
         // Clear out any pending outgoing call data
         final String callId = mCallIdMapper.getCallId(call);
@@ -867,7 +902,7 @@
         if (callId != null && isServiceValid("abort")) {
             try {
                 logOutgoing("abort %s", callId);
-                mServiceInterface.abort(callId);
+                mServiceInterface.abort(callId, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
@@ -875,84 +910,85 @@
         removeCall(call, new DisconnectCause(DisconnectCause.LOCAL));
     }
 
-    /** @see IConnectionService#silence(String) */
+    /** @see IConnectionService#silence(String, Session.Info) */
     void silence(Call call) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("silence")) {
             try {
                 logOutgoing("silence %s", callId);
-                mServiceInterface.silence(callId);
+                mServiceInterface.silence(callId, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#hold(String) */
+    /** @see IConnectionService#hold(String, Session.Info) */
     void hold(Call call) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("hold")) {
             try {
                 logOutgoing("hold %s", callId);
-                mServiceInterface.hold(callId);
+                mServiceInterface.hold(callId, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#unhold(String) */
+    /** @see IConnectionService#unhold(String, Session.Info) */
     void unhold(Call call) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("unhold")) {
             try {
                 logOutgoing("unhold %s", callId);
-                mServiceInterface.unhold(callId);
+                mServiceInterface.unhold(callId, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#onCallAudioStateChanged(String, CallAudioState) */
+    /** @see IConnectionService#onCallAudioStateChanged(String, CallAudioState, Session.Info) */
     @VisibleForTesting
     public void onCallAudioStateChanged(Call activeCall, CallAudioState audioState) {
         final String callId = mCallIdMapper.getCallId(activeCall);
         if (callId != null && isServiceValid("onCallAudioStateChanged")) {
             try {
                 logOutgoing("onCallAudioStateChanged %s %s", callId, audioState);
-                mServiceInterface.onCallAudioStateChanged(callId, audioState);
+                mServiceInterface.onCallAudioStateChanged(callId, audioState,
+                        Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#disconnect(String) */
+    /** @see IConnectionService#disconnect(String, Session.Info) */
     void disconnect(Call call) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("disconnect")) {
             try {
                 logOutgoing("disconnect %s", callId);
-                mServiceInterface.disconnect(callId);
+                mServiceInterface.disconnect(callId, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#answer(String) */
+    /** @see IConnectionService#answer(String, Session.Info) */
     void answer(Call call, int videoState) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("answer")) {
             try {
                 logOutgoing("answer %s %d", callId, videoState);
                 if (VideoProfile.isAudioOnly(videoState)) {
-                    mServiceInterface.answer(callId);
+                    mServiceInterface.answer(callId, Log.getExternalSession());
                 } else {
-                    mServiceInterface.answerVideo(callId, videoState);
+                    mServiceInterface.answerVideo(callId, videoState, Log.getExternalSession());
                 }
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#reject(String) */
+    /** @see IConnectionService#reject(String, Session.Info) */
     void reject(Call call, boolean rejectWithMessage, String message) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("reject")) {
@@ -961,34 +997,34 @@
 
                 if (rejectWithMessage && call.can(
                         Connection.CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION)) {
-                    mServiceInterface.rejectWithMessage(callId, message);
+                    mServiceInterface.rejectWithMessage(callId, message, Log.getExternalSession());
                 } else {
-                    mServiceInterface.reject(callId);
+                    mServiceInterface.reject(callId, Log.getExternalSession());
                 }
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#playDtmfTone(String, char) */
+    /** @see IConnectionService#playDtmfTone(String, char, Session.Info) */
     void playDtmfTone(Call call, char digit) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("playDtmfTone")) {
             try {
                 logOutgoing("playDtmfTone %s %c", callId, digit);
-                mServiceInterface.playDtmfTone(callId, digit);
+                mServiceInterface.playDtmfTone(callId, digit, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
     }
 
-    /** @see IConnectionService#stopDtmfTone(String) */
+    /** @see IConnectionService#stopDtmfTone(String, Session.Info) */
     void stopDtmfTone(Call call) {
         final String callId = mCallIdMapper.getCallId(call);
         if (callId != null && isServiceValid("stopDtmfTone")) {
             try {
                 logOutgoing("stopDtmfTone %s", callId);
-                mServiceInterface.stopDtmfTone(callId);
+                mServiceInterface.stopDtmfTone(callId, Log.getExternalSession());
             } catch (RemoteException e) {
             }
         }
@@ -1035,7 +1071,7 @@
         if (callId != null && isServiceValid("onPostDialContinue")) {
             try {
                 logOutgoing("onPostDialContinue %s %b", callId, proceed);
-                mServiceInterface.onPostDialContinue(callId, proceed);
+                mServiceInterface.onPostDialContinue(callId, proceed, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
@@ -1047,7 +1083,7 @@
         if (callId != null && otherCallId != null && isServiceValid("conference")) {
             try {
                 logOutgoing("conference %s %s", callId, otherCallId);
-                mServiceInterface.conference(callId, otherCallId);
+                mServiceInterface.conference(callId, otherCallId, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
@@ -1058,7 +1094,7 @@
         if (callId != null && isServiceValid("splitFromConference")) {
             try {
                 logOutgoing("splitFromConference %s", callId);
-                mServiceInterface.splitFromConference(callId);
+                mServiceInterface.splitFromConference(callId, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
@@ -1069,7 +1105,7 @@
         if (callId != null && isServiceValid("mergeConference")) {
             try {
                 logOutgoing("mergeConference %s", callId);
-                mServiceInterface.mergeConference(callId);
+                mServiceInterface.mergeConference(callId, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
@@ -1080,7 +1116,7 @@
         if (callId != null && isServiceValid("swapConference")) {
             try {
                 logOutgoing("swapConference %s", callId);
-                mServiceInterface.swapConference(callId);
+                mServiceInterface.swapConference(callId, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
@@ -1091,7 +1127,7 @@
         if (callId != null && isServiceValid("pullExternalCall")) {
             try {
                 logOutgoing("pullExternalCall %s", callId);
-                mServiceInterface.pullExternalCall(callId);
+                mServiceInterface.pullExternalCall(callId, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
@@ -1102,7 +1138,7 @@
         if (callId != null && isServiceValid("sendCallEvent")) {
             try {
                 logOutgoing("sendCallEvent %s %s", callId, event);
-                mServiceInterface.sendCallEvent(callId, event, extras);
+                mServiceInterface.sendCallEvent(callId, event, extras, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
@@ -1113,7 +1149,7 @@
         if (callId != null && isServiceValid("onExtrasChanged")) {
             try {
                 logOutgoing("onExtrasChanged %s %s", callId, extras);
-                mServiceInterface.onExtrasChanged(callId, extras);
+                mServiceInterface.onExtrasChanged(callId, extras, Log.getExternalSession());
             } catch (RemoteException ignored) {
             }
         }
diff --git a/src/com/android/server/telecom/ContactsAsyncHelper.java b/src/com/android/server/telecom/ContactsAsyncHelper.java
index 6f8c86c..7fb6419 100644
--- a/src/com/android/server/telecom/ContactsAsyncHelper.java
+++ b/src/com/android/server/telecom/ContactsAsyncHelper.java
@@ -21,6 +21,7 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
+import android.telecom.Log;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.HandlerThread;
diff --git a/src/com/android/server/telecom/CreateConnectionProcessor.java b/src/com/android/server/telecom/CreateConnectionProcessor.java
index 22ec3c6..2b88848 100644
--- a/src/com/android/server/telecom/CreateConnectionProcessor.java
+++ b/src/com/android/server/telecom/CreateConnectionProcessor.java
@@ -17,8 +17,8 @@
 package com.android.server.telecom;
 
 import android.content.Context;
-import android.os.UserHandle;
 import android.telecom.DisconnectCause;
+import android.telecom.Log;
 import android.telecom.ParcelableConnection;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
diff --git a/src/com/android/server/telecom/CreateConnectionTimeout.java b/src/com/android/server/telecom/CreateConnectionTimeout.java
index 8bc3373..399c28a 100644
--- a/src/com/android/server/telecom/CreateConnectionTimeout.java
+++ b/src/com/android/server/telecom/CreateConnectionTimeout.java
@@ -19,7 +19,8 @@
 import android.content.Context;
 import android.os.Handler;
 import android.os.Looper;
-import android.os.UserHandle;
+import android.telecom.Log;
+import android.telecom.Logging.Runnable;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 
diff --git a/src/com/android/server/telecom/DefaultDialerCache.java b/src/com/android/server/telecom/DefaultDialerCache.java
new file mode 100644
index 0000000..d511332
--- /dev/null
+++ b/src/com/android/server/telecom/DefaultDialerCache.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2016 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.server.telecom;
+
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.telecom.DefaultDialerManager;
+import android.telecom.Log;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+
+import java.util.Objects;
+
+public class DefaultDialerCache {
+    public interface DefaultDialerManagerAdapter {
+        String getDefaultDialerApplication(Context context);
+        String getDefaultDialerApplication(Context context, int userId);
+        boolean setDefaultDialerApplication(Context context, String packageName, int userId);
+    }
+
+    static class DefaultDialerManagerAdapterImpl implements DefaultDialerManagerAdapter {
+        @Override
+        public String getDefaultDialerApplication(Context context) {
+            return DefaultDialerManager.getDefaultDialerApplication(context);
+        }
+
+        @Override
+        public String getDefaultDialerApplication(Context context, int userId) {
+            return DefaultDialerManager.getDefaultDialerApplication(context, userId);
+        }
+
+        @Override
+        public boolean setDefaultDialerApplication(Context context, String packageName,
+                int userId) {
+            return DefaultDialerManager.setDefaultDialerApplication(context, packageName, userId);
+        }
+    }
+
+    private static final String LOG_TAG = "DefaultDialerCache";
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.startSession("DDC.oR");
+            try {
+                String packageName;
+                if (Intent.ACTION_PACKAGE_CHANGED.equals(intent.getAction())) {
+                    packageName = null;
+                } else if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())
+                        && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+                    packageName = intent.getData().getSchemeSpecificPart();
+                } else if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {
+                    packageName = null;
+                } else if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
+                    packageName = null;
+                } else {
+                    return;
+                }
+
+                synchronized (mLock) {
+                    refreshCachesForUsersWithPackage(packageName);
+                }
+
+            } finally {
+                Log.endSession();
+            }
+        }
+    };
+
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private final ContentObserver mDefaultDialerObserver = new ContentObserver(mHandler) {
+        @Override
+        public void onChange(boolean selfChange) {
+            Log.startSession("DDC.oC");
+            try {
+                // We don't get the user ID of the user that changed here, so we'll have to
+                // refresh all of the users.
+                synchronized (mLock) {
+                    refreshCachesForUsersWithPackage(null);
+                }
+            } finally {
+                Log.endSession();
+            }
+        }
+
+        @Override
+        public boolean deliverSelfNotifications() {
+            return true;
+        }
+    };
+
+    private final Context mContext;
+    private final DefaultDialerManagerAdapter mDefaultDialerManagerAdapter;
+    private final TelecomSystem.SyncRoot mLock;
+    private final String mSystemDialerName;
+    private SparseArray<String> mCurrentDefaultDialerPerUser = new SparseArray<>();
+
+    public DefaultDialerCache(Context context,
+            DefaultDialerManagerAdapter defaultDialerManagerAdapter,
+            TelecomSystem.SyncRoot lock) {
+        mContext = context;
+        mDefaultDialerManagerAdapter = defaultDialerManagerAdapter;
+        mLock = lock;
+        mSystemDialerName = mContext.getResources().getString(R.string.ui_default_package);
+
+        IntentFilter packageIntentFilter = new IntentFilter();
+        packageIntentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+        packageIntentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+        packageIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+        packageIntentFilter.addDataScheme("package");
+        context.registerReceiverAsUser(mReceiver, UserHandle.ALL, packageIntentFilter, null, null);
+
+        IntentFilter bootIntentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
+        context.registerReceiverAsUser(mReceiver, UserHandle.ALL, bootIntentFilter, null, null);
+
+
+        Uri defaultDialerSetting =
+                Settings.Secure.getUriFor(Settings.Secure.DIALER_DEFAULT_APPLICATION);
+        context.getContentResolver()
+                .registerContentObserver(defaultDialerSetting, false, mDefaultDialerObserver,
+                        UserHandle.USER_ALL);
+    }
+
+    public String getDefaultDialerApplication(int userId) {
+        if (userId == UserHandle.USER_CURRENT) {
+            userId = ActivityManager.getCurrentUser();
+        }
+
+        if (userId < 0) {
+            Log.w(LOG_TAG, "Attempting to get default dialer for a meta-user %d", userId);
+            return null;
+        }
+
+        synchronized (mLock) {
+            String defaultDialer = mCurrentDefaultDialerPerUser.get(userId);
+            if (defaultDialer != null) {
+                return defaultDialer;
+            }
+        }
+        return refreshCacheForUser(userId);
+    }
+
+    public String getDefaultDialerApplication() {
+        return getDefaultDialerApplication(mContext.getUserId());
+    }
+
+    public boolean isDefaultOrSystemDialer(String packageName, int userId) {
+        String defaultDialer = getDefaultDialerApplication(userId);
+        return Objects.equals(packageName, defaultDialer)
+                || Objects.equals(packageName, mSystemDialerName);
+    }
+
+    public boolean setDefaultDialer(String packageName, int userId) {
+        // No need to update cache -- this'll trigger the content observer.
+        return mDefaultDialerManagerAdapter.setDefaultDialerApplication(
+                mContext, packageName, userId);
+    }
+
+    private String refreshCacheForUser(int userId) {
+        String currentDefaultDialer =
+                mDefaultDialerManagerAdapter.getDefaultDialerApplication(mContext, userId);
+        synchronized (mLock) {
+            mCurrentDefaultDialerPerUser.put(userId, currentDefaultDialer);
+        }
+        return currentDefaultDialer;
+    }
+
+    /**
+     * Refreshes the cache for users that currently have packageName as their cached default dialer.
+     * If packageName is null, refresh all caches.
+     * @param packageName Name of the affected package.
+     */
+    private void refreshCachesForUsersWithPackage(String packageName) {
+        for (int i = 0; i < mCurrentDefaultDialerPerUser.size(); i++) {
+            int userId = mCurrentDefaultDialerPerUser.keyAt(i);
+            if (packageName == null ||
+                    Objects.equals(packageName, mCurrentDefaultDialerPerUser.get(userId))) {
+                String newDefaultDialer = refreshCacheForUser(userId);
+                Log.i(LOG_TAG, "Refreshing default dialer for user %d: now %s",
+                        userId, newDefaultDialer);
+            }
+        }
+    }
+
+    public void dumpCache(IndentingPrintWriter pw) {
+        synchronized (mLock) {
+            for (int i = 0; i < mCurrentDefaultDialerPerUser.size(); i++) {
+                pw.printf("User %d: %s\n", mCurrentDefaultDialerPerUser.keyAt(i),
+                        mCurrentDefaultDialerPerUser.valueAt(i));
+            }
+        }
+    }
+
+    /**
+     * registerContentObserver is really hard to mock out, so here is a getter method for the
+     * content observer for testing instead.
+     * @return The content observer
+     */
+    @VisibleForTesting
+    public ContentObserver getContentObserver() {
+        return mDefaultDialerObserver;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/server/telecom/DialerCodeReceiver.java b/src/com/android/server/telecom/DialerCodeReceiver.java
index 8732222..57f84a0 100644
--- a/src/com/android/server/telecom/DialerCodeReceiver.java
+++ b/src/com/android/server/telecom/DialerCodeReceiver.java
@@ -19,6 +19,7 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.telecom.Log;
 import android.telecom.TelecomManager;
 
 /**
@@ -59,7 +60,7 @@
                 // If there is an active call, add the "log mark" for that call; otherwise we will
                 // add a non-call event.
                 Call currentCall = mCallsManager.getActiveCall();
-                Log.event(currentCall, Log.Events.USER_LOG_MARK);
+                Log.addEvent(currentCall, LogUtils.Events.USER_LOG_MARK);
             }
         }
     }
diff --git a/src/com/android/server/telecom/DockManager.java b/src/com/android/server/telecom/DockManager.java
index 27ffd28..46b2efc 100644
--- a/src/com/android/server/telecom/DockManager.java
+++ b/src/com/android/server/telecom/DockManager.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.telecom.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IndentingPrintWriter;
diff --git a/src/com/android/server/telecom/DtmfLocalTonePlayer.java b/src/com/android/server/telecom/DtmfLocalTonePlayer.java
index 64c0c55..5abbf49 100644
--- a/src/com/android/server/telecom/DtmfLocalTonePlayer.java
+++ b/src/com/android/server/telecom/DtmfLocalTonePlayer.java
@@ -23,6 +23,7 @@
 import android.os.HandlerThread;
 import android.os.Message;
 import android.provider.Settings;
+import android.telecom.Log;
 
 import com.android.internal.util.Preconditions;
 
diff --git a/src/com/android/server/telecom/HeadsetMediaButton.java b/src/com/android/server/telecom/HeadsetMediaButton.java
index af0ce13..7d6a798 100644
--- a/src/com/android/server/telecom/HeadsetMediaButton.java
+++ b/src/com/android/server/telecom/HeadsetMediaButton.java
@@ -23,6 +23,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
+import android.telecom.Log;
 import android.view.KeyEvent;
 
 /**
@@ -92,6 +93,7 @@
     private final CallsManager mCallsManager;
     private final TelecomSystem.SyncRoot mLock;
     private MediaSession mSession;
+    private KeyEvent mLastHookEvent;
 
     public HeadsetMediaButton(
             Context context,
@@ -114,10 +116,24 @@
     private boolean handleHeadsetHook(KeyEvent event) {
         Log.d(this, "handleHeadsetHook()...%s %s", event.getAction(), event.getRepeatCount());
 
+        // Save ACTION_DOWN Event temporarily.
+        if (event.getAction() == KeyEvent.ACTION_DOWN) {
+            mLastHookEvent = event;
+        }
+
         if (event.isLongPress()) {
             return mCallsManager.onMediaButton(LONG_PRESS);
-        } else if (event.getAction() == KeyEvent.ACTION_UP && event.getRepeatCount() == 0) {
-            return mCallsManager.onMediaButton(SHORT_PRESS);
+        } else if (event.getAction() == KeyEvent.ACTION_UP) {
+            // We should not judge SHORT_PRESS by ACTION_UP event repeatCount, because it always
+            // return 0.
+            // Actually ACTION_DOWN event repeatCount only increases when LONG_PRESS performed.
+            if (mLastHookEvent != null && mLastHookEvent.getRepeatCount() == 0) {
+                return mCallsManager.onMediaButton(SHORT_PRESS);
+            }
+        }
+
+        if (event.getAction() != KeyEvent.ACTION_DOWN) {
+            mLastHookEvent = null;
         }
 
         return true;
diff --git a/src/com/android/server/telecom/InCallAdapter.java b/src/com/android/server/telecom/InCallAdapter.java
index e47f3a2..e775818 100644
--- a/src/com/android/server/telecom/InCallAdapter.java
+++ b/src/com/android/server/telecom/InCallAdapter.java
@@ -18,6 +18,7 @@
 
 import android.os.Binder;
 import android.os.Bundle;
+import android.telecom.Log;
 import android.telecom.PhoneAccountHandle;
 
 import com.android.internal.telecom.IInCallAdapter;
@@ -47,7 +48,7 @@
     @Override
     public void answerCall(String callId, int videoState) {
         try {
-            Log.startSession(Log.Sessions.ICA_ANSWER_CALL, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_ANSWER_CALL, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -70,7 +71,7 @@
     @Override
     public void rejectCall(String callId, boolean rejectWithMessage, String textMessage) {
         try {
-            Log.startSession(Log.Sessions.ICA_REJECT_CALL, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_REJECT_CALL, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -162,7 +163,7 @@
     @Override
     public void disconnectCall(String callId) {
         try {
-            Log.startSession(Log.Sessions.ICA_DISCONNECT_CALL, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_DISCONNECT_CALL, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -185,7 +186,7 @@
     @Override
     public void holdCall(String callId) {
         try {
-            Log.startSession(Log.Sessions.ICA_HOLD_CALL, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_HOLD_CALL, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -207,7 +208,7 @@
     @Override
     public void unholdCall(String callId) {
         try {
-            Log.startSession(Log.Sessions.ICA_UNHOLD_CALL, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_UNHOLD_CALL, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -252,7 +253,7 @@
     @Override
     public void mute(boolean shouldMute) {
         try {
-            Log.startSession(Log.Sessions.ICA_MUTE, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_MUTE, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -269,7 +270,7 @@
     @Override
     public void setAudioRoute(int route) {
         try {
-            Log.startSession(Log.Sessions.ICA_SET_AUDIO_ROUTE, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_SET_AUDIO_ROUTE, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
@@ -286,7 +287,7 @@
     @Override
     public void conference(String callId, String otherCallId) {
         try {
-            Log.startSession(Log.Sessions.ICA_CONFERENCE, mOwnerComponentName);
+            Log.startSession(LogUtils.Sessions.ICA_CONFERENCE, mOwnerComponentName);
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index 2157bf3..2200352 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -36,6 +36,8 @@
 import android.telecom.ConnectionService;
 import android.telecom.DefaultDialerManager;
 import android.telecom.InCallService;
+import android.telecom.Log;
+import android.telecom.Logging.Runnable;
 import android.telecom.ParcelableCall;
 import android.telecom.TelecomManager;
 import android.text.TextUtils;
@@ -46,7 +48,6 @@
 import com.android.internal.telecom.IInCallService;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.telecom.SystemStateProvider.SystemStateListener;
-import com.android.server.telecom.TelecomServiceImpl.DefaultDialerManagerAdapter;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -178,7 +179,7 @@
         @Override
         public boolean connect(Call call) {
             if (mIsConnected) {
-                Log.event(call, Log.Events.INFO, "Already connected, ignoring request.");
+                Log.addEvent(call, LogUtils.Events.INFO, "Already connected, ignoring request.");
                 return true;
             }
 
@@ -215,7 +216,7 @@
                 mContext.unbindService(mServiceConnection);
                 mIsConnected = false;
             } else {
-                Log.event(null, Log.Events.INFO, "Already disconnected, ignoring request.");
+                Log.addEvent(null, LogUtils.Events.INFO, "Already disconnected, ignoring request.");
             }
         }
 
@@ -612,20 +613,20 @@
     private final TelecomSystem.SyncRoot mLock;
     private final CallsManager mCallsManager;
     private final SystemStateProvider mSystemStateProvider;
-    private final DefaultDialerManagerAdapter mDefaultDialerAdapter;
     private final Timeouts.Adapter mTimeoutsAdapter;
+    private final DefaultDialerCache mDefaultDialerCache;
     private CarSwappingInCallServiceConnection mInCallServiceConnection;
     private NonUIInCallServiceConnectionCollection mNonUIInCallServiceConnections;
 
     public InCallController(Context context, TelecomSystem.SyncRoot lock, CallsManager callsManager,
             SystemStateProvider systemStateProvider,
-            DefaultDialerManagerAdapter defaultDialerAdapter, Timeouts.Adapter timeoutsAdapter) {
+            DefaultDialerCache defaultDialerCache, Timeouts.Adapter timeoutsAdapter) {
         mContext = context;
         mLock = lock;
         mCallsManager = callsManager;
         mSystemStateProvider = systemStateProvider;
-        mDefaultDialerAdapter = defaultDialerAdapter;
         mTimeoutsAdapter = timeoutsAdapter;
+        mDefaultDialerCache = defaultDialerCache;
 
         Resources resources = mContext.getResources();
         mSystemInCallComponentName = new ComponentName(
@@ -913,8 +914,8 @@
     }
 
     private InCallServiceInfo getDefaultDialerComponent() {
-        String packageName = mDefaultDialerAdapter.getDefaultDialerApplication(
-                mContext, mCallsManager.getCurrentUserHandle().getIdentifier());
+        String packageName = mDefaultDialerCache.getDefaultDialerApplication(
+                mCallsManager.getCurrentUserHandle().getIdentifier());
         Log.d(this, "Default Dialer package: " + packageName);
 
         return getInCallServiceComponent(packageName, IN_CALL_SERVICE_TYPE_DIALER_UI);
@@ -1036,8 +1037,8 @@
 
         // Check to see that it is the default dialer package
         boolean isDefaultDialerPackage = Objects.equals(serviceInfo.packageName,
-                mDefaultDialerAdapter.getDefaultDialerApplication(
-                    mContext, mCallsManager.getCurrentUserHandle().getIdentifier()));
+                mDefaultDialerCache.getDefaultDialerApplication(
+                    mCallsManager.getCurrentUserHandle().getIdentifier()));
         boolean isUIService = serviceInfo.metaData != null &&
                 serviceInfo.metaData.getBoolean(
                         TelecomManager.METADATA_IN_CALL_SERVICE_UI, false);
diff --git a/src/com/android/server/telecom/InCallTonePlayer.java b/src/com/android/server/telecom/InCallTonePlayer.java
index e0b0dc0..62c692b 100644
--- a/src/com/android/server/telecom/InCallTonePlayer.java
+++ b/src/com/android/server/telecom/InCallTonePlayer.java
@@ -20,6 +20,9 @@
 import android.media.ToneGenerator;
 import android.os.Handler;
 import android.os.Looper;
+import android.telecom.Log;
+import android.telecom.Logging.Runnable;
+import android.telecom.Logging.Session;
 
 import com.android.internal.annotations.VisibleForTesting;
 
diff --git a/src/com/android/server/telecom/InCallWakeLockController.java b/src/com/android/server/telecom/InCallWakeLockController.java
index 0de8123..ac93bb5 100644
--- a/src/com/android/server/telecom/InCallWakeLockController.java
+++ b/src/com/android/server/telecom/InCallWakeLockController.java
@@ -17,6 +17,7 @@
 package com.android.server.telecom;
 
 import com.android.internal.annotations.VisibleForTesting;
+import android.telecom.Log;
 
 /**
  * Handles acquisition and release of wake locks relating to call state.
diff --git a/src/com/android/server/telecom/Log.java b/src/com/android/server/telecom/Log.java
deleted file mode 100644
index 9903eec..0000000
--- a/src/com/android/server/telecom/Log.java
+++ /dev/null
@@ -1,1033 +0,0 @@
-/*
- * Copyright 2014, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.telecom;
-
-import android.content.Context;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.AsyncTask;
-import android.telecom.PhoneAccount;
-import android.telecom.TimedEvent;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Base64;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-
-import java.nio.ByteBuffer;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.IllegalFormatException;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.LinkedBlockingQueue;
-
-/**
- * Manages logging for the entire module.
- */
-@VisibleForTesting
-public class Log {
-
-    public static final class Sessions {
-        public static final String ICA_ANSWER_CALL = "ICA.aC";
-        public static final String ICA_REJECT_CALL = "ICA.rC";
-        public static final String ICA_DISCONNECT_CALL = "ICA.dC";
-        public static final String ICA_HOLD_CALL = "ICA.hC";
-        public static final String ICA_UNHOLD_CALL = "ICA.uC";
-        public static final String ICA_MUTE = "ICA.m";
-        public static final String ICA_SET_AUDIO_ROUTE = "ICA.sAR";
-        public static final String ICA_CONFERENCE = "ICA.c";
-        public static final String CSW_HANDLE_CREATE_CONNECTION_COMPLETE = "CSW.hCCC";
-        public static final String CSW_SET_ACTIVE = "CSW.sA";
-        public static final String CSW_SET_RINGING = "CSW.sR";
-        public static final String CSW_SET_DIALING = "CSW.sD";
-        public static final String CSW_SET_PULLING = "CSW.sP";
-        public static final String CSW_SET_DISCONNECTED = "CSW.sDc";
-        public static final String CSW_SET_ON_HOLD = "CSW.sOH";
-        public static final String CSW_REMOVE_CALL = "CSW.rC";
-        public static final String CSW_SET_IS_CONFERENCED = "CSW.sIC";
-        public static final String CSW_ADD_CONFERENCE_CALL = "CSW.aCC";
-    }
-
-    /**
-     * Stores the various events associated with {@link Call}s. Also stores all request-response
-     * pairs amongst the events.
-     */
-    public final static class Events {
-        public static class TimedEventPair {
-            private static final long DEFAULT_TIMEOUT = 3000L;
-
-            String mRequest;
-            String mResponse;
-            String mName;
-            long mTimeoutMillis = DEFAULT_TIMEOUT;
-
-            public TimedEventPair(String request, String response,
-                    String name) {
-                this.mRequest = request;
-                this.mResponse = response;
-                this.mName = name;
-            }
-
-            public TimedEventPair(String request, String response,
-                    String name, long timeoutMillis) {
-                this.mRequest = request;
-                this.mResponse = response;
-                this.mName = name;
-                this.mTimeoutMillis = timeoutMillis;
-            }
-        }
-
-        public static final String CREATED = "CREATED";
-        public static final String DESTROYED = "DESTROYED";
-        public static final String SET_CONNECTING = "SET_CONNECTING";
-        public static final String SET_DIALING = "SET_DIALING";
-        public static final String SET_PULLING = "SET_PULLING";
-        public static final String SET_ACTIVE = "SET_ACTIVE";
-        public static final String SET_HOLD = "SET_HOLD";
-        public static final String SET_RINGING = "SET_RINGING";
-        public static final String SET_DISCONNECTED = "SET_DISCONNECTED";
-        public static final String SET_DISCONNECTING = "SET_DISCONNECTING";
-        public static final String SET_SELECT_PHONE_ACCOUNT = "SET_SELECT_PHONE_ACCOUNT";
-        public static final String REQUEST_HOLD = "REQUEST_HOLD";
-        public static final String REQUEST_UNHOLD = "REQUEST_UNHOLD";
-        public static final String REQUEST_DISCONNECT = "REQUEST_DISCONNECT";
-        public static final String REQUEST_ACCEPT = "REQUEST_ACCEPT";
-        public static final String REQUEST_REJECT = "REQUEST_REJECT";
-        public static final String START_DTMF = "START_DTMF";
-        public static final String STOP_DTMF = "STOP_DTMF";
-        public static final String START_RINGER = "START_RINGER";
-        public static final String STOP_RINGER = "STOP_RINGER";
-        public static final String START_VIBRATOR = "START_VIBRATOR";
-        public static final String STOP_VIBRATOR = "STOP_VIBRATOR";
-        public static final String SKIP_VIBRATION = "SKIP_VIBRATION";
-        public static final String SKIP_RINGING = "SKIP_RINGING";
-        public static final String START_CALL_WAITING_TONE = "START_CALL_WAITING_TONE";
-        public static final String STOP_CALL_WAITING_TONE = "STOP_CALL_WAITING_TONE";
-        public static final String START_CONNECTION = "START_CONNECTION";
-        public static final String BIND_CS = "BIND_CS";
-        public static final String CS_BOUND = "CS_BOUND";
-        public static final String CONFERENCE_WITH = "CONF_WITH";
-        public static final String SPLIT_FROM_CONFERENCE = "CONF_SPLIT";
-        public static final String SWAP = "SWAP";
-        public static final String ADD_CHILD = "ADD_CHILD";
-        public static final String REMOVE_CHILD = "REMOVE_CHILD";
-        public static final String SET_PARENT = "SET_PARENT";
-        public static final String MUTE = "MUTE";
-        public static final String UNMUTE = "UNMUTE";
-        public static final String AUDIO_ROUTE = "AUDIO_ROUTE";
-        public static final String AUDIO_ROUTE_EARPIECE = "AUDIO_ROUTE_EARPIECE";
-        public static final String AUDIO_ROUTE_HEADSET = "AUDIO_ROUTE_HEADSET";
-        public static final String AUDIO_ROUTE_BT = "AUDIO_ROUTE_BT";
-        public static final String AUDIO_ROUTE_SPEAKER = "AUDIO_ROUTE_SPEAKER";
-        public static final String ERROR_LOG = "ERROR";
-        public static final String USER_LOG_MARK = "USER_LOG_MARK";
-        public static final String SILENCE = "SILENCE";
-        public static final String BIND_SCREENING = "BIND_SCREENING";
-        public static final String SCREENING_BOUND = "SCREENING_BOUND";
-        public static final String SCREENING_SENT = "SCREENING_SENT";
-        public static final String SCREENING_COMPLETED = "SCREENING_COMPLETED";
-        public static final String BLOCK_CHECK_INITIATED = "BLOCK_CHECK_INITIATED";
-        public static final String BLOCK_CHECK_FINISHED = "BLOCK_CHECK_FINISHED";
-        public static final String DIRECT_TO_VM_INITIATED = "DIRECT_TO_VM_INITIATED";
-        public static final String DIRECT_TO_VM_FINISHED = "DIRECT_TO_VM_FINISHED";
-        public static final String FILTERING_INITIATED = "FILTERING_INITIATED";
-        public static final String FILTERING_COMPLETED = "FILTERING_COMPLETED";
-        public static final String FILTERING_TIMED_OUT = "FILTERING_TIMED_OUT";
-        public static final String REMOTELY_HELD = "REMOTELY_HELD";
-        public static final String REMOTELY_UNHELD = "REMOTELY_UNHELD";
-        public static final String REQUEST_PULL = "PULL";
-        public static final String INFO = "INFO";
-        public static final String VIDEO_STATE_CHANGED = "VIDEO_STATE_CHANGED";
-        public static final String RECEIVE_VIDEO_REQUEST = "RECEIVE_VIDEO_REQUEST";
-        public static final String RECEIVE_VIDEO_RESPONSE = "RECEIVE_VIDEO_RESPONSE";
-        public static final String SEND_VIDEO_REQUEST = "SEND_VIDEO_REQUEST";
-        public static final String SEND_VIDEO_RESPONSE = "SEND_VIDEO_RESPONSE";
-        public static final String IS_EXTERNAL = "IS_EXTERNAL";
-        public static final String PROPERTY_CHANGE = "PROPERTY_CHANGE";
-        public static final String CAPABILITY_CHANGE = "CAPABILITY_CHANGE";
-        public static final String CONNECTION_EVENT = "CONNECTION_EVENT";
-
-        public static class Timings {
-            public static final String ACCEPT_TIMING = "accept";
-            public static final String REJECT_TIMING = "reject";
-            public static final String DISCONNECT_TIMING = "disconnect";
-            public static final String HOLD_TIMING = "hold";
-            public static final String UNHOLD_TIMING = "unhold";
-            public static final String OUTGOING_TIME_TO_DIALING_TIMING = "outgoing_time_to_dialing";
-            public static final String BIND_CS_TIMING = "bind_cs";
-            public static final String SCREENING_COMPLETED_TIMING = "screening_completed";
-            public static final String DIRECT_TO_VM_FINISHED_TIMING = "direct_to_vm_finished";
-            public static final String BLOCK_CHECK_FINISHED_TIMING = "block_check_finished";
-            public static final String FILTERING_COMPLETED_TIMING = "filtering_completed";
-            public static final String FILTERING_TIMED_OUT_TIMING = "filtering_timed_out";
-
-            private static final TimedEventPair[] sTimedEvents = {
-                    new TimedEventPair(REQUEST_ACCEPT, SET_ACTIVE, ACCEPT_TIMING),
-                    new TimedEventPair(REQUEST_REJECT, SET_DISCONNECTED, REJECT_TIMING),
-                    new TimedEventPair(REQUEST_DISCONNECT, SET_DISCONNECTED, DISCONNECT_TIMING),
-                    new TimedEventPair(REQUEST_HOLD, SET_HOLD, HOLD_TIMING),
-                    new TimedEventPair(REQUEST_UNHOLD, SET_ACTIVE, UNHOLD_TIMING),
-                    new TimedEventPair(START_CONNECTION, SET_DIALING,
-                            OUTGOING_TIME_TO_DIALING_TIMING),
-                    new TimedEventPair(BIND_CS, CS_BOUND, BIND_CS_TIMING),
-                    new TimedEventPair(SCREENING_SENT, SCREENING_COMPLETED,
-                            SCREENING_COMPLETED_TIMING),
-                    new TimedEventPair(DIRECT_TO_VM_INITIATED, DIRECT_TO_VM_FINISHED,
-                            DIRECT_TO_VM_FINISHED_TIMING),
-                    new TimedEventPair(BLOCK_CHECK_INITIATED, BLOCK_CHECK_FINISHED,
-                            BLOCK_CHECK_FINISHED_TIMING),
-                    new TimedEventPair(FILTERING_INITIATED, FILTERING_COMPLETED,
-                            FILTERING_COMPLETED_TIMING),
-                    new TimedEventPair(FILTERING_INITIATED, FILTERING_TIMED_OUT,
-                            FILTERING_TIMED_OUT_TIMING, 6000L),
-            };
-        }
-
-        /**
-         * Maps from request events to a list of possible response events. Used to track
-         * end-to-end timing for critical user-facing operations in Telecom.
-         */
-        public static final Map<String, List<TimedEventPair>> requestResponsePairs;
-        static {
-            requestResponsePairs = new HashMap<>();
-            for (TimedEventPair p : Timings.sTimedEvents) {
-                if (requestResponsePairs.containsKey(p.mRequest)) {
-                    requestResponsePairs.get(p.mRequest).add(p);
-                } else {
-                    ArrayList<TimedEventPair> responses = new ArrayList<>();
-                    responses.add(p);
-                    requestResponsePairs.put(p.mRequest, responses);
-                }
-            }
-        }
-    }
-
-    public static class CallEvent {
-        public String eventId;
-        public String sessionId;
-        public long time;
-        public Object data;
-
-        public CallEvent(String eventId, String sessionId, long time, Object data) {
-            this.eventId = eventId;
-            this.sessionId = sessionId;
-            this.time = time;
-            this.data = data;
-        }
-    }
-
-    public static class CallEventRecord {
-        public static class EventTiming extends TimedEvent<String> {
-            public String name;
-            public long time;
-
-            public EventTiming(String name, long time) {
-                this.name = name;
-                this.time = time;
-            }
-
-            public String getKey() {
-                return name;
-            }
-
-            public long getTime() {
-                return time;
-            }
-        }
-
-        private static class PendingResponse {
-            String requestEventId;
-            long requestEventTimeMillis;
-            long timeoutMillis;
-            String name;
-
-            public PendingResponse(String requestEventId, long requestEventTimeMillis,
-                    long timeoutMillis, String name) {
-                this.requestEventId = requestEventId;
-                this.requestEventTimeMillis = requestEventTimeMillis;
-                this.timeoutMillis = timeoutMillis;
-                this.name = name;
-            }
-        }
-
-        private static final DateFormat sLongDateFormat = new SimpleDateFormat(
-                "yyyy-MM-dd HH:mm:ss.SSS");
-        private static final DateFormat sDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
-        private final List<CallEvent> mEvents = new LinkedList<>();
-        private final Call mCall;
-
-        public CallEventRecord(Call call) {
-            mCall = call;
-        }
-
-        public Call getCall() {
-            return mCall;
-        }
-
-        public void addEvent(String event, String sessionId, Object data) {
-            mEvents.add(new CallEvent(event, sessionId, System.currentTimeMillis(), data));
-            Log.i("Event", "Call %s: %s, %s", mCall.getId(), event, data);
-        }
-
-        public List<CallEvent> getEvents() {
-            return mEvents;
-        }
-
-        public List<EventTiming> extractEventTimings() {
-            if (mEvents == null) {
-                return Collections.emptyList();
-            }
-
-            LinkedList<EventTiming> result = new LinkedList<>();
-            Map<String, PendingResponse> pendingResponses = new HashMap<>();
-            for (CallEvent event : mEvents) {
-                if (Events.requestResponsePairs.containsKey(event.eventId)) {
-                    // This event expects a response, so add that expected response to the maps
-                    // of pending events.
-                    for (Events.TimedEventPair p : Events.requestResponsePairs.get(event.eventId)) {
-                        pendingResponses.put(p.mResponse, new PendingResponse(event.eventId,
-                                event.time, p.mTimeoutMillis, p.mName));
-                    }
-                }
-
-                PendingResponse pendingResponse = pendingResponses.remove(event.eventId);
-                if (pendingResponse != null) {
-                    long elapsedTime = event.time - pendingResponse.requestEventTimeMillis;
-                    if (elapsedTime < pendingResponse.timeoutMillis) {
-                        result.add(new EventTiming(pendingResponse.name, elapsedTime));
-                    }
-                }
-            }
-
-            return result;
-        }
-
-        public void dump(IndentingPrintWriter pw) {
-            pw.print("Call ");
-            pw.print(mCall.getId());
-            pw.print(" [");
-            pw.print(sLongDateFormat.format(new Date(mCall.getCreationTimeMillis())));
-            pw.print("]");
-            pw.println(mCall.isIncoming() ? "(MT - incoming)" : "(MO - outgoing)");
-
-            pw.increaseIndent();
-            pw.println("To address: " + piiHandle(mCall.getHandle()));
-
-            for (CallEvent event : mEvents) {
-                pw.print(sDateFormat.format(new Date(event.time)));
-                pw.print(" - ");
-                pw.print(event.eventId);
-                if (event.data != null) {
-                    pw.print(" (");
-                    Object data = event.data;
-
-                    if (data instanceof Call) {
-                        // If the data is another call, then change the data to the call's CallEvent
-                        // ID instead.
-                        CallEventRecord record = mCallEventRecordMap.get(data);
-                        if (record != null) {
-                            data = "Call " + record.mCall.getId();
-                        }
-                    }
-
-                    pw.print(data);
-                    pw.print(")");
-                }
-                pw.print(":");
-                pw.print(event.sessionId);
-                pw.println();
-            }
-
-            pw.println("Timings (average for this call, milliseconds):");
-            pw.increaseIndent();
-            Map<String, Double> avgEventTimings = EventTiming.averageTimings(extractEventTimings());
-            List<String> eventNames = new ArrayList<>(avgEventTimings.keySet());
-            Collections.sort(eventNames);
-            for (String eventName : eventNames) {
-                pw.printf("%s: %.2f\n", eventName, avgEventTimings.get(eventName));
-            }
-            pw.decreaseIndent();
-            pw.decreaseIndent();
-        }
-    }
-
-    public static final int MAX_CALLS_TO_CACHE = 10;  // Arbitrarily chosen.
-    public static final int MAX_CALLS_TO_CACHE_DEBUG = 20;  // Arbitrarily chosen.
-    private static final long EXTENDED_LOGGING_DURATION_MILLIS = 60000 * 30; // 30 minutes
-
-    // Don't check in with this true!
-    private static final boolean LOG_DBG = false;
-
-    // Currently using 3 letters, So don't exceed 64^3
-    private static final long SESSION_ID_ROLLOVER_THRESHOLD = 262144;
-
-    // Generic tag for all In Call logging
-    @VisibleForTesting
-    public static String TAG = "Telecom";
-    public static String LOGGING_TAG = "Logging";
-
-    public static final boolean FORCE_LOGGING = false; /* STOP SHIP if true */
-    public static final boolean SYSTRACE_DEBUG = false; /* STOP SHIP if true */
-    public static final boolean DEBUG = isLoggable(android.util.Log.DEBUG);
-    public static final boolean INFO = isLoggable(android.util.Log.INFO);
-    public static final boolean VERBOSE = isLoggable(android.util.Log.VERBOSE);
-    public static final boolean WARN = isLoggable(android.util.Log.WARN);
-    public static final boolean ERROR = isLoggable(android.util.Log.ERROR);
-
-    private static final Map<Call, CallEventRecord> mCallEventRecordMap = new HashMap<>();
-    private static LinkedBlockingQueue<CallEventRecord> mCallEventRecords =
-            new LinkedBlockingQueue<CallEventRecord>(MAX_CALLS_TO_CACHE);
-
-    private static Context mContext = null;
-    // Synchronized in all method calls
-    private static int sCodeEntryCounter = 0;
-    @VisibleForTesting
-    public static ConcurrentHashMap<Integer, Session> sSessionMapper = new ConcurrentHashMap<>(100);
-    @VisibleForTesting
-    public static Handler sSessionCleanupHandler = new Handler(Looper.getMainLooper());
-    @VisibleForTesting
-    public static java.lang.Runnable sCleanStaleSessions = new java.lang.Runnable() {
-        @Override
-        public void run() {
-            cleanupStaleSessions(getSessionCleanupTimeoutMs());
-        }
-    };
-
-    // Set the logging container to be the system's. This will only change when being mocked
-    // during testing.
-    private static SystemLoggingContainer systemLogger = new SystemLoggingContainer();
-
-    /**
-     * Tracks whether user-activated extended logging is enabled.
-     */
-    private static boolean mIsUserExtendedLoggingEnabled = false;
-
-    /**
-     * The time when user-activated extended logging should be ended.  Used to determine when
-     * extended logging should automatically be disabled.
-     */
-    private static long mUserExtendedLoggingStopTime = 0;
-
-    private Log() {
-    }
-
-    public static void setContext(Context context) {
-        mContext = context;
-    }
-
-    /**
-     * Enable or disable extended telecom logging.
-     *
-     * @param isExtendedLoggingEnabled {@code true} if extended logging should be enabled,
-     *          {@code false} if it should be disabled.
-     */
-    public static void setIsExtendedLoggingEnabled(boolean isExtendedLoggingEnabled) {
-        // If the state hasn't changed, bail early.
-        if (mIsUserExtendedLoggingEnabled == isExtendedLoggingEnabled) {
-            return;
-        }
-
-        // Resize the event queue.
-        int newSize = isExtendedLoggingEnabled ? MAX_CALLS_TO_CACHE_DEBUG : MAX_CALLS_TO_CACHE;
-        LinkedBlockingQueue<CallEventRecord> oldEventLog = mCallEventRecords;
-        mCallEventRecords = new LinkedBlockingQueue<CallEventRecord>(newSize);
-        mCallEventRecordMap.clear();
-
-        // Copy the existing queue into the new one.
-        for (CallEventRecord event : oldEventLog) {
-            addCallEventRecord(event);
-        }
-
-        mIsUserExtendedLoggingEnabled = isExtendedLoggingEnabled;
-        if (mIsUserExtendedLoggingEnabled) {
-            mUserExtendedLoggingStopTime = System.currentTimeMillis()
-                    + EXTENDED_LOGGING_DURATION_MILLIS;
-        } else {
-            mUserExtendedLoggingStopTime = 0;
-        }
-    }
-
-    public static final long DEFAULT_SESSION_TIMEOUT_MS = 30000L; // 30 seconds
-    private static MessageDigest sMessageDigest;
-
-    public static void initMd5Sum() {
-        new AsyncTask<Void, Void, Void>() {
-            @Override
-            public Void doInBackground(Void... args) {
-                MessageDigest md;
-                try {
-                    md = MessageDigest.getInstance("SHA-1");
-                } catch (NoSuchAlgorithmException e) {
-                    md = null;
-                }
-                sMessageDigest = md;
-                return null;
-            }
-        }.execute();
-    }
-
-    @VisibleForTesting
-    public static void setTag(String tag) {
-        TAG = tag;
-    }
-
-    @VisibleForTesting
-    public static void setLoggingContainer(SystemLoggingContainer logger) {
-        systemLogger = logger;
-    }
-
-    // Overridden in LogTest to skip query to ContentProvider
-    public interface ISessionCleanupTimeoutMs {
-        long get();
-    }
-    @VisibleForTesting
-    public static ISessionCleanupTimeoutMs sSessionCleanupTimeoutMs =
-            new ISessionCleanupTimeoutMs() {
-                @Override
-                public long get() {
-                    // mContext will be null if Log is called from another process
-                    // (UserCallActivity, for example). For these cases, use the default value.
-                    if(mContext == null) {
-                        return DEFAULT_SESSION_TIMEOUT_MS;
-                    }
-                    return Timeouts.getStaleSessionCleanupTimeoutMillis(
-                            mContext.getContentResolver());
-                }
-            };
-
-    private static long getSessionCleanupTimeoutMs() {
-        return sSessionCleanupTimeoutMs.get();
-    }
-
-    private static synchronized void resetStaleSessionTimer() {
-        sSessionCleanupHandler.removeCallbacksAndMessages(null);
-        // Will be null in Log Testing
-        if (sCleanStaleSessions != null) {
-            sSessionCleanupHandler.postDelayed(sCleanStaleSessions, getSessionCleanupTimeoutMs());
-        }
-    }
-
-    /**
-     * Call at an entry point to the Telecom code to track the session. This code must be
-     * accompanied by a Log.endSession().
-     */
-    public static synchronized void startSession(String shortMethodName) {
-        startSession(shortMethodName, null);
-    }
-    public static synchronized void startSession(String shortMethodName,
-            String callerIdentification) {
-        resetStaleSessionTimer();
-        int threadId = getCallingThreadId();
-        Session activeSession = sSessionMapper.get(threadId);
-        // We have called startSession within an active session that has not ended... Register this
-        // session as a subsession.
-        if (activeSession != null) {
-            Session childSession = createSubsession(true);
-            continueSession(childSession, shortMethodName);
-            return;
-        }
-        Session newSession = new Session(getNextSessionID(), shortMethodName,
-                System.currentTimeMillis(), threadId, false, callerIdentification);
-        sSessionMapper.put(threadId, newSession);
-
-        Log.v(LOGGING_TAG, Session.START_SESSION);
-    }
-
-
-    /**
-     * Notifies the logging system that a subsession will be run at a later point and
-     * allocates the resources. Returns a session object that must be used in
-     * Log.continueSession(...) to start the subsession.
-     */
-    public static Session createSubsession() {
-        return createSubsession(false);
-    }
-
-    private static synchronized Session createSubsession(boolean isStartedFromActiveSession) {
-        int threadId = getCallingThreadId();
-        Session threadSession = sSessionMapper.get(threadId);
-        if (threadSession == null) {
-            Log.d(LOGGING_TAG, "Log.createSubsession was called with no session active.");
-            return null;
-        }
-        // Start execution time of the session will be overwritten in continueSession(...).
-        Session newSubsession = new Session(threadSession.getNextChildId(),
-                threadSession.getShortMethodName(), System.currentTimeMillis(), threadId,
-                isStartedFromActiveSession, null);
-        threadSession.addChild(newSubsession);
-        newSubsession.setParentSession(threadSession);
-
-        if(!isStartedFromActiveSession) {
-            Log.v(LOGGING_TAG, Session.CREATE_SUBSESSION + " " + newSubsession.toString());
-        } else {
-            Log.v(LOGGING_TAG, Session.CREATE_SUBSESSION + " (Invisible subsession)");
-        }
-        return newSubsession;
-    }
-
-    /**
-     * Cancels a subsession that had Log.createSubsession() called on it, but will never have
-     * Log.continueSession(...) called on it due to an error. Allows the subsession to be cleaned
-     * gracefully instead of being removed by the sSessionCleanupHandler forcefully later.
-     */
-    public static synchronized void cancelSubsession(Session subsession) {
-        if (subsession == null) {
-            return;
-        }
-
-        subsession.markSessionCompleted(0);
-        endParentSessions(subsession);
-    }
-
-    /**
-     * Starts the subsession that was created in Log.CreateSubsession. The Log.endSession() method
-     * must be called at the end of this method. The full session will complete when all
-     * subsessions are completed.
-     */
-    public static synchronized void continueSession(Session subsession, String shortMethodName) {
-        if (subsession == null) {
-            return;
-        }
-        resetStaleSessionTimer();
-        String callingMethodName = subsession.getShortMethodName();
-        subsession.setShortMethodName(callingMethodName + "->" + shortMethodName);
-        subsession.setExecutionStartTimeMs(System.currentTimeMillis());
-        Session parentSession = subsession.getParentSession();
-        if (parentSession == null) {
-            Log.d(LOGGING_TAG, "Log.continueSession was called with no session active for " +
-                    "method %s.", shortMethodName);
-            return;
-        }
-
-        sSessionMapper.put(getCallingThreadId(), subsession);
-        if(!subsession.isStartedFromActiveSession()) {
-            Log.v(LOGGING_TAG, Session.CONTINUE_SUBSESSION);
-        } else {
-            Log.v(LOGGING_TAG, Session.CONTINUE_SUBSESSION + " (Invisible Subsession) with " +
-                    "Method " + shortMethodName);
-        }
-    }
-
-    public static void checkIsThreadLogged() {
-        int threadId = getCallingThreadId();
-        Session threadSession = sSessionMapper.get(threadId);
-        if (threadSession == null) {
-            android.util.Log.e(LOGGING_TAG, "Logging Thread Check Failed!", new Exception());
-        }
-    }
-
-    /**
-     * Ends the current session/subsession. Must be called after a Log.startSession(...) and
-     * Log.continueSession(...) call.
-     */
-    public static synchronized void endSession() {
-        int threadId = getCallingThreadId();
-        Session completedSession = sSessionMapper.get(threadId);
-        if (completedSession == null) {
-            Log.w(LOGGING_TAG, "Log.endSession was called with no session active.");
-            return;
-        }
-
-        completedSession.markSessionCompleted(System.currentTimeMillis());
-        if(!completedSession.isStartedFromActiveSession()) {
-            Log.v(LOGGING_TAG, Session.END_SUBSESSION + " (dur: " +
-                    completedSession.getLocalExecutionTime() + " mS)");
-        } else {
-            Log.v(LOGGING_TAG, Session.END_SUBSESSION + " (Invisible Subsession) (dur: " +
-                    completedSession.getLocalExecutionTime() + " mS)");
-        }
-        // Remove after completed so that reference still exists for logging the end events
-        Session parentSession = completedSession.getParentSession();
-        sSessionMapper.remove(threadId);
-        endParentSessions(completedSession);
-        // If this subsession was started from a parent session using Log.startSession, return the
-        // ThreadID back to the parent after completion.
-        if (parentSession != null && !parentSession.isSessionCompleted() &&
-                completedSession.isStartedFromActiveSession()) {
-            sSessionMapper.put(threadId, parentSession);
-        }
-    }
-
-    // Recursively deletes all complete parent sessions of the current subsession if it is a leaf.
-    private static void endParentSessions(Session subsession) {
-        // Session is not completed or not currently a leaf, so we can not remove because a child is
-        // still running
-        if (!subsession.isSessionCompleted() || subsession.getChildSessions().size() != 0) {
-            return;
-        }
-
-        Session parentSession = subsession.getParentSession();
-        if (parentSession != null) {
-            subsession.setParentSession(null);
-            parentSession.removeChild(subsession);
-            endParentSessions(parentSession);
-        } else {
-            // All of the subsessions have been completed and it is time to report on the full
-            // running time of the session.
-            long fullSessionTimeMs =
-                    System.currentTimeMillis() - subsession.getExecutionStartTimeMilliseconds();
-            Analytics.addSessionTiming(subsession.getShortMethodName(), fullSessionTimeMs);
-            Log.v(LOGGING_TAG, Session.END_SESSION + " (dur: " + fullSessionTimeMs + " ms): " +
-                    subsession.toString());
-        }
-    }
-
-    private synchronized static String getNextSessionID() {
-        Integer nextId = sCodeEntryCounter++;
-        if (nextId >= SESSION_ID_ROLLOVER_THRESHOLD) {
-            restartSessionCounter();
-            nextId = sCodeEntryCounter++;
-        }
-        return getBase64Encoding(nextId);
-    }
-
-    @VisibleForTesting
-    public synchronized static void restartSessionCounter() {
-        sCodeEntryCounter = 0;
-    }
-
-    @VisibleForTesting
-    public static String getBase64Encoding(int number) {
-        byte[] idByteArray = ByteBuffer.allocate(4).putInt(number).array();
-        idByteArray = Arrays.copyOfRange(idByteArray, 2, 4);
-        return Base64.encodeToString(idByteArray, Base64.NO_WRAP | Base64.NO_PADDING);
-    }
-
-    public static int getCallingThreadId() {
-        return android.os.Process.myTid();
-    }
-
-    public static void event(Call call, String event) {
-        event(call, event, null);
-    }
-
-    public static void event(Call call, String event, Object data) {
-        Session currentSession = sSessionMapper.get(getCallingThreadId());
-        String currentSessionID = currentSession != null ? currentSession.toString() : "";
-
-        if (call == null) {
-            Log.i(TAG, "Non-call EVENT: %s, %s", event, data);
-            return;
-        }
-        synchronized (mCallEventRecords) {
-            if (!mCallEventRecordMap.containsKey(call)) {
-                CallEventRecord newRecord = new CallEventRecord(call);
-                addCallEventRecord(newRecord);
-            }
-
-            CallEventRecord record = mCallEventRecordMap.get(call);
-            record.addEvent(event, currentSessionID, data);
-        }
-    }
-
-    public static void event(Call call, String event, String format, Object... args) {
-        String msg;
-        try {
-            msg = (args == null || args.length == 0) ? format
-                    : String.format(Locale.US, format, args);
-        } catch (IllegalFormatException ife) {
-            e("Log", ife, "IllegalFormatException: formatString='%s' numArgs=%d", format,
-                    args.length);
-            msg = format + " (An error occurred while formatting the message.)";
-        }
-
-        event(call, event, msg);
-    }
-
-    @VisibleForTesting
-    public static synchronized void cleanupStaleSessions(long timeoutMs) {
-        String logMessage = "Stale Sessions Cleaned:\n";
-        boolean isSessionsStale = false;
-        long currentTimeMs = System.currentTimeMillis();
-        // Remove references that are in the Session Mapper (causing GC to occur) on
-        // sessions that are lasting longer than LOGGING_SESSION_TIMEOUT_MS.
-        // If this occurs, then there is most likely a Session active that never had
-        // Log.endSession called on it.
-        for (Iterator<ConcurrentHashMap.Entry<Integer, Session>> it =
-             sSessionMapper.entrySet().iterator(); it.hasNext(); ) {
-            ConcurrentHashMap.Entry<Integer, Session> entry = it.next();
-            Session session = entry.getValue();
-            if (currentTimeMs - session.getExecutionStartTimeMilliseconds() > timeoutMs) {
-                it.remove();
-                logMessage += session.printFullSessionTree() + "\n";
-                isSessionsStale = true;
-            }
-        }
-        if (isSessionsStale) {
-            Log.w(LOGGING_TAG, logMessage);
-        } else {
-            Log.v(LOGGING_TAG, "No stale logging sessions needed to be cleaned...");
-        }
-    }
-
-    private static void addCallEventRecord(CallEventRecord newRecord) {
-        Call call = newRecord.getCall();
-
-        // First remove the oldest entry if no new ones exist.
-        if (mCallEventRecords.remainingCapacity() == 0) {
-            CallEventRecord record = mCallEventRecords.poll();
-            if (record != null) {
-                mCallEventRecordMap.remove(record.getCall());
-            }
-        }
-
-        // Now add a new entry
-        mCallEventRecords.add(newRecord);
-        mCallEventRecordMap.put(call, newRecord);
-
-        // Register the events with Analytics
-        if (call.getAnalytics() != null) {
-            call.getAnalytics().setCallEvents(newRecord);
-        } else {
-            Log.w(LOGGING_TAG, "Call analytics is null");
-        }
-    }
-
-    /**
-     * If user enabled extended logging is enabled and the time limit has passed, disables the
-     * extended logging.
-     */
-    private static void maybeDisableLogging() {
-        if (!mIsUserExtendedLoggingEnabled) {
-            return;
-        }
-
-        if (mUserExtendedLoggingStopTime < System.currentTimeMillis()) {
-            mUserExtendedLoggingStopTime = 0;
-            mIsUserExtendedLoggingEnabled = false;
-        }
-    }
-
-    public static boolean isLoggable(int level) {
-        return FORCE_LOGGING || android.util.Log.isLoggable(TAG, level);
-    }
-
-    public static void d(String prefix, String format, Object... args) {
-        if (mIsUserExtendedLoggingEnabled) {
-            maybeDisableLogging();
-            systemLogger.i(TAG, buildMessage(prefix, format, args));
-        } else if (DEBUG) {
-            systemLogger.d(TAG, buildMessage(prefix, format, args));
-        }
-    }
-
-    public static void d(Object objectPrefix, String format, Object... args) {
-        if (mIsUserExtendedLoggingEnabled) {
-            maybeDisableLogging();
-            systemLogger.i(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
-        } else if (DEBUG) {
-            systemLogger.d(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
-        }
-    }
-
-    public static void i(String prefix, String format, Object... args) {
-        if (INFO) {
-            systemLogger.i(TAG, buildMessage(prefix, format, args));
-        }
-    }
-
-    public static void i(Object objectPrefix, String format, Object... args) {
-        if (INFO) {
-            systemLogger.i(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
-        }
-    }
-
-    public static void v(String prefix, String format, Object... args) {
-        if (mIsUserExtendedLoggingEnabled) {
-            maybeDisableLogging();
-            systemLogger.i(TAG, buildMessage(prefix, format, args));
-        } else if (VERBOSE) {
-            systemLogger.v(TAG, buildMessage(prefix, format, args));
-        }
-    }
-
-    public static void v(Object objectPrefix, String format, Object... args) {
-        if (mIsUserExtendedLoggingEnabled) {
-            maybeDisableLogging();
-            systemLogger.i(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
-        } else if (VERBOSE) {
-            systemLogger.v(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
-        }
-    }
-
-    public static void w(String prefix, String format, Object... args) {
-        if (WARN) {
-            systemLogger.w(TAG, buildMessage(prefix, format, args));
-        }
-    }
-
-    public static void w(Object objectPrefix, String format, Object... args) {
-        if (WARN) {
-            systemLogger.w(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args));
-        }
-    }
-
-    public static void e(String prefix, Throwable tr, String format, Object... args) {
-        if (ERROR) {
-            systemLogger.e(TAG, buildMessage(prefix, format, args), tr);
-        }
-    }
-
-    public static void e(Object objectPrefix, Throwable tr, String format, Object... args) {
-        if (ERROR) {
-            systemLogger.e(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args),
-                    tr);
-        }
-    }
-
-    public static void wtf(String prefix, Throwable tr, String format, Object... args) {
-        systemLogger.wtf(TAG, buildMessage(prefix, format, args), tr);
-    }
-
-    public static void wtf(Object objectPrefix, Throwable tr, String format, Object... args) {
-        systemLogger.wtf(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args),
-                tr);
-    }
-
-    public static void wtf(String prefix, String format, Object... args) {
-        String msg = buildMessage(prefix, format, args);
-        systemLogger.wtf(TAG, msg, new IllegalStateException(msg));
-    }
-
-    public static void wtf(Object objectPrefix, String format, Object... args) {
-        String msg = buildMessage(getPrefixFromObject(objectPrefix), format, args);
-        systemLogger.wtf(TAG, msg, new IllegalStateException(msg));
-    }
-
-    public static String piiHandle(Object pii) {
-        if (pii == null || VERBOSE) {
-            return String.valueOf(pii);
-        }
-
-        StringBuilder sb = new StringBuilder();
-        if (pii instanceof Uri) {
-            Uri uri = (Uri) pii;
-            String scheme = uri.getScheme();
-
-            if (!TextUtils.isEmpty(scheme)) {
-                sb.append(scheme).append(":");
-            }
-
-            String textToObfuscate = uri.getSchemeSpecificPart();
-            if (PhoneAccount.SCHEME_TEL.equals(scheme)) {
-                for (int i = 0; i < textToObfuscate.length(); i++) {
-                    char c = textToObfuscate.charAt(i);
-                    sb.append(PhoneNumberUtils.isDialable(c) ? "*" : c);
-                }
-            } else if (PhoneAccount.SCHEME_SIP.equals(scheme)) {
-                for (int i = 0; i < textToObfuscate.length(); i++) {
-                    char c = textToObfuscate.charAt(i);
-                    if (c != '@' && c != '.') {
-                        c = '*';
-                    }
-                    sb.append(c);
-                }
-            } else {
-                sb.append(pii(pii));
-            }
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Redact personally identifiable information for production users.
-     * If we are running in verbose mode, return the original string, otherwise
-     * return a SHA-1 hash of the input string.
-     */
-    public static String pii(Object pii) {
-        if (pii == null || VERBOSE) {
-            return String.valueOf(pii);
-        }
-        return "[" + secureHash(String.valueOf(pii).getBytes()) + "]";
-    }
-
-    public static void dumpCallEvents(IndentingPrintWriter pw) {
-        pw.println("Historical Calls:");
-        pw.increaseIndent();
-        for (CallEventRecord callEventRecord : mCallEventRecords) {
-            callEventRecord.dump(pw);
-        }
-        pw.decreaseIndent();
-    }
-
-    private static String secureHash(byte[] input) {
-        if (sMessageDigest != null) {
-            sMessageDigest.reset();
-            sMessageDigest.update(input);
-            byte[] result = sMessageDigest.digest();
-            return encodeHex(result);
-        } else {
-            return "Uninitialized SHA1";
-        }
-    }
-
-    private static String encodeHex(byte[] bytes) {
-        StringBuffer hex = new StringBuffer(bytes.length * 2);
-
-        for (int i = 0; i < bytes.length; i++) {
-            int byteIntValue = bytes[i] & 0xff;
-            if (byteIntValue < 0x10) {
-                hex.append("0");
-            }
-            hex.append(Integer.toString(byteIntValue, 16));
-        }
-
-        return hex.toString();
-    }
-
-    private static String getPrefixFromObject(Object obj) {
-        return obj == null ? "<null>" : obj.getClass().getSimpleName();
-    }
-
-    private static String buildMessage(String prefix, String format, Object... args) {
-        if (LOG_DBG) {
-            checkIsThreadLogged();
-        }
-        // Incorporate thread ID and calling method into prefix
-        String sessionPostfix = "";
-        Session currentSession = sSessionMapper.get(getCallingThreadId());
-        if (currentSession != null) {
-            sessionPostfix = ": " + currentSession.toString();
-        }
-
-        String msg;
-        try {
-            msg = (args == null || args.length == 0) ? format
-                    : String.format(Locale.US, format, args);
-        } catch (IllegalFormatException ife) {
-            e("Log", ife, "IllegalFormatException: formatString='%s' numArgs=%d", format,
-                    args.length);
-            msg = format + " (An error occurred while formatting the message.)";
-        }
-        return String.format(Locale.US, "%s: %s%s", prefix, msg, sessionPostfix);
-    }
-}
diff --git a/src/com/android/server/telecom/LogUtils.java b/src/com/android/server/telecom/LogUtils.java
new file mode 100644
index 0000000..69ba0ff
--- /dev/null
+++ b/src/com/android/server/telecom/LogUtils.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2016 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.server.telecom;
+
+import android.content.Context;
+import android.telecom.Logging.EventManager;
+import android.telecom.Logging.EventManager.TimedEventPair;
+
+/**
+ * Temporary location of new Logging class
+ */
+
+public class LogUtils {
+
+    private static final String TAG = "Telecom";
+    private static final String LOGUTILS_TAG = "LogUtils";
+
+    public static final boolean SYSTRACE_DEBUG = false; /* STOP SHIP if true */
+
+    public static final class Sessions {
+        public static final String ICA_ANSWER_CALL = "ICA.aC";
+        public static final String ICA_REJECT_CALL = "ICA.rC";
+        public static final String ICA_DISCONNECT_CALL = "ICA.dC";
+        public static final String ICA_HOLD_CALL = "ICA.hC";
+        public static final String ICA_UNHOLD_CALL = "ICA.uC";
+        public static final String ICA_MUTE = "ICA.m";
+        public static final String ICA_SET_AUDIO_ROUTE = "ICA.sAR";
+        public static final String ICA_CONFERENCE = "ICA.c";
+        public static final String CSW_HANDLE_CREATE_CONNECTION_COMPLETE = "CSW.hCCC";
+        public static final String CSW_SET_ACTIVE = "CSW.sA";
+        public static final String CSW_SET_RINGING = "CSW.sR";
+        public static final String CSW_SET_DIALING = "CSW.sD";
+        public static final String CSW_SET_PULLING = "CSW.sP";
+        public static final String CSW_SET_DISCONNECTED = "CSW.sDc";
+        public static final String CSW_SET_ON_HOLD = "CSW.sOH";
+        public static final String CSW_REMOVE_CALL = "CSW.rC";
+        public static final String CSW_SET_IS_CONFERENCED = "CSW.sIC";
+        public static final String CSW_ADD_CONFERENCE_CALL = "CSW.aCC";
+    }
+
+    public final static class Events {
+        public static final String CREATED = "CREATED";
+        public static final String DESTROYED = "DESTROYED";
+        public static final String SET_CONNECTING = "SET_CONNECTING";
+        public static final String SET_DIALING = "SET_DIALING";
+        public static final String SET_PULLING = "SET_PULLING";
+        public static final String SET_ACTIVE = "SET_ACTIVE";
+        public static final String SET_HOLD = "SET_HOLD";
+        public static final String SET_RINGING = "SET_RINGING";
+        public static final String SET_DISCONNECTED = "SET_DISCONNECTED";
+        public static final String SET_DISCONNECTING = "SET_DISCONNECTING";
+        public static final String SET_SELECT_PHONE_ACCOUNT = "SET_SELECT_PHONE_ACCOUNT";
+        public static final String REQUEST_HOLD = "REQUEST_HOLD";
+        public static final String REQUEST_UNHOLD = "REQUEST_UNHOLD";
+        public static final String REQUEST_DISCONNECT = "REQUEST_DISCONNECT";
+        public static final String REQUEST_ACCEPT = "REQUEST_ACCEPT";
+        public static final String REQUEST_REJECT = "REQUEST_REJECT";
+        public static final String START_DTMF = "START_DTMF";
+        public static final String STOP_DTMF = "STOP_DTMF";
+        public static final String START_RINGER = "START_RINGER";
+        public static final String STOP_RINGER = "STOP_RINGER";
+        public static final String START_VIBRATOR = "START_VIBRATOR";
+        public static final String STOP_VIBRATOR = "STOP_VIBRATOR";
+        public static final String SKIP_VIBRATION = "SKIP_VIBRATION";
+        public static final String SKIP_RINGING = "SKIP_RINGING";
+        public static final String START_CALL_WAITING_TONE = "START_CALL_WAITING_TONE";
+        public static final String STOP_CALL_WAITING_TONE = "STOP_CALL_WAITING_TONE";
+        public static final String START_CONNECTION = "START_CONNECTION";
+        public static final String BIND_CS = "BIND_CS";
+        public static final String CS_BOUND = "CS_BOUND";
+        public static final String CONFERENCE_WITH = "CONF_WITH";
+        public static final String SPLIT_FROM_CONFERENCE = "CONF_SPLIT";
+        public static final String SWAP = "SWAP";
+        public static final String ADD_CHILD = "ADD_CHILD";
+        public static final String REMOVE_CHILD = "REMOVE_CHILD";
+        public static final String SET_PARENT = "SET_PARENT";
+        public static final String MUTE = "MUTE";
+        public static final String UNMUTE = "UNMUTE";
+        public static final String AUDIO_ROUTE = "AUDIO_ROUTE";
+        public static final String AUDIO_ROUTE_EARPIECE = "AUDIO_ROUTE_EARPIECE";
+        public static final String AUDIO_ROUTE_HEADSET = "AUDIO_ROUTE_HEADSET";
+        public static final String AUDIO_ROUTE_BT = "AUDIO_ROUTE_BT";
+        public static final String AUDIO_ROUTE_SPEAKER = "AUDIO_ROUTE_SPEAKER";
+        public static final String ERROR_LOG = "ERROR";
+        public static final String USER_LOG_MARK = "USER_LOG_MARK";
+        public static final String SILENCE = "SILENCE";
+        public static final String BIND_SCREENING = "BIND_SCREENING";
+        public static final String SCREENING_BOUND = "SCREENING_BOUND";
+        public static final String SCREENING_SENT = "SCREENING_SENT";
+        public static final String SCREENING_COMPLETED = "SCREENING_COMPLETED";
+        public static final String BLOCK_CHECK_INITIATED = "BLOCK_CHECK_INITIATED";
+        public static final String BLOCK_CHECK_FINISHED = "BLOCK_CHECK_FINISHED";
+        public static final String DIRECT_TO_VM_INITIATED = "DIRECT_TO_VM_INITIATED";
+        public static final String DIRECT_TO_VM_FINISHED = "DIRECT_TO_VM_FINISHED";
+        public static final String FILTERING_INITIATED = "FILTERING_INITIATED";
+        public static final String FILTERING_COMPLETED = "FILTERING_COMPLETED";
+        public static final String FILTERING_TIMED_OUT = "FILTERING_TIMED_OUT";
+        public static final String REMOTELY_HELD = "REMOTELY_HELD";
+        public static final String REMOTELY_UNHELD = "REMOTELY_UNHELD";
+        public static final String REQUEST_PULL = "PULL";
+        public static final String INFO = "INFO";
+        public static final String VIDEO_STATE_CHANGED = "VIDEO_STATE_CHANGED";
+        public static final String RECEIVE_VIDEO_REQUEST = "RECEIVE_VIDEO_REQUEST";
+        public static final String RECEIVE_VIDEO_RESPONSE = "RECEIVE_VIDEO_RESPONSE";
+        public static final String SEND_VIDEO_REQUEST = "SEND_VIDEO_REQUEST";
+        public static final String SEND_VIDEO_RESPONSE = "SEND_VIDEO_RESPONSE";
+        public static final String IS_EXTERNAL = "IS_EXTERNAL";
+        public static final String PROPERTY_CHANGE = "PROPERTY_CHANGE";
+        public static final String CAPABILITY_CHANGE = "CAPABILITY_CHANGE";
+        public static final String CONNECTION_EVENT = "CONNECTION_EVENT";
+
+        public static class Timings {
+            public static final String ACCEPT_TIMING = "accept";
+            public static final String REJECT_TIMING = "reject";
+            public static final String DISCONNECT_TIMING = "disconnect";
+            public static final String HOLD_TIMING = "hold";
+            public static final String UNHOLD_TIMING = "unhold";
+            public static final String OUTGOING_TIME_TO_DIALING_TIMING = "outgoing_time_to_dialing";
+            public static final String BIND_CS_TIMING = "bind_cs";
+            public static final String SCREENING_COMPLETED_TIMING = "screening_completed";
+            public static final String DIRECT_TO_VM_FINISHED_TIMING = "direct_to_vm_finished";
+            public static final String BLOCK_CHECK_FINISHED_TIMING = "block_check_finished";
+            public static final String FILTERING_COMPLETED_TIMING = "filtering_completed";
+            public static final String FILTERING_TIMED_OUT_TIMING = "filtering_timed_out";
+
+            private static final TimedEventPair[] sTimedEvents = {
+                    new TimedEventPair(REQUEST_ACCEPT, SET_ACTIVE, ACCEPT_TIMING),
+                    new TimedEventPair(REQUEST_REJECT, SET_DISCONNECTED, REJECT_TIMING),
+                    new TimedEventPair(REQUEST_DISCONNECT, SET_DISCONNECTED, DISCONNECT_TIMING),
+                    new TimedEventPair(REQUEST_HOLD, SET_HOLD, HOLD_TIMING),
+                    new TimedEventPair(REQUEST_UNHOLD, SET_ACTIVE, UNHOLD_TIMING),
+                    new TimedEventPair(START_CONNECTION, SET_DIALING,
+                            OUTGOING_TIME_TO_DIALING_TIMING),
+                    new TimedEventPair(BIND_CS, CS_BOUND, BIND_CS_TIMING),
+                    new TimedEventPair(SCREENING_SENT, SCREENING_COMPLETED,
+                            SCREENING_COMPLETED_TIMING),
+                    new TimedEventPair(DIRECT_TO_VM_INITIATED, DIRECT_TO_VM_FINISHED,
+                            DIRECT_TO_VM_FINISHED_TIMING),
+                    new TimedEventPair(BLOCK_CHECK_INITIATED, BLOCK_CHECK_FINISHED,
+                            BLOCK_CHECK_FINISHED_TIMING),
+                    new TimedEventPair(FILTERING_INITIATED, FILTERING_COMPLETED,
+                            FILTERING_COMPLETED_TIMING),
+                    new TimedEventPair(FILTERING_INITIATED, FILTERING_TIMED_OUT,
+                            FILTERING_TIMED_OUT_TIMING, 6000L),
+            };
+        }
+    }
+
+    private static void eventRecordAdded(EventManager.EventRecord eventRecord) {
+        // Only Calls will be added as event records in this case
+        EventManager.Loggable recordEntry = eventRecord.getRecordEntry();
+        if (recordEntry instanceof Call) {
+            Call callRecordEntry = (Call) recordEntry;
+            android.telecom.Log.i(LOGUTILS_TAG, "EventRecord added as Call: " + callRecordEntry);
+            Analytics.CallInfo callInfo = callRecordEntry.getAnalytics();
+            if(callInfo != null) {
+                callInfo.setCallEvents(eventRecord);
+            } else {
+                android.telecom.Log.w(LOGUTILS_TAG, "Could not get Analytics CallInfo.");
+            }
+        } else {
+            android.telecom.Log.w(LOGUTILS_TAG, "Non-Call EventRecord Added.");
+        }
+    }
+
+    public static void initLogging(Context context) {
+        android.telecom.Log.setTag(TAG);
+        android.telecom.Log.setSessionContext(context);
+        android.telecom.Log.initMd5Sum();
+        for (EventManager.TimedEventPair p : Events.Timings.sTimedEvents) {
+            android.telecom.Log.addRequestResponsePair(p);
+        }
+        android.telecom.Log.registerEventListener(LogUtils::eventRecordAdded);
+        // Store analytics about recently completed Sessions.
+        android.telecom.Log.registerSessionListener(Analytics::addSessionTiming);
+    }
+}
diff --git a/src/com/android/server/telecom/MissedCallNotifier.java b/src/com/android/server/telecom/MissedCallNotifier.java
index 1125a8e..500122b 100644
--- a/src/com/android/server/telecom/MissedCallNotifier.java
+++ b/src/com/android/server/telecom/MissedCallNotifier.java
@@ -16,23 +16,82 @@
 
 package com.android.server.telecom;
 
+import android.net.Uri;
 import android.os.UserHandle;
+import android.telecom.PhoneAccountHandle;
+
+import com.android.internal.telephony.CallerInfo;
 
 /**
  * Creates a notification for calls that the user missed (neither answered nor rejected).
  */
 public interface MissedCallNotifier extends CallsManager.CallsManagerListener {
+    class CallInfoFactory {
+        public CallInfo makeCallInfo(CallerInfo callerInfo, PhoneAccountHandle phoneAccountHandle,
+                Uri handle, long creationTimeMillis) {
+            return new CallInfo(callerInfo, phoneAccountHandle, handle, creationTimeMillis);
+        }
+    }
+
+    class CallInfo {
+        private CallerInfo mCallerInfo;
+        private PhoneAccountHandle mPhoneAccountHandle;
+        private Uri mHandle;
+        private long mCreationTimeMillis;
+
+        public CallInfo(CallerInfo callerInfo, PhoneAccountHandle phoneAccountHandle, Uri handle,
+                long creationTimeMillis) {
+            mCallerInfo = callerInfo;
+            mPhoneAccountHandle = phoneAccountHandle;
+            mHandle = handle;
+            mCreationTimeMillis = creationTimeMillis;
+        }
+
+        public CallInfo(Call call) {
+            mCallerInfo = call.getCallerInfo();
+            mPhoneAccountHandle = call.getTargetPhoneAccount();
+            mHandle = call.getHandle();
+            mCreationTimeMillis = call.getCreationTimeMillis();
+        }
+
+        public CallerInfo getCallerInfo() {
+            return mCallerInfo;
+        }
+
+        public PhoneAccountHandle getPhoneAccountHandle() {
+            return mPhoneAccountHandle;
+        }
+
+        public Uri getHandle() {
+            return mHandle;
+        }
+
+        public String getHandleSchemeSpecificPart() {
+            return mHandle == null ? null : mHandle.getSchemeSpecificPart();
+        }
+
+        public long getCreationTimeMillis() {
+            return mCreationTimeMillis;
+        }
+
+        public String getPhoneNumber() {
+            return mCallerInfo == null ? null : mCallerInfo.phoneNumber;
+        }
+
+        public String getName() {
+            return mCallerInfo == null ? null : mCallerInfo.name;
+        }
+    }
 
     void clearMissedCalls(UserHandle userHandle);
 
-    void showMissedCallNotification(Call call);
+    void showMissedCallNotification(CallInfo call);
 
-    void reloadFromDatabase(
-            TelecomSystem.SyncRoot lock,
-            CallsManager callsManager,
-            ContactsAsyncHelper contactsAsyncHelper,
-            CallerInfoAsyncQueryFactory callerInfoAsyncQueryFactory,
-            UserHandle userHandle);
+    void reloadAfterBootComplete(CallerInfoLookupHelper callerInfoLookupHelper,
+            CallInfoFactory callInfoFactory);
+
+    void reloadFromDatabase(CallerInfoLookupHelper callerInfoLookupHelper,
+            CallInfoFactory callInfoFactory, UserHandle userHandle);
 
     void setCurrentUserHandle(UserHandle userHandle);
 }
diff --git a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
index 8b5604b..95ab7db 100644
--- a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java
@@ -27,6 +27,7 @@
 import android.os.Trace;
 import android.os.UserHandle;
 import android.telecom.GatewayInfo;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java
index ef09939..4fe6ed6 100644
--- a/src/com/android/server/telecom/PhoneAccountRegistrar.java
+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java
@@ -38,6 +38,7 @@
 import android.telecom.CallAudioState;
 import android.telecom.ConnectionService;
 import android.telecom.DefaultDialerManager;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.CarrierConfigManager;
@@ -133,6 +134,7 @@
     private final Context mContext;
     private final UserManager mUserManager;
     private final SubscriptionManager mSubscriptionManager;
+    private final DefaultDialerCache mDefaultDialerCache;
     private State mState;
     private UserHandle mCurrentUserHandle;
     private interface PhoneAccountRegistrarWriteLock {}
@@ -140,12 +142,13 @@
             new PhoneAccountRegistrarWriteLock() {};
 
     @VisibleForTesting
-    public PhoneAccountRegistrar(Context context) {
-        this(context, FILE_NAME);
+    public PhoneAccountRegistrar(Context context, DefaultDialerCache defaultDialerCache) {
+        this(context, FILE_NAME, defaultDialerCache);
     }
 
     @VisibleForTesting
-    public PhoneAccountRegistrar(Context context, String fileName) {
+    public PhoneAccountRegistrar(Context context, String fileName,
+            DefaultDialerCache defaultDialerCache) {
         // TODO: This file path is subject to change -- it is storing the phone account registry
         // state file in the path /data/system/users/0/, which is likely not correct in a
         // multi-user setting.
@@ -159,6 +162,7 @@
         mState = new State();
         mContext = context;
         mUserManager = UserManager.get(context);
+        mDefaultDialerCache = defaultDialerCache;
         mSubscriptionManager = SubscriptionManager.from(mContext);
         mCurrentUserHandle = Process.myUserHandle();
         read();
@@ -362,8 +366,8 @@
      */
     public PhoneAccountHandle getSimCallManager(UserHandle userHandle) {
         // Get the default dialer in case it has a connection manager associated with it.
-        String dialerPackage = DefaultDialerManager
-                .getDefaultDialerApplication(mContext, userHandle.getIdentifier());
+        String dialerPackage = mDefaultDialerCache
+                .getDefaultDialerApplication(userHandle.getIdentifier());
 
         // Check carrier config.
         ComponentName systemSimCallManagerComponent = getSystemSimCallManagerComponent();
@@ -444,6 +448,7 @@
      */
     public boolean enablePhoneAccount(PhoneAccountHandle accountHandle, boolean isEnabled) {
         PhoneAccount account = getPhoneAccountUnchecked(accountHandle);
+        Log.i(this, "Phone account %s %s.", accountHandle, isEnabled ? "enabled" : "disabled");
         if (account == null) {
             Log.w(this, "Could not find account to enable: " + accountHandle);
             return false;
@@ -639,9 +644,11 @@
         // Set defaults and replace based on the group Id.
         maybeReplaceOldAccount(account);
         // Reset enabled state to whatever the value was if the account was already registered,
-        // or _true_ if this is a SIM-based account.  All SIM-based accounts are always enabled.
+        // or _true_ if this is a SIM-based account.  All SIM-based accounts are always enabled,
+        // as are all self-managed phone accounts.
         account.setIsEnabled(
-                isEnabled || account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION));
+                isEnabled || account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)
+                || account.hasCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED));
 
         write();
         fireAccountsChanged();
@@ -1475,8 +1482,9 @@
                                 parser.next();
                                 userSerialNumberString = parser.getText();
                             } else if (parser.getName().equals(GROUP_ID)) {
-                                parser.next();
-                                groupId = parser.getText();
+                                if (parser.next() == XmlPullParser.TEXT) {
+                                    groupId = parser.getText();
+                                }
                             }
                         }
                         UserHandle userHandle = null;
diff --git a/src/com/android/server/telecom/PhoneStateBroadcaster.java b/src/com/android/server/telecom/PhoneStateBroadcaster.java
index 0781ca2..a44fc03 100644
--- a/src/com/android/server/telecom/PhoneStateBroadcaster.java
+++ b/src/com/android/server/telecom/PhoneStateBroadcaster.java
@@ -18,6 +18,7 @@
 
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.telecom.Log;
 import android.telephony.TelephonyManager;
 
 import com.android.internal.telephony.ITelephonyRegistry;
diff --git a/src/com/android/server/telecom/ProximitySensorManager.java b/src/com/android/server/telecom/ProximitySensorManager.java
index e53b1d5..a79c0ed 100644
--- a/src/com/android/server/telecom/ProximitySensorManager.java
+++ b/src/com/android/server/telecom/ProximitySensorManager.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.os.PowerManager;
+import android.telecom.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 
diff --git a/src/com/android/server/telecom/QuickResponseUtils.java b/src/com/android/server/telecom/QuickResponseUtils.java
index fd0dbd2..5f8269d 100644
--- a/src/com/android/server/telecom/QuickResponseUtils.java
+++ b/src/com/android/server/telecom/QuickResponseUtils.java
@@ -20,6 +20,7 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
+import android.telecom.Log;
 
 // TODO: Needed for move to system service: import com.android.internal.R;
 
diff --git a/src/com/android/server/telecom/RespondViaSmsManager.java b/src/com/android/server/telecom/RespondViaSmsManager.java
index 7609b08..6b2a39e 100644
--- a/src/com/android/server/telecom/RespondViaSmsManager.java
+++ b/src/com/android/server/telecom/RespondViaSmsManager.java
@@ -31,6 +31,7 @@
 import android.os.Looper;
 import android.os.Message;
 import android.telecom.Connection;
+import android.telecom.Log;
 import android.telecom.Response;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.SubscriptionManager;
diff --git a/src/com/android/server/telecom/RespondViaSmsSettings.java b/src/com/android/server/telecom/RespondViaSmsSettings.java
index f8aa568..2ea204a 100644
--- a/src/com/android/server/telecom/RespondViaSmsSettings.java
+++ b/src/com/android/server/telecom/RespondViaSmsSettings.java
@@ -20,6 +20,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.telecom.Log;
 import android.os.Bundle;
 import android.preference.EditTextPreference;
 import android.preference.Preference;
diff --git a/src/com/android/server/telecom/RingbackPlayer.java b/src/com/android/server/telecom/RingbackPlayer.java
index bfaf8a2..47b6dfe 100644
--- a/src/com/android/server/telecom/RingbackPlayer.java
+++ b/src/com/android/server/telecom/RingbackPlayer.java
@@ -17,6 +17,7 @@
 package com.android.server.telecom;
 
 import com.android.internal.util.Preconditions;
+import android.telecom.Log;
 
 /**
  * Plays ringback tones. Ringback is different from other tones because it operates as the current
diff --git a/src/com/android/server/telecom/Ringer.java b/src/com/android/server/telecom/Ringer.java
index ca40801..c6056fa 100644
--- a/src/com/android/server/telecom/Ringer.java
+++ b/src/com/android/server/telecom/Ringer.java
@@ -19,6 +19,7 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.content.Context;
+import android.telecom.Log;
 import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.net.Uri;
@@ -111,7 +112,7 @@
         }
 
         if (mInCallController.doesConnectedDialerSupportRinging()) {
-            Log.event(foregroundCall, Log.Events.SKIP_RINGING);
+            Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING);
             return isRingerAudible;
         }
 
@@ -121,9 +122,14 @@
             return false;
         }
 
+        // Don't ring/acquire focus if there is no ringtone
+        if (mRingtoneFactory.getRingtone(foregroundCall) == null) {
+            isRingerAudible = false;
+        }
+
         if (isRingerAudible) {
             mRingingCall = foregroundCall;
-            Log.event(foregroundCall, Log.Events.START_RINGER);
+            Log.addEvent(foregroundCall, LogUtils.Events.START_RINGER);
             // Because we wait until a contact info query to complete before processing a
             // call (for the purposes of direct-to-voicemail), the information about custom
             // ringtones should be available by the time this code executes. We can safely
@@ -139,7 +145,7 @@
                     VIBRATION_ATTRIBUTES);
             mIsVibrating = true;
         } else if (mIsVibrating) {
-            Log.event(foregroundCall, Log.Events.SKIP_VIBRATION, "already vibrating");
+            Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "already vibrating");
         }
 
         return isRingerAudible;
@@ -151,7 +157,7 @@
         }
 
         if (mInCallController.doesConnectedDialerSupportRinging()) {
-            Log.event(call, Log.Events.SKIP_RINGING);
+            Log.addEvent(call, LogUtils.Events.SKIP_RINGING);
             return;
         }
 
@@ -160,7 +166,7 @@
         stopRinging();
 
         if (mCallWaitingPlayer == null) {
-            Log.event(call, Log.Events.START_CALL_WAITING_TONE);
+            Log.addEvent(call, LogUtils.Events.START_CALL_WAITING_TONE);
             mCallWaitingCall = call;
             mCallWaitingPlayer =
                     mPlayerFactory.createPlayer(InCallTonePlayer.TONE_CALL_WAITING);
@@ -170,14 +176,14 @@
 
     public void stopRinging() {
         if (mRingingCall != null) {
-            Log.event(mRingingCall, Log.Events.STOP_RINGER);
+            Log.addEvent(mRingingCall, LogUtils.Events.STOP_RINGER);
             mRingingCall = null;
         }
 
         mRingtonePlayer.stop();
 
         if (mIsVibrating) {
-            Log.event(mVibratingCall, Log.Events.STOP_VIBRATOR);
+            Log.addEvent(mVibratingCall, LogUtils.Events.STOP_VIBRATOR);
             mVibrator.cancel();
             mIsVibrating = false;
             mVibratingCall = null;
@@ -188,7 +194,7 @@
         Log.v(this, "stop call waiting.");
         if (mCallWaitingPlayer != null) {
             if (mCallWaitingCall != null) {
-                Log.event(mCallWaitingCall, Log.Events.STOP_CALL_WAITING_TONE);
+                Log.addEvent(mCallWaitingCall, LogUtils.Events.STOP_CALL_WAITING_TONE);
                 mCallWaitingCall = null;
             }
 
@@ -220,12 +226,12 @@
         // Technically this should be in the calling method, but it seemed a little odd to pass
         // around a whole bunch of state just for logging purposes.
         if (shouldVibrate) {
-            Log.event(call, Log.Events.START_VIBRATOR,
+            Log.addEvent(call, LogUtils.Events.START_VIBRATOR,
                     "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b",
                     mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(context),
                     ringerMode, mIsVibrating);
         } else {
-            Log.event(call, Log.Events.SKIP_VIBRATION,
+            Log.addEvent(call, LogUtils.Events.SKIP_VIBRATION,
                     "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b",
                     mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(context),
                     ringerMode, mIsVibrating);
diff --git a/src/com/android/server/telecom/RingtoneFactory.java b/src/com/android/server/telecom/RingtoneFactory.java
index 5e4fe9d..b14e1ab 100644
--- a/src/com/android/server/telecom/RingtoneFactory.java
+++ b/src/com/android/server/telecom/RingtoneFactory.java
@@ -26,6 +26,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.Settings;
+
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.text.TextUtils;
 
@@ -65,9 +67,18 @@
         if(ringtone == null) {
             // Contact didn't specify ringtone or custom Ringtone creation failed. Get default
             // ringtone for user or profile.
-            ringtone = RingtoneManager.getRingtone(
-                    hasDefaultRingtoneForUser(userContext) ? userContext : mContext,
-                    Settings.System.DEFAULT_RINGTONE_URI);
+            Context contextToUse = hasDefaultRingtoneForUser(userContext) ? userContext : mContext;
+            Uri defaultRingtoneUri;
+            if (UserManager.get(contextToUse).isUserUnlocked(contextToUse.getUserId())) {
+                defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,
+                        RingtoneManager.TYPE_RINGTONE);
+            } else {
+                defaultRingtoneUri = Settings.System.DEFAULT_RINGTONE_URI;
+            }
+            if (defaultRingtoneUri == null) {
+                return null;
+            }
+            ringtone = RingtoneManager.getRingtone(contextToUse, defaultRingtoneUri);
         }
         if (ringtone != null) {
             ringtone.setStreamType(AudioManager.STREAM_RING);
diff --git a/src/com/android/server/telecom/Runnable.java b/src/com/android/server/telecom/Runnable.java
deleted file mode 100644
index c7ace72..0000000
--- a/src/com/android/server/telecom/Runnable.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2016 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.server.telecom;
-
-/**
- * Encapsulates session logging in a Runnable to reduce code duplication when continuing subsessions
- * in a handler/thread.
- */
-public abstract class Runnable {
-
-    private Session mSubsession;
-    private final String mSubsessionName;
-    private final Object mLock;
-    private final java.lang.Runnable mRunnable = new java.lang.Runnable() {
-            @Override
-            public void run() {
-                synchronized (mLock) {
-                    try {
-                        Log.continueSession(mSubsession, mSubsessionName);
-                        loggedRun();
-                    } finally {
-                        if (mSubsession != null) {
-                            Log.endSession();
-                            mSubsession = null;
-                        }
-                    }
-                }
-            }
-        };
-
-    /**
-     * Creates a new Telecom Runnable that incorporates Session Logging into it. Useful for carrying
-     * Logging Sessions through different threads as well as through handlers.
-     * @param subsessionName The name that will be used in the Logs to mark this Session
-     * @param lock The synchronization lock that will be used to lock loggedRun().
-     */
-    public Runnable(String subsessionName, Object lock) {
-        if (lock == null) {
-            mLock = new Object();
-        } else {
-            mLock = lock;
-        }
-        mSubsessionName = subsessionName;
-    }
-
-    /**
-     * Return the runnable that will be canceled in the handler queue.
-     * @return Runnable object to cancel.
-     */
-    public final java.lang.Runnable getRunnableToCancel() {
-        return mRunnable;
-    }
-
-    /**
-     * Creates a Runnable and a logging subsession that can be used in a handler/thread. Be sure to
-     * call cancel() if this session is never going to be run (removed from a handler queue, for
-     * for example).
-     * @return A Java Runnable that can be used in a handler queue or thread.
-     */
-    public java.lang.Runnable prepare() {
-        cancel();
-        mSubsession = Log.createSubsession();
-        return mRunnable;
-    }
-
-    /**
-     * This method is used to clean up the active session if the Runnable gets removed from a
-     * handler and is never run.
-     */
-    public void cancel() {
-        synchronized (mLock) {
-            Log.cancelSubsession(mSubsession);
-            mSubsession = null;
-        }
-    }
-
-    /**
-     * The method that will be run in the handler/thread. This method will be called with mLock
-     * held.
-     */
-    abstract public void loggedRun();
-
-}
diff --git a/src/com/android/server/telecom/ServiceBinder.java b/src/com/android/server/telecom/ServiceBinder.java
index 05f0bcb..5a1ae02 100644
--- a/src/com/android/server/telecom/ServiceBinder.java
+++ b/src/com/android/server/telecom/ServiceBinder.java
@@ -22,6 +22,7 @@
 import android.content.ServiceConnection;
 import android.os.IBinder;
 import android.os.UserHandle;
+import android.telecom.Log;
 import android.text.TextUtils;
 import android.util.ArraySet;
 
@@ -82,7 +83,7 @@
                 Intent serviceIntent = new Intent(mServiceAction).setComponent(mComponentName);
                 ServiceConnection connection = new ServiceBinderConnection(call);
 
-                Log.event(call, Log.Events.BIND_CS, mComponentName);
+                Log.addEvent(call, LogUtils.Events.BIND_CS, mComponentName);
                 final int bindingFlags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE;
                 final boolean isBound;
                 if (mUserHandle != null) {
@@ -120,7 +121,7 @@
                 synchronized (mLock) {
                     Log.i(this, "Service bound %s", componentName);
 
-                    Log.event(mCall, Log.Events.CS_BOUND, componentName);
+                    Log.addEvent(mCall, LogUtils.Events.CS_BOUND, componentName);
                     mCall = null;
 
                     // Unbind request was queued so unbind immediately.
diff --git a/src/com/android/server/telecom/Session.java b/src/com/android/server/telecom/Session.java
deleted file mode 100644
index 51ef0fa..0000000
--- a/src/com/android/server/telecom/Session.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (C) 2015 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.server.telecom;
-
-import android.annotation.NonNull;
-
-import java.util.ArrayList;
-
-/**
- * The session that stores information about a thread's point of entry into the Telecom code that
- * persists until the thread exits Telecom.
- */
-public class Session {
-
-    public static final String START_SESSION = "START_SESSION";
-    public static final String CREATE_SUBSESSION = "CREATE_SUBSESSION";
-    public static final String CONTINUE_SUBSESSION = "CONTINUE_SUBSESSION";
-    public static final String END_SUBSESSION = "END_SUBSESSION";
-    public static final String END_SESSION = "END_SESSION";
-
-    public static final int UNDEFINED = -1;
-
-    private String mSessionId;
-    private String mShortMethodName;
-    private long mExecutionStartTimeMs;
-    private long mExecutionEndTimeMs = UNDEFINED;
-    private Session mParentSession;
-    private ArrayList<Session> mChildSessions;
-    private boolean mIsCompleted = false;
-    private int mChildCounter = 0;
-    // True if this is a subsession that has been started from the same thread as the parent
-    // session. This can happen if Log.startSession(...) is called multiple times on the same
-    // thread in the case of one Telecom entry point method calling another entry point method.
-    // In this case, we can just make this subsession "invisible," but still keep track of it so
-    // that the Log.endSession() calls match up.
-    private boolean mIsStartedFromActiveSession = false;
-    // Optionally provided info about the method/class/component that started the session in order
-    // to make Logging easier. This info will be provided in parentheses along with the session.
-    private String mOwnerInfo;
-
-    public Session(String sessionId, String shortMethodName, long startTimeMs, long threadID,
-            boolean isStartedFromActiveSession, String ownerInfo) {
-        setSessionId(sessionId);
-        setShortMethodName(shortMethodName);
-        mExecutionStartTimeMs = startTimeMs;
-        mParentSession = null;
-        mChildSessions = new ArrayList<>(5);
-        mIsStartedFromActiveSession = isStartedFromActiveSession;
-        mOwnerInfo = ownerInfo;
-    }
-
-    public void setSessionId(@NonNull String sessionId) {
-       if(sessionId == null) {
-           mSessionId = "?";
-       }
-       mSessionId = sessionId;
-    }
-
-    public String getShortMethodName() {
-        return mShortMethodName;
-    }
-
-    public void setShortMethodName(String shortMethodName) {
-        if(shortMethodName == null) {
-            shortMethodName = "";
-        }
-        mShortMethodName = shortMethodName;
-    }
-
-    public void setParentSession(Session parentSession) {
-        mParentSession = parentSession;
-    }
-
-    public void addChild(Session childSession) {
-        if(childSession != null) {
-            mChildSessions.add(childSession);
-        }
-    }
-
-    public void removeChild(Session child) {
-        if(child != null) {
-            mChildSessions.remove(child);
-        }
-    }
-
-    public long getExecutionStartTimeMilliseconds() {
-        return mExecutionStartTimeMs;
-    }
-
-    public void setExecutionStartTimeMs(long startTimeMs) {
-        mExecutionStartTimeMs = startTimeMs;
-    }
-
-    public Session getParentSession() {
-        return mParentSession;
-    }
-
-    public ArrayList<Session> getChildSessions() {
-        return mChildSessions;
-    }
-
-    public boolean isSessionCompleted() {
-        return mIsCompleted;
-    }
-
-    public boolean isStartedFromActiveSession() {
-        return mIsStartedFromActiveSession;
-    }
-
-    // Mark this session complete. This will be deleted by Log when all subsessions are complete
-    // as well.
-    public void markSessionCompleted(long executionEndTimeMs) {
-        mExecutionEndTimeMs = executionEndTimeMs;
-        mIsCompleted = true;
-    }
-
-    public long getLocalExecutionTime() {
-        if(mExecutionEndTimeMs == UNDEFINED) {
-            return UNDEFINED;
-        }
-        return mExecutionEndTimeMs - mExecutionStartTimeMs;
-    }
-
-    public synchronized String getNextChildId() {
-        return String.valueOf(mChildCounter++);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (!(obj instanceof Session)) {
-            return false;
-        }
-        if (obj == this) {
-            return true;
-        }
-        Session otherSession = (Session) obj;
-        return (mSessionId.equals(otherSession.mSessionId)) &&
-                (mShortMethodName.equals(otherSession.mShortMethodName)) &&
-                mExecutionStartTimeMs == otherSession.mExecutionStartTimeMs &&
-                mParentSession == otherSession.mParentSession &&
-                mChildSessions.equals(otherSession.mChildSessions) &&
-                mIsCompleted == otherSession.mIsCompleted &&
-                mExecutionEndTimeMs == otherSession.mExecutionEndTimeMs &&
-                mChildCounter == otherSession.mChildCounter &&
-                mIsStartedFromActiveSession == otherSession.mIsStartedFromActiveSession &&
-                mOwnerInfo == otherSession.mOwnerInfo;
-    }
-
-    // Builds full session id recursively
-    private String getFullSessionId() {
-        // Cache mParentSession locally to prevent a concurrency problem where
-        // Log.endParentSessions() is called while a logging statement is running (Log.i, for
-        // example) and setting mParentSession to null in a different thread after the null check
-        // occurred.
-        Session parentSession = mParentSession;
-        if(parentSession == null) {
-            return mSessionId;
-        } else {
-            return parentSession.getFullSessionId() + "_" + mSessionId;
-        }
-    }
-
-    // Print out the full Session tree from any subsession node
-    public String printFullSessionTree() {
-        // Get to the top of the tree
-        Session topNode = this;
-        while(topNode.getParentSession() != null) {
-            topNode = topNode.getParentSession();
-        }
-        return topNode.printSessionTree();
-    }
-
-    // Recursively move down session tree using DFS, but print out each node when it is reached.
-    public String printSessionTree() {
-        StringBuilder sb = new StringBuilder();
-        printSessionTree(0, sb);
-        return sb.toString();
-    }
-
-    private void printSessionTree(int tabI, StringBuilder sb) {
-        sb.append(toString());
-        for (Session child : mChildSessions) {
-            sb.append("\n");
-            for(int i = 0; i <= tabI; i++) {
-                sb.append("\t");
-            }
-            child.printSessionTree(tabI + 1, sb);
-        }
-    }
-
-    @Override
-    public String toString() {
-        if(mParentSession != null && mIsStartedFromActiveSession) {
-            // Log.startSession was called from within another active session. Use the parent's
-            // Id instead of the child to reduce confusion.
-            return mParentSession.toString();
-        } else {
-            StringBuilder methodName = new StringBuilder();
-            methodName.append(mShortMethodName);
-            if(mOwnerInfo != null && !mOwnerInfo.isEmpty()) {
-                methodName.append("(InCall package: ");
-                methodName.append(mOwnerInfo);
-                methodName.append(")");
-            }
-            return methodName.toString() + "@" + getFullSessionId();
-        }
-    }
-}
diff --git a/src/com/android/server/telecom/StatusBarNotifier.java b/src/com/android/server/telecom/StatusBarNotifier.java
index d8ede59..af3493e 100644
--- a/src/com/android/server/telecom/StatusBarNotifier.java
+++ b/src/com/android/server/telecom/StatusBarNotifier.java
@@ -18,6 +18,7 @@
 
 import android.app.StatusBarManager;
 import android.content.Context;
+import android.telecom.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 
diff --git a/src/com/android/server/telecom/SystemStateProvider.java b/src/com/android/server/telecom/SystemStateProvider.java
index 0b636cf..e1938b1 100644
--- a/src/com/android/server/telecom/SystemStateProvider.java
+++ b/src/com/android/server/telecom/SystemStateProvider.java
@@ -22,6 +22,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Configuration;
+import android.telecom.Log;
 
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
diff --git a/src/com/android/server/telecom/TelecomBroadcastIntentProcessor.java b/src/com/android/server/telecom/TelecomBroadcastIntentProcessor.java
index c5db6de..60bfe16 100644
--- a/src/com/android/server/telecom/TelecomBroadcastIntentProcessor.java
+++ b/src/com/android/server/telecom/TelecomBroadcastIntentProcessor.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.UserHandle;
+import android.telecom.Log;
 
 public final class TelecomBroadcastIntentProcessor {
     /** The action used to send SMS response for the missed call notification. */
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index c93a752..2b03539 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -37,8 +37,9 @@
 import android.os.Bundle;
 import android.os.Process;
 import android.os.UserHandle;
-import android.os.UserManager;
 import android.telecom.DefaultDialerManager;
+import android.telecom.Log;
+import android.telecom.ParcelableCallAnalytics;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomAnalytics;
@@ -56,6 +57,7 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -63,34 +65,6 @@
  * Implementation of the ITelecom interface.
  */
 public class TelecomServiceImpl {
-    public interface DefaultDialerManagerAdapter {
-        String getDefaultDialerApplication(Context context);
-        String getDefaultDialerApplication(Context context, int userId);
-        boolean setDefaultDialerApplication(Context context, String packageName);
-        boolean isDefaultOrSystemDialer(Context context, String packageName);
-    }
-
-    static class DefaultDialerManagerAdapterImpl implements DefaultDialerManagerAdapter {
-        @Override
-        public String getDefaultDialerApplication(Context context) {
-            return DefaultDialerManager.getDefaultDialerApplication(context);
-        }
-
-        @Override
-        public String getDefaultDialerApplication(Context context, int userId) {
-            return DefaultDialerManager.getDefaultDialerApplication(context, userId);
-        }
-
-        @Override
-        public boolean setDefaultDialerApplication(Context context, String packageName) {
-            return DefaultDialerManager.setDefaultDialerApplication(context, packageName);
-        }
-
-        @Override
-        public boolean isDefaultOrSystemDialer(Context context, String packageName) {
-            return DefaultDialerManager.isDefaultOrSystemDialer(context, packageName);
-        }
-    }
 
     public interface SubscriptionManagerAdapter {
         int getDefaultVoiceSubId();
@@ -377,6 +351,9 @@
                     try {
                         enforcePhoneAccountModificationForPackage(
                                 account.getAccountHandle().getComponentName().getPackageName());
+                        if (account.hasCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED)) {
+                            enforceRegisterSelfManaged();
+                        }
                         if (account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
                             enforceRegisterSimSubscriptionPermission();
                         }
@@ -616,7 +593,8 @@
                 Log.startSession("TSI.gDDP");
                 final long token = Binder.clearCallingIdentity();
                 try {
-                    return mDefaultDialerManagerAdapter.getDefaultDialerApplication(mContext);
+                    return mDefaultDialerCache.getDefaultDialerApplication(
+                            ActivityManager.getCurrentUser());
                 } finally {
                     Binder.restoreCallingIdentity(token);
                 }
@@ -1121,9 +1099,8 @@
                 synchronized (mLock) {
                     long token = Binder.clearCallingIdentity();
                     try {
-                        final boolean result =
-                                mDefaultDialerManagerAdapter
-                                        .setDefaultDialerApplication(mContext, packageName);
+                        final boolean result = mDefaultDialerCache.setDefaultDialer(
+                                packageName, ActivityManager.getCurrentUser());
                         if (result) {
                             final Intent intent =
                                     new Intent(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED);
@@ -1194,7 +1171,7 @@
                 pw.decreaseIndent();
             }
 
-            Log.dumpCallEvents(pw);
+            Log.dumpEvents(pw);
         }
 
         /**
@@ -1204,17 +1181,61 @@
         public Intent createManageBlockedNumbersIntent() {
             return BlockedNumbersActivity.getIntentForStartingActivity();
         }
+
+        /**
+         * @see android.telecom.TelecomManager#isIncomingCallPermitted(PhoneAccountHandle)
+         */
+        @Override
+        public boolean isIncomingCallPermitted(PhoneAccountHandle phoneAccountHandle) {
+            try {
+                Log.startSession("TSI.iICP");
+                enforcePermission(android.Manifest.permission.MANAGE_OWN_CALLS);
+                synchronized (mLock) {
+                    long token = Binder.clearCallingIdentity();
+                    try {
+                        // TODO(3pcalls) - Implement body.
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+            } finally {
+                Log.endSession();
+            }
+            return true;
+        }
+
+        /**
+         * @see android.telecom.TelecomManager#isOutgoingCallPermitted(PhoneAccountHandle)
+         */
+        @Override
+        public boolean isOutgoingCallPermitted(PhoneAccountHandle phoneAccountHandle) {
+            try {
+                Log.startSession("TSI.iOCP");
+                enforcePermission(android.Manifest.permission.MANAGE_OWN_CALLS);
+                synchronized (mLock) {
+                    long token = Binder.clearCallingIdentity();
+                    try {
+                        // TODO(3pcalls) - Implement body.
+                    } finally {
+                        Binder.restoreCallingIdentity(token);
+                    }
+                }
+            } finally {
+                Log.endSession();
+            }
+
+            return true;
+        }
     };
 
     private Context mContext;
     private AppOpsManager mAppOpsManager;
-    private UserManager mUserManager;
     private PackageManager mPackageManager;
     private CallsManager mCallsManager;
     private final PhoneAccountRegistrar mPhoneAccountRegistrar;
     private final CallIntentProcessor.Adapter mCallIntentProcessorAdapter;
     private final UserCallIntentProcessorFactory mUserCallIntentProcessorFactory;
-    private final DefaultDialerManagerAdapter mDefaultDialerManagerAdapter;
+    private final DefaultDialerCache mDefaultDialerCache;
     private final SubscriptionManagerAdapter mSubscriptionManagerAdapter;
     private final TelecomSystem.SyncRoot mLock;
 
@@ -1224,20 +1245,19 @@
             PhoneAccountRegistrar phoneAccountRegistrar,
             CallIntentProcessor.Adapter callIntentProcessorAdapter,
             UserCallIntentProcessorFactory userCallIntentProcessorFactory,
-            DefaultDialerManagerAdapter defaultDialerManagerAdapter,
+            DefaultDialerCache defaultDialerCache,
             SubscriptionManagerAdapter subscriptionManagerAdapter,
             TelecomSystem.SyncRoot lock) {
         mContext = context;
         mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
 
-        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
         mPackageManager = mContext.getPackageManager();
 
         mCallsManager = callsManager;
         mLock = lock;
         mPhoneAccountRegistrar = phoneAccountRegistrar;
         mUserCallIntentProcessorFactory = userCallIntentProcessorFactory;
-        mDefaultDialerManagerAdapter = defaultDialerManagerAdapter;
+        mDefaultDialerCache = defaultDialerCache;
         mCallIntentProcessorAdapter = callIntentProcessorAdapter;
         mSubscriptionManagerAdapter = subscriptionManagerAdapter;
     }
@@ -1379,6 +1399,10 @@
         mContext.enforceCallingOrSelfPermission(permission, null);
     }
 
+    private void enforceRegisterSelfManaged() {
+        mContext.enforceCallingPermission(android.Manifest.permission.MANAGE_OWN_CALLS, null);
+    }
+
     private void enforceRegisterMultiUser() {
         if (!isCallerSystemApp()) {
             throw new SecurityException("CAPABILITY_MULTI_USER is only available to system apps.");
@@ -1466,7 +1490,8 @@
 
     private boolean isPrivilegedDialerCalling(String callingPackage) {
         mAppOpsManager.checkPackage(Binder.getCallingUid(), callingPackage);
-        return mDefaultDialerManagerAdapter.isDefaultOrSystemDialer(mContext, callingPackage);
+        return mDefaultDialerCache.isDefaultOrSystemDialer(
+                callingPackage, Binder.getCallingUserHandle().getIdentifier());
     }
 
     private TelephonyManager getTelephonyManager() {
diff --git a/src/com/android/server/telecom/TelecomSystem.java b/src/com/android/server/telecom/TelecomSystem.java
index 24d925d..5c95fb0 100644
--- a/src/com/android/server/telecom/TelecomSystem.java
+++ b/src/com/android/server/telecom/TelecomSystem.java
@@ -17,12 +17,14 @@
 package com.android.server.telecom;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.telecom.bluetooth.BluetoothDeviceManager;
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
 import com.android.server.telecom.components.UserCallIntentProcessor;
 import com.android.server.telecom.components.UserCallIntentProcessorFactory;
 import com.android.server.telecom.ui.MissedCallNotifierImpl.MissedCallNotifierImplFactory;
 import com.android.server.telecom.BluetoothPhoneServiceImpl.BluetoothPhoneServiceImplFactory;
 import com.android.server.telecom.CallAudioManager.AudioServiceFactory;
-import com.android.server.telecom.TelecomServiceImpl.DefaultDialerManagerAdapter;
+import com.android.server.telecom.DefaultDialerCache.DefaultDialerManagerAdapter;
 
 import android.Manifest;
 import android.content.BroadcastReceiver;
@@ -31,6 +33,7 @@
 import android.content.IntentFilter;
 import android.net.Uri;
 import android.os.UserHandle;
+import android.telecom.Log;
 
 import java.io.FileNotFoundException;
 import java.io.InputStream;
@@ -38,7 +41,7 @@
 /**
  * Top-level Application class for Telecom.
  */
-public final class TelecomSystem {
+public class TelecomSystem {
 
     /**
      * This interface is implemented by system-instantiated components (e.g., Services and
@@ -68,6 +71,9 @@
     private static final IntentFilter USER_STARTING_FILTER =
             new IntentFilter(Intent.ACTION_USER_STARTING);
 
+    private static final IntentFilter BOOT_COMPLETE_FILTER =
+            new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
+
     /** Intent filter for dialer secret codes. */
     private static final IntentFilter DIALER_SECRET_CODE_FILTER;
 
@@ -102,15 +108,19 @@
     private final ContactsAsyncHelper mContactsAsyncHelper;
     private final DialerCodeReceiver mDialerCodeReceiver;
 
+    private boolean mIsBootComplete = false;
+
     private final BroadcastReceiver mUserSwitchedReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             Log.startSession("TSSwR.oR");
             try {
-                int userHandleId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
-                UserHandle currentUserHandle = new UserHandle(userHandleId);
-                mPhoneAccountRegistrar.setCurrentUserHandle(currentUserHandle);
-                mCallsManager.onUserSwitch(currentUserHandle);
+                synchronized (mLock) {
+                    int userHandleId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
+                    UserHandle currentUserHandle = new UserHandle(userHandleId);
+                    mPhoneAccountRegistrar.setCurrentUserHandle(currentUserHandle);
+                    mCallsManager.onUserSwitch(currentUserHandle);
+                }
             } finally {
                 Log.endSession();
             }
@@ -122,9 +132,26 @@
         public void onReceive(Context context, Intent intent) {
             Log.startSession("TSStR.oR");
             try {
-                int userHandleId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
-                UserHandle addingUserHandle = new UserHandle(userHandleId);
-                mCallsManager.onUserStarting(addingUserHandle);
+                synchronized (mLock) {
+                    int userHandleId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
+                    UserHandle addingUserHandle = new UserHandle(userHandleId);
+                    mCallsManager.onUserStarting(addingUserHandle);
+                }
+            } finally {
+                Log.endSession();
+            }
+        }
+    };
+
+    private final BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.startSession("TSBCR.oR");
+            try {
+                synchronized (mLock) {
+                    mIsBootComplete = true;
+                    mCallsManager.onBootCompleted();
+                }
             } finally {
                 Log.endSession();
             }
@@ -137,7 +164,7 @@
 
     public static void setInstance(TelecomSystem instance) {
         if (INSTANCE != null) {
-            throw new RuntimeException("Attempt to set TelecomSystem.INSTANCE twice");
+            Log.w("TelecomSystem", "Attempt to set TelecomSystem.INSTANCE twice");
         }
         Log.i(TelecomSystem.class, "TelecomSystem.INSTANCE being set");
         INSTANCE = instance;
@@ -158,11 +185,15 @@
             PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
             InterruptionFilterProxy interruptionFilterProxy) {
         mContext = context.getApplicationContext();
-        Log.setContext(mContext);
-        Log.initMd5Sum();
+        LogUtils.initLogging(mContext);
+        DefaultDialerManagerAdapter defaultDialerAdapter =
+                new DefaultDialerCache.DefaultDialerManagerAdapterImpl();
+
+        DefaultDialerCache defaultDialerCache = new DefaultDialerCache(mContext,
+                defaultDialerAdapter, mLock);
 
         Log.startSession("TS.init");
-        mPhoneAccountRegistrar = new PhoneAccountRegistrar(mContext);
+        mPhoneAccountRegistrar = new PhoneAccountRegistrar(mContext, defaultDialerCache);
         mContactsAsyncHelper = new ContactsAsyncHelper(
                 new ContactsAsyncHelper.ContentResolverAdapter() {
                     @Override
@@ -171,17 +202,15 @@
                         return context.getContentResolver().openInputStream(uri);
                     }
                 });
-        BluetoothManager bluetoothManager = new BluetoothManager(mContext,
-                new BluetoothAdapterProxy());
+        BluetoothDeviceManager bluetoothDeviceManager = new BluetoothDeviceManager(mContext,
+                new BluetoothAdapterProxy(), mLock);
+        BluetoothRouteManager bluetoothRouteManager = new BluetoothRouteManager(mContext, mLock,
+                bluetoothDeviceManager, new Timeouts.Adapter());
         WiredHeadsetManager wiredHeadsetManager = new WiredHeadsetManager(mContext);
         SystemStateProvider systemStateProvider = new SystemStateProvider(mContext);
 
         mMissedCallNotifier = missedCallNotifierImplFactory
-                .makeMissedCallNotifierImpl(mContext, mPhoneAccountRegistrar,
-                        phoneNumberUtilsAdapter);
-
-        DefaultDialerManagerAdapter defaultDialerAdapter =
-                new TelecomServiceImpl.DefaultDialerManagerAdapterImpl();
+                .makeMissedCallNotifierImpl(mContext, mPhoneAccountRegistrar, defaultDialerCache);
 
         mCallsManager = new CallsManager(
                 mContext,
@@ -194,10 +223,10 @@
                 proximitySensorManagerFactory,
                 inCallWakeLockControllerFactory,
                 audioServiceFactory,
-                bluetoothManager,
+                bluetoothRouteManager,
                 wiredHeadsetManager,
                 systemStateProvider,
-                defaultDialerAdapter,
+                defaultDialerCache,
                 timeoutsAdapter,
                 asyncRingtonePlayer,
                 phoneNumberUtilsAdapter,
@@ -208,6 +237,7 @@
 
         mContext.registerReceiver(mUserSwitchedReceiver, USER_SWITCHED_FILTER);
         mContext.registerReceiver(mUserStartingReceiver, USER_STARTING_FILTER);
+        mContext.registerReceiver(mBootCompletedReceiver, BOOT_COMPLETE_FILTER);
 
         mBluetoothPhoneServiceImpl = bluetoothPhoneServiceImplFactory.makeBluetoothPhoneServiceImpl(
                 mContext, mLock, mCallsManager, mPhoneAccountRegistrar);
@@ -229,7 +259,7 @@
                         return new UserCallIntentProcessor(context, userHandle);
                     }
                 },
-                defaultDialerAdapter,
+                defaultDialerCache,
                 new TelecomServiceImpl.SubscriptionManagerAdapterImpl(),
                 mLock);
         Log.endSession();
@@ -264,4 +294,8 @@
     public Object getLock() {
         return mLock;
     }
+
+    public boolean isBootComplete() {
+        return mIsBootComplete;
+    }
 }
diff --git a/src/com/android/server/telecom/TelecomWakeLock.java b/src/com/android/server/telecom/TelecomWakeLock.java
index 9fca19e..185e111 100644
--- a/src/com/android/server/telecom/TelecomWakeLock.java
+++ b/src/com/android/server/telecom/TelecomWakeLock.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.os.PowerManager;
+import android.telecom.Log;
 
 /**
  * Container for PowerManager / PowerManager.WakeLock access in telecom to facilitate unit testing.
diff --git a/src/com/android/server/telecom/ThreadUtil.java b/src/com/android/server/telecom/ThreadUtil.java
index 650e73f..571d529 100644
--- a/src/com/android/server/telecom/ThreadUtil.java
+++ b/src/com/android/server/telecom/ThreadUtil.java
@@ -17,6 +17,7 @@
 package com.android.server.telecom;
 
 import android.os.Looper;
+import android.telecom.Log;
 
 /**
  * Helper methods to deal with threading related tasks.
diff --git a/src/com/android/server/telecom/Timeouts.java b/src/com/android/server/telecom/Timeouts.java
index 7be59c3..7529683 100644
--- a/src/com/android/server/telecom/Timeouts.java
+++ b/src/com/android/server/telecom/Timeouts.java
@@ -36,6 +36,14 @@
         public long getCallRemoveUnbindInCallServicesDelay(ContentResolver cr) {
             return Timeouts.getCallRemoveUnbindInCallServicesDelay(cr);
         }
+
+        public long getRetryBluetoothConnectAudioBackoffMillis(ContentResolver cr) {
+            return Timeouts.getRetryBluetoothConnectAudioBackoffMillis(cr);
+        }
+
+        public long getBluetoothPendingTimeoutMillis(ContentResolver cr) {
+            return Timeouts.getBluetoothPendingTimeoutMillis(cr);
+        }
     }
 
     /** A prefix to use for all keys so to not clobber the global namespace. */
@@ -121,15 +129,6 @@
     }
 
     /**
-     * Returns the amount of time after a Logging session has been started that Telecom is set to
-     * perform a sweep to check and make sure that the session is still not incomplete (stale).
-     */
-    public static long getStaleSessionCleanupTimeoutMillis(ContentResolver contentResolver) {
-        return get(contentResolver, "stale_session_cleanup_timeout_millis",
-                Log.DEFAULT_SESSION_TIMEOUT_MS);
-    }
-
-    /**
      * Returns the amount of time to wait for the call screening service to allow or disallow a
      * call.
      */
diff --git a/src/com/android/server/telecom/TtyManager.java b/src/com/android/server/telecom/TtyManager.java
index 25284e4..2d04234 100644
--- a/src/com/android/server/telecom/TtyManager.java
+++ b/src/com/android/server/telecom/TtyManager.java
@@ -23,6 +23,7 @@
 import android.media.AudioManager;
 import android.os.UserHandle;
 import android.provider.Settings;
+import android.telecom.Log;
 import android.telecom.TelecomManager;
 
 import com.android.internal.util.IndentingPrintWriter;
diff --git a/src/com/android/server/telecom/VideoProviderProxy.java b/src/com/android/server/telecom/VideoProviderProxy.java
index 3722b59..e14aba7 100644
--- a/src/com/android/server/telecom/VideoProviderProxy.java
+++ b/src/com/android/server/telecom/VideoProviderProxy.java
@@ -22,6 +22,7 @@
 import android.os.RemoteException;
 import android.telecom.Connection;
 import android.telecom.InCallService;
+import android.telecom.Log;
 import android.telecom.VideoProfile;
 import android.view.Surface;
 
@@ -129,7 +130,7 @@
                 Log.startSession("VPP.rSMR");
                 synchronized (mLock) {
                     logFromVideoProvider("receiveSessionModifyRequest: " + videoProfile);
-                    Log.event(mCall, Log.Events.RECEIVE_VIDEO_REQUEST,
+                    Log.addEvent(mCall, LogUtils.Events.RECEIVE_VIDEO_REQUEST,
                             VideoProfile.videoStateToString(videoProfile.getVideoState()));
 
                     mCall.getAnalytics().addVideoEvent(
@@ -141,8 +142,7 @@
                         // If video calling is not supported by the phone account, and we receive
                         // a request to upgrade to video, automatically reject it without informing
                         // the InCallService.
-
-                        Log.event(mCall, Log.Events.SEND_VIDEO_RESPONSE, "video not supported");
+                        Log.addEvent(mCall, LogUtils.Events.SEND_VIDEO_RESPONSE, "video not supported");
                         VideoProfile responseProfile = new VideoProfile(
                                 VideoProfile.STATE_AUDIO_ONLY);
                         try {
@@ -182,7 +182,7 @@
                     " requestProfile=" + requestProfile + " responseProfile=" + responseProfile);
             String eventMessage = "Status Code : " + status + " Video State: " +
                     (responseProfile != null ? responseProfile.getVideoState() : "null");
-            Log.event(mCall, Log.Events.RECEIVE_VIDEO_RESPONSE, eventMessage);
+            Log.addEvent(mCall, LogUtils.Events.RECEIVE_VIDEO_RESPONSE, eventMessage);
             synchronized (mLock) {
                 if (status == Connection.VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS) {
                     mCall.getAnalytics().addVideoEvent(
@@ -371,7 +371,7 @@
     public void onSendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile) {
         synchronized (mLock) {
             logFromInCall("sendSessionModifyRequest: from=" + fromProfile + " to=" + toProfile);
-            Log.event(mCall, Log.Events.SEND_VIDEO_REQUEST,
+            Log.addEvent(mCall, LogUtils.Events.SEND_VIDEO_REQUEST,
                     VideoProfile.videoStateToString(toProfile.getVideoState()));
             mCall.getAnalytics().addVideoEvent(
                     Analytics.SEND_LOCAL_SESSION_MODIFY_REQUEST,
@@ -393,7 +393,7 @@
     public void onSendSessionModifyResponse(VideoProfile responseProfile) {
         synchronized (mLock) {
             logFromInCall("sendSessionModifyResponse: " + responseProfile);
-            Log.event(mCall, Log.Events.SEND_VIDEO_RESPONSE,
+            Log.addEvent(mCall, LogUtils.Events.SEND_VIDEO_RESPONSE,
                     VideoProfile.videoStateToString(responseProfile.getVideoState()));
             mCall.getAnalytics().addVideoEvent(
                     Analytics.SEND_LOCAL_SESSION_MODIFY_RESPONSE,
diff --git a/src/com/android/server/telecom/WiredHeadsetManager.java b/src/com/android/server/telecom/WiredHeadsetManager.java
index 5bd49f5..a5e4404 100644
--- a/src/com/android/server/telecom/WiredHeadsetManager.java
+++ b/src/com/android/server/telecom/WiredHeadsetManager.java
@@ -20,6 +20,7 @@
 import android.media.AudioDeviceCallback;
 import android.media.AudioDeviceInfo;
 import android.media.AudioManager;
+import android.telecom.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IndentingPrintWriter;
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
new file mode 100644
index 0000000..5feacbc
--- /dev/null
+++ b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2016 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.server.telecom.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadset;
+import android.bluetooth.BluetoothProfile;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.telecom.Log;
+
+import com.android.server.telecom.BluetoothAdapterProxy;
+import com.android.server.telecom.BluetoothHeadsetProxy;
+import com.android.server.telecom.TelecomSystem;
+
+import java.util.LinkedHashMap;
+import java.util.Objects;
+
+public class BluetoothDeviceManager {
+    private final BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
+            new BluetoothProfile.ServiceListener() {
+                @Override
+                public void onServiceConnected(int profile, BluetoothProfile proxy) {
+                    Log.startSession("BMSL.oSC");
+                    try {
+                        synchronized (mLock) {
+                            if (profile == BluetoothProfile.HEADSET) {
+                                mBluetoothHeadsetService =
+                                        new BluetoothHeadsetProxy((BluetoothHeadset) proxy);
+                                Log.i(this, "- Got BluetoothHeadset: " + mBluetoothHeadsetService);
+                            } else {
+                                Log.w(this, "Connected to non-headset bluetooth service." +
+                                        " Not changing bluetooth headset.");
+                            }
+                        }
+                    } finally {
+                        Log.endSession();
+                    }
+                }
+
+                @Override
+                public void onServiceDisconnected(int profile) {
+                    Log.startSession("BMSL.oSD");
+                    try {
+                        synchronized (mLock) {
+                            mBluetoothHeadsetService = null;
+                            Log.i(BluetoothDeviceManager.this, "Lost BluetoothHeadset service.");
+                        }
+                    } finally {
+                        Log.endSession();
+                    }
+                }
+           };
+
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.startSession("BM.oR");
+            try {
+                String action = intent.getAction();
+
+                if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
+                    int bluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
+                            BluetoothHeadset.STATE_DISCONNECTED);
+                    BluetoothDevice device =
+                            intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+
+                    if (device == null) {
+                        Log.w(BluetoothDeviceManager.this, "Got null device from broadcast. " +
+                                "Ignoring.");
+                        return;
+                    }
+
+                    Log.i(BluetoothDeviceManager.this, "Device %s changed state to %d",
+                            device.getAddress(), bluetoothHeadsetState);
+
+                    synchronized (mLock) {
+                        if (bluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED) {
+                            if (!mConnectedDevicesByAddress.containsKey(device.getAddress())) {
+                                mConnectedDevicesByAddress.put(device.getAddress(), device);
+                                mBluetoothRouteManager.onDeviceAdded(device);
+                            }
+                        } else if (bluetoothHeadsetState == BluetoothHeadset.STATE_DISCONNECTED
+                                || bluetoothHeadsetState == BluetoothHeadset.STATE_DISCONNECTING) {
+                            if (mConnectedDevicesByAddress.containsKey(device.getAddress())) {
+                                mConnectedDevicesByAddress.remove(device.getAddress());
+                                mBluetoothRouteManager.onDeviceLost(device);
+                            }
+                        }
+                    }
+                }
+            } finally {
+                Log.endSession();
+            }
+        }
+    };
+
+    private final LinkedHashMap<String, BluetoothDevice> mConnectedDevicesByAddress =
+            new LinkedHashMap<>();
+    private final TelecomSystem.SyncRoot mLock;
+
+    private BluetoothRouteManager mBluetoothRouteManager;
+    private BluetoothHeadsetProxy mBluetoothHeadsetService;
+
+    public BluetoothDeviceManager(Context context, BluetoothAdapterProxy bluetoothAdapter,
+            TelecomSystem.SyncRoot lock) {
+        mLock = lock;
+
+        if (bluetoothAdapter != null) {
+            bluetoothAdapter.getProfileProxy(context, mBluetoothProfileServiceListener,
+                    BluetoothProfile.HEADSET);
+        }
+        IntentFilter intentFilter =
+                new IntentFilter(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
+        context.registerReceiver(mReceiver, intentFilter);
+    }
+
+    public void setBluetoothRouteManager(BluetoothRouteManager brm) {
+        mBluetoothRouteManager = brm;
+    }
+
+    public int getNumConnectedDevices() {
+        return mConnectedDevicesByAddress.size();
+    }
+
+    public String getMostRecentlyConnectedDevice(String excludeAddress) {
+        String result = null;
+        synchronized (mLock) {
+            for (String addr : mConnectedDevicesByAddress.keySet()) {
+                if (!Objects.equals(addr, excludeAddress)) {
+                    result = addr;
+                }
+            }
+        }
+        return result;
+    }
+
+    public BluetoothHeadsetProxy getHeadsetService() {
+        return mBluetoothHeadsetService;
+    }
+
+    public void setHeadsetServiceForTesting(BluetoothHeadsetProxy bluetoothHeadset) {
+        mBluetoothHeadsetService = bluetoothHeadset;
+    }
+}
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
new file mode 100644
index 0000000..494089b
--- /dev/null
+++ b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
@@ -0,0 +1,829 @@
+/*
+ * Copyright (C) 2016 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.server.telecom.bluetooth;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadset;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Message;
+import android.telecom.Log;
+import android.telecom.Logging.Session;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.SomeArgs;
+import com.android.internal.util.State;
+import com.android.internal.util.StateMachine;
+import com.android.server.telecom.BluetoothHeadsetProxy;
+import com.android.server.telecom.TelecomSystem;
+import com.android.server.telecom.Timeouts;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+
+public class BluetoothRouteManager extends StateMachine {
+    private static final String LOG_TAG = BluetoothRouteManager.class.getSimpleName();
+
+    private static final SparseArray<String> MESSAGE_CODE_TO_NAME = new SparseArray<String>() {{
+         put(NEW_DEVICE_CONNECTED, "NEW_DEVICE_CONNECTED");
+         put(LOST_DEVICE, "LOST_DEVICE");
+         put(CONNECT_HFP, "CONNECT_HFP");
+         put(DISCONNECT_HFP, "DISCONNECT_HFP");
+         put(RETRY_HFP_CONNECTION, "RETRY_HFP_CONNECTION");
+         put(HFP_IS_ON, "HFP_IS_ON");
+         put(HFP_LOST, "HFP_LOST");
+         put(CONNECTION_TIMEOUT, "CONNECTION_TIMEOUT");
+         put(RUN_RUNNABLE, "RUN_RUNNABLE");
+    }};
+
+    // Constants for compatiblity with current CARSM/CARPA
+    // TODO: delete and replace with new direct interface to CARPA.
+    public static final int BLUETOOTH_UNINITIALIZED = 0;
+    public static final int BLUETOOTH_DISCONNECTED = 1;
+    public static final int BLUETOOTH_DEVICE_CONNECTED = 2;
+    public static final int BLUETOOTH_AUDIO_PENDING = 3;
+    public static final int BLUETOOTH_AUDIO_CONNECTED = 4;
+
+    public static final String AUDIO_OFF_STATE_NAME = "AudioOff";
+    public static final String AUDIO_CONNECTING_STATE_NAME_PREFIX = "Connecting";
+    public static final String AUDIO_CONNECTED_STATE_NAME_PREFIX = "Connected";
+
+    public interface BluetoothStateListener {
+        void onBluetoothStateChange(int oldState, int newState);
+    }
+
+    // Broadcast receiver to receive audio state change broadcasts from the BT stack
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.startSession("BRM.oR");
+            try {
+                String action = intent.getAction();
+
+                if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) {
+                    int bluetoothHeadsetAudioState =
+                            intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
+                                    BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
+                    BluetoothDevice device =
+                            intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+                    if (device == null) {
+                        Log.w(BluetoothRouteManager.this, "Got null device from broadcast. " +
+                                "Ignoring.");
+                        return;
+                    }
+
+                    Log.i(BluetoothRouteManager.this, "Device %s transitioned to audio state %d",
+                            device.getAddress(), bluetoothHeadsetAudioState);
+                    Session session = Log.createSubsession();
+                    SomeArgs args = SomeArgs.obtain();
+                    args.arg1 = session;
+                    args.arg2 = device.getAddress();
+                    switch (bluetoothHeadsetAudioState) {
+                        case BluetoothHeadset.STATE_AUDIO_CONNECTED:
+                            sendMessage(HFP_IS_ON, args);
+                            break;
+                        case BluetoothHeadset.STATE_AUDIO_DISCONNECTED:
+                            sendMessage(HFP_LOST, args);
+                            break;
+                    }
+                }
+            } finally {
+                Log.endSession();
+            }
+        }
+    };
+
+    /**
+     * Constants representing messages sent to the state machine.
+     * Messages are expected to be sent with {@link SomeArgs} as the obj.
+     * In all cases, arg1 will be the log session.
+     */
+    // arg2: Address of the new device
+    public static final int NEW_DEVICE_CONNECTED = 1;
+    // arg2: Address of the lost device
+    public static final int LOST_DEVICE = 2;
+
+    // arg2 (optional): the address of the specific device to connect to.
+    public static final int CONNECT_HFP = 100;
+    // No args.
+    public static final int DISCONNECT_HFP = 101;
+    // arg2: the address of the device to connect to.
+    public static final int RETRY_HFP_CONNECTION = 102;
+
+    // arg2: the address of the device that is on
+    public static final int HFP_IS_ON = 200;
+    // arg2: the address of the device that lost HFP
+    public static final int HFP_LOST = 201;
+
+    // No args; only used internally
+    public static final int CONNECTION_TIMEOUT = 300;
+
+    // arg2: Runnable
+    public static final int RUN_RUNNABLE = 9001;
+
+    // States
+    private final class AudioOffState extends State {
+        @Override
+        public String getName() {
+            return AUDIO_OFF_STATE_NAME;
+        }
+
+        @Override
+        public void enter() {
+            BluetoothDevice erroneouslyConnectedDevice = getBluetoothAudioConnectedDevice();
+            if (erroneouslyConnectedDevice != null) {
+                Log.w(LOG_TAG, "Entering AudioOff state but device %s appears to be connected. " +
+                        "Disconnecting.", erroneouslyConnectedDevice);
+                disconnectAudio();
+            }
+            cleanupStatesForDisconnectedDevices();
+        }
+
+        @Override
+        public boolean processMessage(Message msg) {
+            if (msg.what == RUN_RUNNABLE) {
+                ((Runnable) msg.obj).run();
+                return HANDLED;
+            }
+
+            SomeArgs args = (SomeArgs) msg.obj;
+            try {
+                switch (msg.what) {
+                    case NEW_DEVICE_CONNECTED:
+                        // If the device isn't new, don't bother passing it up.
+                        if (addDevice((String) args.arg2)) {
+                            // TODO: replace with new interface
+                            if (mDeviceManager.getNumConnectedDevices() == 1) {
+                                mListener.onBluetoothStateChange(
+                                        BLUETOOTH_DISCONNECTED, BLUETOOTH_DEVICE_CONNECTED);
+                            }
+                        }
+                        break;
+                    case LOST_DEVICE:
+                        // If the device has already been removed, don't bother passing it up.
+                        if (removeDevice((String) args.arg2)) {
+                            // TODO: replace with new interface
+                            if (mDeviceManager.getNumConnectedDevices() == 0) {
+                                mListener.onBluetoothStateChange(
+                                        BLUETOOTH_DEVICE_CONNECTED, BLUETOOTH_DISCONNECTED);
+                            }
+                        }
+                        break;
+                    case CONNECT_HFP:
+                        String actualAddress = connectHfpAudio((String) args.arg2);
+
+                        if (actualAddress != null) {
+                            mListener.onBluetoothStateChange(BLUETOOTH_DEVICE_CONNECTED,
+                                    BLUETOOTH_AUDIO_PENDING);
+                            transitionTo(getConnectingStateForAddress(actualAddress,
+                                    "AudioOff/CONNECT_HFP"));
+                        } else {
+                            Log.w(LOG_TAG, "Tried to connect to %s but failed to connect to" +
+                                    " any HFP device.", (String) args.arg2);
+                        }
+                        break;
+                    case DISCONNECT_HFP:
+                        // Ignore.
+                        break;
+                    case RETRY_HFP_CONNECTION:
+                        Log.i(LOG_TAG, "Retrying HFP connection to %s", (String) args.arg2);
+                        String retryAddress = connectHfpAudio((String) args.arg2, false);
+
+                        if (retryAddress != null) {
+                            mListener.onBluetoothStateChange(BLUETOOTH_DEVICE_CONNECTED,
+                                    BLUETOOTH_AUDIO_PENDING);
+                            transitionTo(getConnectingStateForAddress(retryAddress,
+                                    "AudioOff/RETRY_HFP_CONNECTION"));
+                        } else {
+                            Log.i(LOG_TAG, "Retry failed.");
+                        }
+                        break;
+                    case CONNECTION_TIMEOUT:
+                        // Ignore.
+                        break;
+                    case HFP_IS_ON:
+                        String address = (String) args.arg2;
+                        Log.w(LOG_TAG, "HFP audio unexpectedly turned on from device %s", address);
+                        mListener.onBluetoothStateChange(BLUETOOTH_DEVICE_CONNECTED,
+                                BLUETOOTH_AUDIO_CONNECTED);
+                        transitionTo(getConnectedStateForAddress(address, "AudioOff/HFP_IS_ON"));
+                        break;
+                    case HFP_LOST:
+                        Log.i(LOG_TAG, "Received HFP off for device %s while HFP off.",
+                                (String) args.arg2);
+                        break;
+                }
+            } finally {
+                args.recycle();
+            }
+            return HANDLED;
+        }
+    }
+
+    private final class AudioConnectingState extends State {
+        private final String mDeviceAddress;
+
+        AudioConnectingState(String address) {
+            mDeviceAddress = address;
+        }
+
+        @Override
+        public String getName() {
+            return AUDIO_CONNECTING_STATE_NAME_PREFIX + ":" + mDeviceAddress;
+        }
+
+        @Override
+        public void enter() {
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = Log.createSubsession();
+            sendMessageDelayed(CONNECTION_TIMEOUT, args,
+                    mTimeoutsAdapter.getBluetoothPendingTimeoutMillis(
+                            mContext.getContentResolver()));
+        }
+
+        @Override
+        public void exit() {
+            removeMessages(CONNECTION_TIMEOUT);
+        }
+
+        @Override
+        public boolean processMessage(Message msg) {
+            if (msg.what == RUN_RUNNABLE) {
+                ((Runnable) msg.obj).run();
+                return HANDLED;
+            }
+
+            SomeArgs args = (SomeArgs) msg.obj;
+            String address = (String) args.arg2;
+            try {
+                switch (msg.what) {
+                    case NEW_DEVICE_CONNECTED:
+                        // If the device isn't new, don't bother passing it up.
+                        if (addDevice(address)) {
+                            // TODO: replace with new interface
+                            if (mDeviceManager.getNumConnectedDevices() == 1) {
+                                Log.w(LOG_TAG, "Newly connected device is only device" +
+                                        " while audio pending.");
+                            }
+                        }
+                        break;
+                    case LOST_DEVICE:
+                        removeDevice((String) args.arg2);
+
+                        if (Objects.equals(address, mDeviceAddress)) {
+                            String newAddress = connectHfpAudio(null);
+                            if (newAddress != null) {
+                                mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_PENDING,
+                                        BLUETOOTH_AUDIO_PENDING);
+                                transitionTo(getConnectingStateForAddress(newAddress,
+                                        "AudioConnecting/LOST_DEVICE"));
+                            } else {
+                                int numConnectedDevices = mDeviceManager.getNumConnectedDevices();
+                                mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_PENDING,
+                                        numConnectedDevices == 0 ? BLUETOOTH_DISCONNECTED :
+                                                BLUETOOTH_DEVICE_CONNECTED);
+                                transitionTo(mAudioOffState);
+                            }
+                        }
+                        break;
+                    case CONNECT_HFP:
+                        if (Objects.equals(mDeviceAddress, address)) {
+                            // Ignore repeated connection attempts to the same device
+                            break;
+                        }
+                        String actualAddress = connectHfpAudio(address);
+
+                        if (actualAddress != null) {
+                            mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_PENDING,
+                                    BLUETOOTH_AUDIO_PENDING);
+                            transitionTo(getConnectingStateForAddress(actualAddress,
+                                    "AudioConnecting/CONNECT_HFP"));
+                        } else {
+                            Log.w(LOG_TAG, "Tried to connect to %s but failed" +
+                                    " to connect to any HFP device.", (String) args.arg2);
+                        }
+                        break;
+                    case DISCONNECT_HFP:
+                        disconnectAudio();
+                        mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_PENDING,
+                                BLUETOOTH_DEVICE_CONNECTED);
+                        transitionTo(mAudioOffState);
+                        break;
+                    case RETRY_HFP_CONNECTION:
+                        if (Objects.equals(address, mDeviceAddress)) {
+                            Log.d(LOG_TAG, "Retry message came through while connecting.");
+                        } else {
+                            String retryAddress = connectHfpAudio(address, false);
+                            if (retryAddress != null) {
+                                transitionTo(getConnectingStateForAddress(retryAddress,
+                                        "AudioConnecting/RETRY_HFP_CONNECTION"));
+                            } else {
+                                Log.i(LOG_TAG, "Retry failed.");
+                            }
+                        }
+                        break;
+                    case CONNECTION_TIMEOUT:
+                        Log.i(LOG_TAG, "Connection with device %s timed out.",
+                                mDeviceAddress);
+                        transitionToActualState(BLUETOOTH_AUDIO_PENDING);
+                        break;
+                    case HFP_IS_ON:
+                        if (Objects.equals(mDeviceAddress, address)) {
+                            Log.i(LOG_TAG, "HFP connection success for device %s.", mDeviceAddress);
+                            transitionTo(mAudioConnectedStates.get(mDeviceAddress));
+                        } else {
+                            Log.w(LOG_TAG, "In connecting state for device %s but %s" +
+                                    " is now connected", mDeviceAddress, address);
+                            transitionTo(getConnectedStateForAddress(address,
+                                    "AudioConnecting/HFP_IS_ON"));
+                        }
+                        mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_PENDING,
+                                BLUETOOTH_AUDIO_CONNECTED);
+                        break;
+                    case HFP_LOST:
+                        if (Objects.equals(mDeviceAddress, address)) {
+                            Log.i(LOG_TAG, "Connection with device %s failed.",
+                                    mDeviceAddress);
+                            transitionToActualState(BLUETOOTH_AUDIO_PENDING);
+                        } else {
+                            Log.w(LOG_TAG, "Got HFP lost message for device %s while" +
+                                    " connecting to %s.", address, mDeviceAddress);
+                        }
+                        break;
+                }
+            } finally {
+                args.recycle();
+            }
+            return HANDLED;
+        }
+    }
+
+    private final class AudioConnectedState extends State {
+        private final String mDeviceAddress;
+
+        AudioConnectedState(String address) {
+            mDeviceAddress = address;
+        }
+
+        @Override
+        public String getName() {
+            return AUDIO_CONNECTED_STATE_NAME_PREFIX + ":" + mDeviceAddress;
+        }
+
+        @Override
+        public void enter() {
+            // Remove any of the retries that are still in the queue once any device becomes
+            // connected.
+            removeMessages(RETRY_HFP_CONNECTION);
+            // Remove and add to ensure that the device is at the top.
+            mMostRecentlyUsedDevices.remove(mDeviceAddress);
+            mMostRecentlyUsedDevices.add(mDeviceAddress);
+        }
+
+        @Override
+        public boolean processMessage(Message msg) {
+            if (msg.what == RUN_RUNNABLE) {
+                ((Runnable) msg.obj).run();
+                return HANDLED;
+            }
+
+            SomeArgs args = (SomeArgs) msg.obj;
+            String address = (String) args.arg2;
+            try {
+                switch (msg.what) {
+                    case NEW_DEVICE_CONNECTED:
+                        // If the device isn't new, don't bother passing it up.
+                        if (addDevice(address)) {
+                            // TODO: Replace with new interface
+                            if (mDeviceManager.getNumConnectedDevices() == 1) {
+                                Log.w(LOG_TAG, "Newly connected device is only" +
+                                        " device while audio connected.");
+                            }
+                        }
+                        break;
+                    case LOST_DEVICE:
+                        removeDevice((String) args.arg2);
+
+                        if (Objects.equals(address, mDeviceAddress)) {
+                            String newAddress = connectHfpAudio(null);
+                            if (newAddress != null) {
+                                mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_CONNECTED,
+                                        BLUETOOTH_AUDIO_PENDING);
+                                transitionTo(getConnectingStateForAddress(newAddress,
+                                        "AudioConnected/LOST_DEVICE"));
+                            } else {
+                                int numConnectedDevices = mDeviceManager.getNumConnectedDevices();
+                                mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_CONNECTED,
+                                        numConnectedDevices == 0 ? BLUETOOTH_DISCONNECTED :
+                                                BLUETOOTH_DEVICE_CONNECTED);
+                                transitionTo(mAudioOffState);
+                            }
+                        }
+                        break;
+                    case CONNECT_HFP:
+                        if (Objects.equals(mDeviceAddress, address)) {
+                            // Ignore connection to already connected device.
+                            break;
+                        }
+                        String actualAddress = connectHfpAudio(address);
+
+                        if (actualAddress != null) {
+                            mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_CONNECTED,
+                                    BLUETOOTH_AUDIO_PENDING);
+                            transitionTo(getConnectingStateForAddress(address,
+                                    "AudioConnected/CONNECT_HFP"));
+                        } else {
+                            Log.w(LOG_TAG, "Tried to connect to %s but failed" +
+                                    " to connect to any HFP device.", (String) args.arg2);
+                        }
+                        break;
+                    case DISCONNECT_HFP:
+                        disconnectAudio();
+                        mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_CONNECTED,
+                                BLUETOOTH_DEVICE_CONNECTED);
+                        transitionTo(mAudioOffState);
+                        break;
+                    case RETRY_HFP_CONNECTION:
+                        if (Objects.equals(address, mDeviceAddress)) {
+                            Log.d(LOG_TAG, "Retry message came through while connected.");
+                        } else {
+                            String retryAddress = connectHfpAudio(address, false);
+                            if (retryAddress != null) {
+                                mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_CONNECTED,
+                                        BLUETOOTH_AUDIO_PENDING);
+                                transitionTo(getConnectingStateForAddress(retryAddress,
+                                        "AudioConnected/RETRY_HFP_CONNECTION"));
+                            } else {
+                                Log.i(LOG_TAG, "Retry failed.");
+                            }
+                        }
+                        break;
+                    case CONNECTION_TIMEOUT:
+                        Log.w(LOG_TAG, "Received CONNECTION_TIMEOUT while connected.");
+                        break;
+                    case HFP_IS_ON:
+                        if (Objects.equals(mDeviceAddress, address)) {
+                            Log.i(LOG_TAG, "Received redundant HFP_IS_ON for %s", mDeviceAddress);
+                        } else {
+                            Log.w(LOG_TAG, "In connected state for device %s but %s" +
+                                    " is now connected", mDeviceAddress, address);
+                            transitionTo(getConnectedStateForAddress(address,
+                                    "AudioConnected/HFP_IS_ON"));
+                        }
+                        break;
+                    case HFP_LOST:
+                        if (Objects.equals(mDeviceAddress, address)) {
+                            Log.i(LOG_TAG, "HFP connection with device %s lost.", mDeviceAddress);
+                            String nextAddress = connectHfpAudio(null, mDeviceAddress);
+                            if (nextAddress == null) {
+                                Log.i(LOG_TAG, "No suitable fallback device. Going to AUDIO_OFF.");
+                                transitionToActualState(BLUETOOTH_AUDIO_CONNECTED);
+                            } else {
+                                mListener.onBluetoothStateChange(BLUETOOTH_AUDIO_CONNECTED,
+                                        BLUETOOTH_AUDIO_PENDING);
+                                transitionTo(getConnectingStateForAddress(nextAddress,
+                                        "AudioConnected/HFP_LOST"));
+                            }
+                        } else {
+                            Log.w(LOG_TAG, "Got HFP lost message for device %s while" +
+                                    " connected to %s.", address, mDeviceAddress);
+                        }
+                        break;
+                }
+            } finally {
+                args.recycle();
+            }
+            return HANDLED;
+        }
+    }
+
+    private final State mAudioOffState;
+    private final Map<String, AudioConnectingState> mAudioConnectingStates = new HashMap<>();
+    private final Map<String, AudioConnectedState> mAudioConnectedStates = new HashMap<>();
+    private final Set<State> statesToCleanUp = new HashSet<>();
+    private final LinkedHashSet<String> mMostRecentlyUsedDevices = new LinkedHashSet<>();
+
+    private final TelecomSystem.SyncRoot mLock;
+    private final Context mContext;
+    private final Timeouts.Adapter mTimeoutsAdapter;
+
+    private BluetoothStateListener mListener;
+    private BluetoothDeviceManager mDeviceManager;
+
+    public BluetoothRouteManager(Context context, TelecomSystem.SyncRoot lock,
+            BluetoothDeviceManager deviceManager, Timeouts.Adapter timeoutsAdapter) {
+        super(BluetoothRouteManager.class.getSimpleName());
+        mContext = context;
+        mLock = lock;
+        mDeviceManager = deviceManager;
+        mDeviceManager.setBluetoothRouteManager(this);
+        mTimeoutsAdapter = timeoutsAdapter;
+
+        IntentFilter intentFilter = new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
+        context.registerReceiver(mReceiver, intentFilter);
+
+        mAudioOffState = new AudioOffState();
+        addState(mAudioOffState);
+        setInitialState(mAudioOffState);
+        start();
+    }
+
+    @Override
+    protected void onPreHandleMessage(Message msg) {
+        if (msg.obj != null && msg.obj instanceof SomeArgs) {
+            SomeArgs args = (SomeArgs) msg.obj;
+
+            Log.continueSession(((Session) args.arg1), "BRM.pM_" + msg.what);
+            Log.i(LOG_TAG, "Message received: %s.", MESSAGE_CODE_TO_NAME.get(msg.what));
+        } else if (msg.what == RUN_RUNNABLE && msg.obj instanceof Runnable) {
+            Log.i(LOG_TAG, "Running runnable for testing");
+        } else {
+            Log.w(LOG_TAG, "Message sent must be of type nonnull SomeArgs, but got " +
+                    (msg.obj == null ? "null" : msg.obj.getClass().getSimpleName()));
+            Log.w(LOG_TAG, "The message was of code %d = %s",
+                    msg.what, MESSAGE_CODE_TO_NAME.get(msg.what));
+        }
+    }
+
+    @Override
+    protected void onPostHandleMessage(Message msg) {
+        Log.endSession();
+    }
+
+    /**
+     * Returns whether there is a HFP device available to route audio to.
+     * @return true if there is a device, false otherwise.
+     */
+    public boolean isBluetoothAvailable() {
+        return mDeviceManager.getNumConnectedDevices() > 0;
+    }
+
+    public boolean isBluetoothAudioConnectedOrPending() {
+        return getCurrentState() != mAudioOffState;
+    }
+
+    /**
+     * Attempts to connect to Bluetooth audio. If the first connection attempt synchronously
+     * fails, schedules a retry at a later time.
+     * @param address The MAC address of the bluetooth device to connect to. If null, the most
+     *                recently used device will be used.
+     */
+    public void connectBluetoothAudio(String address) {
+        SomeArgs args = SomeArgs.obtain();
+        args.arg1 = Log.createSubsession();
+        args.arg2 = address;
+        sendMessage(CONNECT_HFP, args);
+    }
+
+    /**
+     * Disconnects Bluetooth HFP audio.
+     */
+    public void disconnectBluetoothAudio() {
+        SomeArgs args = SomeArgs.obtain();
+        args.arg1 = Log.createSubsession();
+        sendMessage(DISCONNECT_HFP, args);
+    }
+
+    public void setListener(BluetoothStateListener listener) {
+        mListener = listener;
+    }
+
+    public void onDeviceAdded(BluetoothDevice newDevice) {
+        SomeArgs args = SomeArgs.obtain();
+        args.arg1 = Log.createSubsession();
+        args.arg2 = newDevice.getAddress();
+        sendMessage(NEW_DEVICE_CONNECTED, args);
+    }
+
+    public void onDeviceLost(BluetoothDevice lostDevice) {
+        SomeArgs args = SomeArgs.obtain();
+        args.arg1 = Log.createSubsession();
+        args.arg2 = lostDevice.getAddress();
+        sendMessage(LOST_DEVICE, args);
+    }
+
+    private String connectHfpAudio(String address) {
+        return connectHfpAudio(address, true, null);
+    }
+
+    private String connectHfpAudio(String address, boolean shouldRetry) {
+        return connectHfpAudio(address, shouldRetry, null);
+    }
+
+    private String connectHfpAudio(String address, String excludeAddress) {
+        return connectHfpAudio(address, true, excludeAddress);
+    }
+
+    /**
+     * Initiates a HFP connection to the BT address specified.
+     * Note: This method is not synchronized on the Telecom lock, so don't try and call back into
+     * Telecom from within it.
+     * @param address The address that should be tried first. May be null.
+     * @param shouldRetry true if there should be a retry-with-backoff if connection is
+     *                    immediately unsuccessful, false otherwise.
+     * @param excludeAddress Don't connect to this address.
+     * @return The address of the device that's actually being connected to, or null if no
+     * connection was successful.
+     */
+    private String connectHfpAudio(String address, boolean shouldRetry, String excludeAddress) {
+        BluetoothHeadsetProxy bluetoothHeadset = mDeviceManager.getHeadsetService();
+        if (bluetoothHeadset == null) {
+            Log.i(this, "connectHfpAudio: no headset service available.");
+            return null;
+        }
+        List<BluetoothDevice> deviceList = bluetoothHeadset.getConnectedDevices();
+        Optional<BluetoothDevice> matchingDevice = deviceList.stream()
+                .filter(d -> Objects.equals(d.getAddress(), address))
+                .findAny();
+
+        String actualAddress = matchingDevice.isPresent() ?
+                address : getPreferredDevice(excludeAddress);
+        if (!matchingDevice.isPresent()) {
+            Log.i(this, "No device with address %s available. Using %s instead.",
+                    address, actualAddress);
+        }
+        if (actualAddress != null && !connectAudio(actualAddress)) {
+            Log.w(LOG_TAG, "Could not connect to %s. Will %s", shouldRetry ? "retry" : "not retry");
+            if (shouldRetry) {
+                SomeArgs args = SomeArgs.obtain();
+                args.arg1 = Log.createSubsession();
+                args.arg2 = actualAddress;
+                sendMessageDelayed(RETRY_HFP_CONNECTION, args,
+                        mTimeoutsAdapter.getRetryBluetoothConnectAudioBackoffMillis(
+                                mContext.getContentResolver()));
+            }
+            return null;
+        }
+
+        return actualAddress;
+    }
+
+    private String getPreferredDevice(String excludeAddress) {
+        String preferredDevice = null;
+        for (String address : mMostRecentlyUsedDevices) {
+            if (!Objects.equals(excludeAddress, address)) {
+                preferredDevice = address;
+            }
+        }
+        if (preferredDevice == null) {
+            return mDeviceManager.getMostRecentlyConnectedDevice(excludeAddress);
+        }
+        return preferredDevice;
+    }
+
+    private void transitionToActualState(int currentBtState) {
+        BluetoothDevice possiblyAlreadyConnectedDevice = getBluetoothAudioConnectedDevice();
+        if (possiblyAlreadyConnectedDevice != null) {
+            Log.i(LOG_TAG, "Device %s is already connected; going to AudioConnected.",
+                    possiblyAlreadyConnectedDevice);
+            transitionTo(getConnectedStateForAddress(
+                    possiblyAlreadyConnectedDevice.getAddress(), "transitionToActualState"));
+            // TODO: replace with new interface
+            mListener.onBluetoothStateChange(currentBtState, BLUETOOTH_AUDIO_CONNECTED);
+        } else {
+            transitionTo(mAudioOffState);
+            mListener.onBluetoothStateChange(currentBtState,
+                    mDeviceManager.getNumConnectedDevices() > 0 ?
+                            BLUETOOTH_DEVICE_CONNECTED : BLUETOOTH_DISCONNECTED);
+        }
+    }
+
+    /**
+     * @return The BluetoothDevice that is connected to BT audio, null if none are connected.
+     */
+    @VisibleForTesting
+    public BluetoothDevice getBluetoothAudioConnectedDevice() {
+        BluetoothHeadsetProxy bluetoothHeadset = mDeviceManager.getHeadsetService();
+        if (bluetoothHeadset == null) {
+            Log.i(this, "getBluetoothAudioConnectedDevice: no headset service available.");
+            return null;
+        }
+        List<BluetoothDevice> deviceList = bluetoothHeadset.getConnectedDevices();
+
+        for (int i = 0; i < deviceList.size(); i++) {
+            BluetoothDevice device = deviceList.get(i);
+            boolean isAudioOn = bluetoothHeadset.isAudioConnected(device);
+            Log.v(this, "isBluetoothAudioConnected: ==> isAudioOn = " + isAudioOn
+                    + "for headset: " + device);
+            if (isAudioOn) {
+                return device;
+            }
+        }
+        return null;
+    }
+
+    private boolean connectAudio(String address) {
+        BluetoothHeadsetProxy bluetoothHeadset = mDeviceManager.getHeadsetService();
+        if (bluetoothHeadset == null) {
+            Log.w(this, "Trying to connect audio but no headset service exists.");
+            return false;
+        }
+        // TODO: update once connectAudio supports passing in a device.
+        return bluetoothHeadset.connectAudio();
+    }
+
+    private void disconnectAudio() {
+        BluetoothHeadsetProxy bluetoothHeadset = mDeviceManager.getHeadsetService();
+        if (bluetoothHeadset == null) {
+            Log.w(this, "Trying to disconnect audio but no headset service exists.");
+        } else {
+            bluetoothHeadset.disconnectAudio();
+        }
+    }
+
+    private boolean addDevice(String address) {
+        if (mAudioConnectingStates.containsKey(address)) {
+            Log.i(this, "Attempting to add device %s twice.", address);
+            return false;
+        }
+        AudioConnectedState audioConnectedState = new AudioConnectedState(address);
+        AudioConnectingState audioConnectingState = new AudioConnectingState(address);
+        mAudioConnectingStates.put(address, audioConnectingState);
+        mAudioConnectedStates.put(address, audioConnectedState);
+        addState(audioConnectedState);
+        addState(audioConnectingState);
+        return true;
+    }
+
+    private boolean removeDevice(String address) {
+        if (!mAudioConnectingStates.containsKey(address)) {
+            Log.i(this, "Attempting to remove already-removed device %s", address);
+            return false;
+        }
+        statesToCleanUp.add(mAudioConnectingStates.remove(address));
+        statesToCleanUp.add(mAudioConnectedStates.remove(address));
+        mMostRecentlyUsedDevices.remove(address);
+        return true;
+    }
+
+    private AudioConnectingState getConnectingStateForAddress(String address, String error) {
+        if (!mAudioConnectingStates.containsKey(address)) {
+            Log.w(LOG_TAG, "Device being connected to does not have a corresponding state: %s",
+                    error);
+            addDevice(address);
+        }
+        return mAudioConnectingStates.get(address);
+    }
+
+    private AudioConnectedState getConnectedStateForAddress(String address, String error) {
+        if (!mAudioConnectedStates.containsKey(address)) {
+            Log.w(LOG_TAG, "Device already connected to does" +
+                    " not have a corresponding state: %s", error);
+            addDevice(address);
+        }
+        return mAudioConnectedStates.get(address);
+    }
+
+    /**
+     * Removes the states for disconnected devices from the state machine. Called when entering
+     * AudioOff so that none of the states-to-be-removed are active.
+     */
+    private void cleanupStatesForDisconnectedDevices() {
+        for (State state : statesToCleanUp) {
+            if (state != null) {
+                removeState(state);
+            }
+        }
+        statesToCleanUp.clear();
+    }
+
+    @VisibleForTesting
+    public void setInitialStateForTesting(String stateName, BluetoothDevice device) {
+        switch (stateName) {
+            case AUDIO_OFF_STATE_NAME:
+                transitionTo(mAudioOffState);
+                break;
+            case AUDIO_CONNECTING_STATE_NAME_PREFIX:
+                transitionTo(getConnectingStateForAddress(device.getAddress(),
+                        "setInitialStateForTesting"));
+                break;
+            case AUDIO_CONNECTED_STATE_NAME_PREFIX:
+                transitionTo(getConnectedStateForAddress(device.getAddress(),
+                        "setInitialStateForTesting"));
+                break;
+        }
+    }
+}
diff --git a/src/com/android/server/telecom/callfiltering/AsyncBlockCheckFilter.java b/src/com/android/server/telecom/callfiltering/AsyncBlockCheckFilter.java
index 51fc390..2f78d23 100644
--- a/src/com/android/server/telecom/callfiltering/AsyncBlockCheckFilter.java
+++ b/src/com/android/server/telecom/callfiltering/AsyncBlockCheckFilter.java
@@ -18,10 +18,11 @@
 
 import android.content.Context;
 import android.os.AsyncTask;
+import android.telecom.Log;
+import android.telecom.Logging.Session;
 
 import com.android.server.telecom.Call;
-import com.android.server.telecom.Log;
-import com.android.server.telecom.Session;
+import com.android.server.telecom.LogUtils;
 
 /**
  * An {@link AsyncTask} that checks if a call needs to be blocked.
@@ -61,7 +62,7 @@
     protected Boolean doInBackground(String... params) {
         try {
             Log.continueSession(mBackgroundTaskSubsession, "ABCF.dIB");
-            Log.event(mIncomingCall, Log.Events.BLOCK_CHECK_INITIATED);
+            Log.addEvent(mIncomingCall, LogUtils.Events.BLOCK_CHECK_INITIATED);
             return mBlockCheckerAdapter.isBlocked(mContext, params[0]);
         } finally {
             Log.endSession();
@@ -88,7 +89,7 @@
                         true // shouldShowNotification
                 );
             }
-            Log.event(mIncomingCall, Log.Events.BLOCK_CHECK_FINISHED, result);
+            Log.addEvent(mIncomingCall, LogUtils.Events.BLOCK_CHECK_FINISHED, result);
             mCallback.onCallFilteringComplete(mIncomingCall, result);
         } finally {
             Log.endSession();
diff --git a/src/com/android/server/telecom/callfiltering/CallScreeningServiceFilter.java b/src/com/android/server/telecom/callfiltering/CallScreeningServiceFilter.java
index db99e2f..4830b31 100644
--- a/src/com/android/server/telecom/callfiltering/CallScreeningServiceFilter.java
+++ b/src/com/android/server/telecom/callfiltering/CallScreeningServiceFilter.java
@@ -27,13 +27,15 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.telecom.CallScreeningService;
+import android.telecom.Log;
 import android.text.TextUtils;
 
 import com.android.internal.telecom.ICallScreeningAdapter;
 import com.android.internal.telecom.ICallScreeningService;
 import com.android.server.telecom.Call;
 import com.android.server.telecom.CallsManager;
-import com.android.server.telecom.Log;
+import com.android.server.telecom.DefaultDialerCache;
+import com.android.server.telecom.LogUtils;
 import com.android.server.telecom.ParcelableCallUtils;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.TelecomServiceImpl;
@@ -52,7 +54,7 @@
             Log.startSession("CSCR.oSC");
             try {
                 synchronized (mTelecomLock) {
-                    Log.event(mCall, Log.Events.SCREENING_BOUND, componentName);
+                    Log.addEvent(mCall, LogUtils.Events.SCREENING_BOUND, componentName);
                     if (!mHasFinished) {
                         onServiceBound(ICallScreeningService.Stub.asInterface(service));
                     }
@@ -136,7 +138,7 @@
     private final Context mContext;
     private final PhoneAccountRegistrar mPhoneAccountRegistrar;
     private final CallsManager mCallsManager;
-    private final TelecomServiceImpl.DefaultDialerManagerAdapter mDefaultDialerManagerAdapter;
+    private final DefaultDialerCache mDefaultDialerCache;
     private final ParcelableCallUtils.Converter mParcelableCallUtilsConverter;
     private final TelecomSystem.SyncRoot mTelecomLock;
 
@@ -157,13 +159,13 @@
             Context context,
             CallsManager callsManager,
             PhoneAccountRegistrar phoneAccountRegistrar,
-            TelecomServiceImpl.DefaultDialerManagerAdapter defaultDialerManagerAdapter,
+            DefaultDialerCache defaultDialerCache,
             ParcelableCallUtils.Converter parcelableCallUtilsConverter,
             TelecomSystem.SyncRoot lock) {
         mContext = context;
         mPhoneAccountRegistrar = phoneAccountRegistrar;
         mCallsManager = callsManager;
-        mDefaultDialerManagerAdapter = defaultDialerManagerAdapter;
+        mDefaultDialerCache = defaultDialerCache;
         mParcelableCallUtilsConverter = parcelableCallUtilsConverter;
         mTelecomLock = lock;
     }
@@ -174,7 +176,7 @@
             Log.w(this, "Attempting to reuse CallScreeningServiceFilter. Ignoring.");
             return;
         }
-        Log.event(call, Log.Events.SCREENING_SENT);
+        Log.addEvent(call, LogUtils.Events.SCREENING_SENT);
         mCall = call;
         mCallback = callback;
         if (!bindService()) {
@@ -185,7 +187,7 @@
 
     private void finishCallScreening() {
         if (!mHasFinished) {
-            Log.event(mCall, Log.Events.SCREENING_COMPLETED, mResult);
+            Log.addEvent(mCall, LogUtils.Events.SCREENING_COMPLETED, mResult);
             mCallback.onCallFilteringComplete(mCall, mResult);
 
             if (mConnection != null) {
@@ -199,8 +201,8 @@
     }
 
     private boolean bindService() {
-        String dialerPackage = mDefaultDialerManagerAdapter
-                .getDefaultDialerApplication(mContext, UserHandle.USER_CURRENT);
+        String dialerPackage = mDefaultDialerCache
+                .getDefaultDialerApplication(UserHandle.USER_CURRENT);
         if (TextUtils.isEmpty(dialerPackage)) {
             Log.i(this, "Default dialer is empty. Not performing call screening.");
             return false;
@@ -230,7 +232,7 @@
 
         ComponentName componentName =
                 new ComponentName(entry.serviceInfo.packageName, entry.serviceInfo.name);
-        Log.event(mCall, Log.Events.BIND_SCREENING, componentName);
+        Log.addEvent(mCall, LogUtils.Events.BIND_SCREENING, componentName);
         intent.setComponent(componentName);
         ServiceConnection connection = new CallScreeningServiceConnection();
         if (mContext.bindServiceAsUser(
diff --git a/src/com/android/server/telecom/callfiltering/DirectToVoicemailCallFilter.java b/src/com/android/server/telecom/callfiltering/DirectToVoicemailCallFilter.java
index 1aaae46..41e4351 100644
--- a/src/com/android/server/telecom/callfiltering/DirectToVoicemailCallFilter.java
+++ b/src/com/android/server/telecom/callfiltering/DirectToVoicemailCallFilter.java
@@ -17,11 +17,12 @@
 package com.android.server.telecom.callfiltering;
 
 import android.net.Uri;
+import android.telecom.Log;
 
 import com.android.internal.telephony.CallerInfo;
 import com.android.server.telecom.Call;
 import com.android.server.telecom.CallerInfoLookupHelper;
-import com.android.server.telecom.Log;
+import com.android.server.telecom.LogUtils;
 
 import java.util.Objects;
 
@@ -34,7 +35,7 @@
 
     @Override
     public void startFilterLookup(final Call call, CallFilterResultCallback callback) {
-        Log.event(call, Log.Events.DIRECT_TO_VM_INITIATED);
+        Log.addEvent(call, LogUtils.Events.DIRECT_TO_VM_INITIATED);
         final Uri callHandle = call.getHandle();
 
         mCallerInfoLookupHelper.startLookup(callHandle,
@@ -58,7 +59,7 @@
                                         true // shouldShowNotification
                                 );
                             }
-                            Log.event(call, Log.Events.DIRECT_TO_VM_FINISHED, result);
+                            Log.addEvent(call, LogUtils.Events.DIRECT_TO_VM_FINISHED, result);
                             callback.onCallFilteringComplete(call, result);
                         } else {
                             Log.w(this, "CallerInfo lookup returned with a different handle than " +
diff --git a/src/com/android/server/telecom/callfiltering/IncomingCallFilter.java b/src/com/android/server/telecom/callfiltering/IncomingCallFilter.java
index 6e0c684..1c947d1 100644
--- a/src/com/android/server/telecom/callfiltering/IncomingCallFilter.java
+++ b/src/com/android/server/telecom/callfiltering/IncomingCallFilter.java
@@ -19,11 +19,12 @@
 import android.content.Context;
 import android.os.Handler;
 import android.os.Looper;
+import android.telecom.Log;
+import android.telecom.Logging.Runnable;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.telecom.Call;
-import com.android.server.telecom.Log;
-import com.android.server.telecom.Runnable;
+import com.android.server.telecom.LogUtils;
 import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.Timeouts;
 
@@ -66,7 +67,7 @@
     }
 
     public void performFiltering() {
-        Log.event(mCall, Log.Events.FILTERING_INITIATED);
+        Log.addEvent(mCall, LogUtils.Events.FILTERING_INITIATED);
         for (CallFilter filter : mFilters) {
             filter.startFilterLookup(mCall, this);
         }
@@ -76,7 +77,7 @@
             public void loggedRun() {
                 if (mIsPending) {
                     Log.i(IncomingCallFilter.this, "Call filtering has timed out.");
-                    Log.event(mCall, Log.Events.FILTERING_TIMED_OUT);
+                    Log.addEvent(mCall, LogUtils.Events.FILTERING_TIMED_OUT);
                     mListener.onCallFilteringComplete(mCall, mResult);
                     mIsPending = false;
                 }
@@ -94,7 +95,7 @@
                     @Override
                     public void loggedRun() {
                         if (mIsPending) {
-                            Log.event(mCall, Log.Events.FILTERING_COMPLETED, mResult);
+                            Log.addEvent(mCall, LogUtils.Events.FILTERING_COMPLETED, mResult);
                             mListener.onCallFilteringComplete(mCall, mResult);
                             mIsPending = false;
                         }
diff --git a/src/com/android/server/telecom/components/ErrorDialogActivity.java b/src/com/android/server/telecom/components/ErrorDialogActivity.java
index 473767a..1bdcdf2 100644
--- a/src/com/android/server/telecom/components/ErrorDialogActivity.java
+++ b/src/com/android/server/telecom/components/ErrorDialogActivity.java
@@ -16,7 +16,6 @@
 
 package com.android.server.telecom.components;
 
-import com.android.server.telecom.Log;
 import com.android.server.telecom.R;
 
 import android.app.Activity;
@@ -24,6 +23,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
+import android.telecom.Log;
 
 // TODO: Needed for move to system service: import com.android.internal.R;
 
diff --git a/src/com/android/server/telecom/components/PrimaryCallReceiver.java b/src/com/android/server/telecom/components/PrimaryCallReceiver.java
index a05f04e..f19a243 100644
--- a/src/com/android/server/telecom/components/PrimaryCallReceiver.java
+++ b/src/com/android/server/telecom/components/PrimaryCallReceiver.java
@@ -1,11 +1,11 @@
 package com.android.server.telecom.components;
 
-import com.android.server.telecom.Log;
 import com.android.server.telecom.TelecomSystem;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.telecom.Log;
 
 /**
  * Single point of entry for all outgoing and incoming calls. {@link UserCallIntentProcessor} serves
diff --git a/src/com/android/server/telecom/components/TelecomService.java b/src/com/android/server/telecom/components/TelecomService.java
index 92906e2..a066b6c 100644
--- a/src/com/android/server/telecom/components/TelecomService.java
+++ b/src/com/android/server/telecom/components/TelecomService.java
@@ -27,6 +27,7 @@
 import android.os.PowerManager;
 import android.os.ServiceManager;
 import android.service.notification.ZenModeConfig;
+import android.telecom.Log;
 
 import com.android.internal.telephony.CallerInfoAsyncQuery;
 import com.android.server.telecom.AsyncRingtonePlayer;
@@ -34,6 +35,7 @@
 import com.android.server.telecom.BluetoothPhoneServiceImpl;
 import com.android.server.telecom.CallerInfoAsyncQueryFactory;
 import com.android.server.telecom.CallsManager;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.HeadsetMediaButton;
 import com.android.server.telecom.HeadsetMediaButtonFactory;
 import com.android.server.telecom.InCallWakeLockControllerFactory;
@@ -44,7 +46,6 @@
 import com.android.server.telecom.PhoneNumberUtilsAdapterImpl;
 import com.android.server.telecom.ProximitySensorManagerFactory;
 import com.android.server.telecom.InCallWakeLockController;
-import com.android.server.telecom.Log;
 import com.android.server.telecom.ProximitySensorManager;
 import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.TelecomWakeLock;
@@ -88,9 +89,9 @@
                                 public MissedCallNotifierImpl makeMissedCallNotifierImpl(
                                         Context context,
                                         PhoneAccountRegistrar phoneAccountRegistrar,
-                                        PhoneNumberUtilsAdapter phoneNumberUtilsAdapter) {
+                                        DefaultDialerCache defaultDialerCache) {
                                     return new MissedCallNotifierImpl(context,
-                                            phoneAccountRegistrar, phoneNumberUtilsAdapter);
+                                            phoneAccountRegistrar, defaultDialerCache);
                                 }
                             },
                             new CallerInfoAsyncQueryFactory() {
diff --git a/src/com/android/server/telecom/components/UserCallActivity.java b/src/com/android/server/telecom/components/UserCallActivity.java
index 39cb4f9..1a3c77a 100644
--- a/src/com/android/server/telecom/components/UserCallActivity.java
+++ b/src/com/android/server/telecom/components/UserCallActivity.java
@@ -17,7 +17,6 @@
 package com.android.server.telecom.components;
 
 import com.android.server.telecom.CallIntentProcessor;
-import com.android.server.telecom.Log;
 import com.android.server.telecom.TelecomSystem;
 
 import android.app.Activity;
@@ -26,6 +25,7 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.telecom.Log;
 import android.telecom.TelecomManager;
 
 // TODO: Needed for move to system service: import com.android.internal.R;
@@ -64,7 +64,10 @@
             // accurately determine whether the calling package has the CALL_PHONE runtime permission.
             // At this point in time we trust that the ActivityManager has already performed this
             // validation before starting this activity.
-            new UserCallIntentProcessor(this, userHandle).processIntent(getIntent(),
+            // Create a new instance of intent to avoid modifying the
+            // ActivityThread.ActivityClientRecord#intent directly.
+            // Modifying directly may be a potential risk when relaunching this activity.
+            new UserCallIntentProcessor(this, userHandle).processIntent(new Intent(intent),
                     getCallingPackage(), true /* hasCallAppOp*/);
         } finally {
             Log.endSession();
diff --git a/src/com/android/server/telecom/components/UserCallIntentProcessor.java b/src/com/android/server/telecom/components/UserCallIntentProcessor.java
index a513bcf..a95768e 100644
--- a/src/com/android/server/telecom/components/UserCallIntentProcessor.java
+++ b/src/com/android/server/telecom/components/UserCallIntentProcessor.java
@@ -17,7 +17,6 @@
 package com.android.server.telecom.components;
 
 import com.android.server.telecom.CallIntentProcessor;
-import com.android.server.telecom.Log;
 import com.android.server.telecom.R;
 import com.android.server.telecom.TelephonyUtil;
 import com.android.server.telecom.UserUtil;
@@ -32,6 +31,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.telecom.DefaultDialerManager;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
diff --git a/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java b/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java
index 16d4249..e240009 100644
--- a/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java
+++ b/src/com/android/server/telecom/ui/MissedCallNotifierImpl.java
@@ -18,25 +18,21 @@
 
 import static android.Manifest.permission.READ_PHONE_STATE;
 
-import android.content.ComponentName;
+import android.annotation.NonNull;
 import android.content.ContentProvider;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.telecom.Logging.Runnable;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 
-import com.android.server.telecom.Call;
-import com.android.server.telecom.CallState;
-import com.android.server.telecom.CallerInfoAsyncQueryFactory;
-import com.android.server.telecom.CallsManager;
+import com.android.server.telecom.CallerInfoLookupHelper;
 import com.android.server.telecom.CallsManagerListenerBase;
 import com.android.server.telecom.Constants;
-import com.android.server.telecom.ContactsAsyncHelper;
-import com.android.server.telecom.Log;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.MissedCallNotifier;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.PhoneNumberUtilsAdapter;
 import com.android.server.telecom.R;
-import com.android.server.telecom.Runnable;
 import com.android.server.telecom.TelecomBroadcastIntentProcessor;
 import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.components.TelecomBroadcastReceiver;
@@ -59,8 +55,7 @@
 import android.os.Binder;
 import android.os.UserHandle;
 import android.provider.CallLog.Calls;
-import android.telecom.DefaultDialerManager;
-import android.telecom.DisconnectCause;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
@@ -74,6 +69,7 @@
 import java.lang.String;
 import java.util.List;
 import java.util.Locale;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -84,18 +80,13 @@
  * Creates a notification for calls that the user missed (neither answered nor rejected).
  *
  * TODO: Make TelephonyManager.clearMissedCalls call into this class.
- *
- * TODO: Reduce dependencies in this implementation; remove the need to create a new Call
- *     simply to look up caller metadata, and if possible, make it unnecessary to get a
- *     direct reference to the CallsManager. Try to make this class simply handle the UI
- *     and Android-framework entanglements of missed call notification.
  */
 public class MissedCallNotifierImpl extends CallsManagerListenerBase implements MissedCallNotifier {
 
     public interface MissedCallNotifierImplFactory {
         MissedCallNotifier makeMissedCallNotifierImpl(Context context,
                 PhoneAccountRegistrar phoneAccountRegistrar,
-                PhoneNumberUtilsAdapter phoneNumberUtilsAdapter);
+                DefaultDialerCache defaultDialerCache);
     }
 
     public interface NotificationBuilderFactory {
@@ -120,12 +111,16 @@
         Calls.TYPE,
     };
 
-    private static final int CALL_LOG_COLUMN_ID = 0;
-    private static final int CALL_LOG_COLUMN_NUMBER = 1;
-    private static final int CALL_LOG_COLUMN_NUMBER_PRESENTATION = 2;
-    private static final int CALL_LOG_COLUMN_DATE = 3;
-    private static final int CALL_LOG_COLUMN_DURATION = 4;
-    private static final int CALL_LOG_COLUMN_TYPE = 5;
+    private static final String CALL_LOG_WHERE_CLAUSE = "type=" + Calls.MISSED_TYPE +
+            " AND new=1" +
+            " AND is_read=0";
+
+    public static final int CALL_LOG_COLUMN_ID = 0;
+    public static final int CALL_LOG_COLUMN_NUMBER = 1;
+    public static final int CALL_LOG_COLUMN_NUMBER_PRESENTATION = 2;
+    public static final int CALL_LOG_COLUMN_DATE = 3;
+    public static final int CALL_LOG_COLUMN_DURATION = 4;
+    public static final int CALL_LOG_COLUMN_TYPE = 5;
 
     private static final int MISSED_CALL_NOTIFICATION_ID = 1;
 
@@ -133,27 +128,29 @@
     private final PhoneAccountRegistrar mPhoneAccountRegistrar;
     private final NotificationManager mNotificationManager;
     private final NotificationBuilderFactory mNotificationBuilderFactory;
-    private final PhoneNumberUtilsAdapter mPhoneNumberUtilsAdapter;
+    private final DefaultDialerCache mDefaultDialerCache;
     private UserHandle mCurrentUserHandle;
 
     // Used to track the number of missed calls.
     private ConcurrentMap<UserHandle, AtomicInteger> mMissedCallCounts;
 
+    private UserHandle userToLoadAfterBootComplete;
+
     public MissedCallNotifierImpl(Context context, PhoneAccountRegistrar phoneAccountRegistrar,
-            PhoneNumberUtilsAdapter phoneNumberUtilsAdapter) {
-        this(context, phoneAccountRegistrar, phoneNumberUtilsAdapter,
+            DefaultDialerCache defaultDialerCache) {
+        this(context, phoneAccountRegistrar, defaultDialerCache,
                 new DefaultNotificationBuilderFactory());
     }
 
     public MissedCallNotifierImpl(Context context,
             PhoneAccountRegistrar phoneAccountRegistrar,
-            PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
+            DefaultDialerCache defaultDialerCache,
             NotificationBuilderFactory notificationBuilderFactory) {
         mContext = context;
         mPhoneAccountRegistrar = phoneAccountRegistrar;
-        mPhoneNumberUtilsAdapter = phoneNumberUtilsAdapter;
         mNotificationManager =
                 (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+        mDefaultDialerCache = defaultDialerCache;
 
         mNotificationBuilderFactory = notificationBuilderFactory;
         mMissedCallCounts = new ConcurrentHashMap<>();
@@ -197,7 +194,8 @@
     }
 
     /**
-     * Returns the missed-call notificatino intent to send to the default dialer for the given user.     * Note, the passed in userHandle is always the non-managed user for SIM calls (multi-user
+     * Returns the missed-call notification intent to send to the default dialer for the given user.
+     * Note, the passed in userHandle is always the non-managed user for SIM calls (multi-user
      * calls). In this case we return the default dialer for the logged in user. This is never the
      * managed (work profile) dialer.
      *
@@ -206,8 +204,8 @@
      * dialer for the given user which could be a managed (work profile) dialer.
      */
     private Intent getShowMissedCallIntentForDefaultDialer(UserHandle userHandle) {
-        String dialerPackage = DefaultDialerManager
-                .getDefaultDialerApplication(mContext, userHandle.getIdentifier());
+        String dialerPackage = mDefaultDialerCache.getDefaultDialerApplication(
+                userHandle.getIdentifier());
         if (TextUtils.isEmpty(dialerPackage)) {
             return null;
         }
@@ -226,7 +224,7 @@
         return receivers.size() > 0;
     }
 
-    private void sendNotificationThroughDefaultDialer(Call call, UserHandle userHandle) {
+    private void sendNotificationThroughDefaultDialer(CallInfo callInfo, UserHandle userHandle) {
         int count = mMissedCallCounts.get(userHandle).get();
         Intent intent = getShowMissedCallIntentForDefaultDialer(userHandle)
             .setFlags(Intent.FLAG_RECEIVER_FOREGROUND)
@@ -234,10 +232,10 @@
                     createClearMissedCallsPendingIntent(userHandle))
             .putExtra(TelecomManager.EXTRA_NOTIFICATION_COUNT, count)
             .putExtra(TelecomManager.EXTRA_NOTIFICATION_PHONE_NUMBER,
-                    call != null ? call.getPhoneNumber() : null);
+                    callInfo == null ? null : callInfo.getPhoneNumber());
 
-        if (count == 1 && call != null) {
-            final Uri handleUri = call.getHandle();
+        if (count == 1 && callInfo != null) {
+            final Uri handleUri = callInfo.getHandle();
             String handle = handleUri == null ? null : handleUri.getSchemeSpecificPart();
 
             if (!TextUtils.isEmpty(handle) && !TextUtils.equals(handle,
@@ -258,8 +256,8 @@
      * @param call The missed call.
      */
     @Override
-    public void showMissedCallNotification(Call call) {
-        final PhoneAccountHandle phoneAccountHandle = call.getTargetPhoneAccount();
+    public void showMissedCallNotification(@NonNull CallInfo callInfo) {
+        final PhoneAccountHandle phoneAccountHandle = callInfo.getPhoneAccountHandle();
         final PhoneAccount phoneAccount =
                 mPhoneAccountRegistrar.getPhoneAccountUnchecked(phoneAccountHandle);
         UserHandle userHandle;
@@ -269,15 +267,16 @@
         } else {
             userHandle = phoneAccountHandle.getUserHandle();
         }
-        showMissedCallNotification(call, userHandle);
+        showMissedCallNotification(callInfo, userHandle);
     }
 
-    private void showMissedCallNotification(Call call, UserHandle userHandle) {
+    private void showMissedCallNotification(@NonNull CallInfo callInfo, UserHandle userHandle) {
+        Log.i(this, "showMissedCallNotification()");
         mMissedCallCounts.putIfAbsent(userHandle, new AtomicInteger(0));
         int missCallCounts = mMissedCallCounts.get(userHandle).incrementAndGet();
 
         if (shouldManageNotificationThroughDefaultDialer(userHandle)) {
-            sendNotificationThroughDefaultDialer(call, userHandle);
+            sendNotificationThroughDefaultDialer(callInfo, userHandle);
             return;
         }
 
@@ -288,9 +287,9 @@
         // 1 missed call: <caller name || handle>
         // More than 1 missed call: <number of calls> + "missed calls"
         if (missCallCounts == 1) {
-            expandedText = getNameForCall(call);
+            expandedText = getNameForMissedCallNotification(callInfo);
 
-            CallerInfo ci = call.getCallerInfo();
+            CallerInfo ci = callInfo.getCallerInfo();
             if (ci != null && ci.userType == CallerInfo.USER_TYPE_WORK) {
                 titleResId = R.string.notification_missedWorkCallTitle;
             } else {
@@ -309,7 +308,7 @@
         Notification.Builder publicBuilder = mNotificationBuilderFactory.getBuilder(contextForUser);
         publicBuilder.setSmallIcon(android.R.drawable.stat_notify_missed_call)
                 .setColor(mContext.getResources().getColor(R.color.theme_color))
-                .setWhen(call.getCreationTimeMillis())
+                .setWhen(callInfo.getCreationTimeMillis())
                 // Show "Phone" for notification title.
                 .setContentTitle(mContext.getText(R.string.userCallActivityLabel))
                 // Notification details shows that there are missed call(s), but does not reveal
@@ -323,7 +322,7 @@
         Notification.Builder builder = mNotificationBuilderFactory.getBuilder(contextForUser);
         builder.setSmallIcon(android.R.drawable.stat_notify_missed_call)
                 .setColor(mContext.getResources().getColor(R.color.theme_color))
-                .setWhen(call.getCreationTimeMillis())
+                .setWhen(callInfo.getCreationTimeMillis())
                 .setContentTitle(mContext.getText(titleResId))
                 .setContentText(expandedText)
                 .setContentIntent(createCallLogPendingIntent(userHandle))
@@ -334,8 +333,8 @@
                 // sensitive notification information.
                 .setPublicVersion(publicBuilder.build());
 
-        Uri handleUri = call.getHandle();
-        String handle = handleUri == null ? null : handleUri.getSchemeSpecificPart();
+        Uri handleUri = callInfo.getHandle();
+        String handle = callInfo.getHandleSchemeSpecificPart();
 
         // Add additional actions when there is only 1 missed call, like call-back and SMS.
         if (missCallCounts == 1) {
@@ -347,18 +346,20 @@
                         mContext.getString(R.string.notification_missedCall_call_back),
                         createCallBackPendingIntent(handleUri, userHandle));
 
-                if (canRespondViaSms(call)) {
+                if (canRespondViaSms(callInfo)) {
                     builder.addAction(R.drawable.ic_message_24dp,
                             mContext.getString(R.string.notification_missedCall_message),
                             createSendSmsFromNotificationPendingIntent(handleUri, userHandle));
                 }
             }
 
-            Bitmap photoIcon = call.getPhotoIcon();
+            Bitmap photoIcon = callInfo.getCallerInfo() == null ?
+                    null : callInfo.getCallerInfo().cachedPhotoIcon;
             if (photoIcon != null) {
                 builder.setLargeIcon(photoIcon);
             } else {
-                Drawable photo = call.getPhoto();
+                Drawable photo = callInfo.getCallerInfo() == null ?
+                        null : callInfo.getCallerInfo().cachedPhoto;
                 if (photo != null && photo instanceof BitmapDrawable) {
                     builder.setLargeIcon(((BitmapDrawable) photo).getBitmap());
                 }
@@ -371,7 +372,7 @@
         Notification notification = builder.build();
         configureLedOnNotification(notification);
 
-        Log.i(this, "Adding missed call notification for %s.", call);
+        Log.i(this, "Adding missed call notification for %s.", Log.pii(callInfo.getHandle()));
         long token = Binder.clearCallingIdentity();
         try {
             mNotificationManager.notifyAsUser(
@@ -404,9 +405,9 @@
     /**
      * Returns the name to use in the missed call notification.
      */
-    private String getNameForCall(Call call) {
-        String handle = call.getHandle() == null ? null : call.getHandle().getSchemeSpecificPart();
-        String name = call.getName();
+    private String getNameForMissedCallNotification(@NonNull CallInfo callInfo) {
+        String handle = callInfo.getHandleSchemeSpecificPart();
+        String name = callInfo.getName();
 
         if (!TextUtils.isEmpty(handle)) {
             String formattedNumber = PhoneNumberUtils.formatNumber(handle,
@@ -512,7 +513,7 @@
             UserHandle userHandle) {
         Intent intent = new Intent(action, data, mContext, TelecomBroadcastReceiver.class);
         intent.putExtra(TelecomBroadcastIntentProcessor.EXTRA_USERHANDLE, userHandle);
-        return PendingIntent.getBroadcast(mContext, 0, intent, 0);
+        return PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
     }
 
     /**
@@ -523,23 +524,34 @@
         notification.defaults |= Notification.DEFAULT_LIGHTS;
     }
 
-    private boolean canRespondViaSms(Call call) {
+    private boolean canRespondViaSms(@NonNull CallInfo callInfo) {
         // Only allow respond-via-sms for "tel:" calls.
-        return call.getHandle() != null &&
-                PhoneAccount.SCHEME_TEL.equals(call.getHandle().getScheme());
+        return callInfo.getHandle() != null &&
+                PhoneAccount.SCHEME_TEL.equals(callInfo.getHandle().getScheme());
     }
 
+    @Override
+    public void reloadAfterBootComplete(final CallerInfoLookupHelper callerInfoLookupHelper,
+            CallInfoFactory callInfoFactory) {
+        if (userToLoadAfterBootComplete != null) {
+            reloadFromDatabase(callerInfoLookupHelper,
+                    callInfoFactory, userToLoadAfterBootComplete);
+            userToLoadAfterBootComplete = null;
+        }
+    }
     /**
      * Adds the missed call notification on startup if there are unread missed calls.
      */
     @Override
-    public void reloadFromDatabase(
-            final TelecomSystem.SyncRoot lock,
-            final CallsManager callsManager,
-            final ContactsAsyncHelper contactsAsyncHelper,
-            final CallerInfoAsyncQueryFactory callerInfoAsyncQueryFactory,
-            final UserHandle userHandle) {
+    public void reloadFromDatabase(final CallerInfoLookupHelper callerInfoLookupHelper,
+            CallInfoFactory callInfoFactory, final UserHandle userHandle) {
         Log.d(this, "reloadFromDatabase()...");
+        if (TelecomSystem.getInstance() == null || !TelecomSystem.getInstance().isBootComplete()) {
+            Log.i(this, "Boot not yet complete -- call log db may not be available. Deferring " +
+                    "loading until boot complete.");
+            userToLoadAfterBootComplete = userHandle;
+            return;
+        }
 
         // instantiate query handler
         AsyncQueryHandler queryHandler = new AsyncQueryHandler(mContext.getContentResolver()) {
@@ -566,35 +578,42 @@
                                                 handleString, null);
                             }
 
-                            synchronized (lock) {
+                            callerInfoLookupHelper.startLookup(handle,
+                                    new CallerInfoLookupHelper.OnQueryCompleteListener() {
+                                        @Override
+                                        public void onCallerInfoQueryComplete(Uri queryHandle,
+                                                CallerInfo info) {
+                                            if (!Objects.equals(queryHandle, handle)) {
+                                                Log.w(MissedCallNotifierImpl.this,
+                                                        "CallerInfo query returned with " +
+                                                                "different handle.");
+                                                return;
+                                            }
+                                            if (info == null ||
+                                                    info.contactDisplayPhotoUri == null) {
+                                                // If there is no photo or if the caller info is
+                                                // null, just show the notification.
+                                                CallInfo callInfo = callInfoFactory.makeCallInfo(
+                                                        info, null, handle, date);
+                                                showMissedCallNotification(callInfo, userHandle);
+                                            }
+                                        }
 
-                                // Convert the data to a call object
-                                Call call = new Call(Call.CALL_ID_UNKNOWN, mContext, callsManager,
-                                        lock, null, contactsAsyncHelper,
-                                        callerInfoAsyncQueryFactory, mPhoneNumberUtilsAdapter, null,
-                                        null, null, null, Call.CALL_DIRECTION_INCOMING, false,
-                                        false);
-                                call.setDisconnectCause(
-                                        new DisconnectCause(DisconnectCause.MISSED));
-                                call.setState(CallState.DISCONNECTED, "throw away call");
-                                call.setCreationTimeMillis(date);
-
-                                // Listen for the update to the caller information before posting
-                                // the notification so that we have the contact info and photo.
-                                call.addListener(new Call.ListenerBase() {
-                                    @Override
-                                    public void onCallerInfoChanged(Call call) {
-                                        call.removeListener(
-                                                this);  // No longer need to listen to call
-                                        // changes after the contact info
-                                        // is retrieved.
-                                        showMissedCallNotification(call, userHandle);
+                                        @Override
+                                        public void onContactPhotoQueryComplete(Uri queryHandle,
+                                                CallerInfo info) {
+                                            if (!Objects.equals(queryHandle, handle)) {
+                                                Log.w(MissedCallNotifierImpl.this,
+                                                        "CallerInfo query for photo returned " +
+                                                                "with different handle.");
+                                                return;
+                                            }
+                                            CallInfo callInfo = callInfoFactory.makeCallInfo(
+                                                    info, null, handle, date);
+                                            showMissedCallNotification(callInfo, userHandle);
+                                        }
                                     }
-                                });
-                                // Set the handle here because that is what triggers the contact
-                                // info query.
-                                call.setHandle(handle, presentation);
-                            }
+                            );
                         }
                     } finally {
                         cursor.close();
@@ -604,16 +623,11 @@
         };
 
         // setup query spec, look for all Missed calls that are new.
-        StringBuilder where = new StringBuilder("type=");
-        where.append(Calls.MISSED_TYPE);
-        where.append(" AND new=1");
-        where.append(" AND is_read=0");
-
         Uri callsUri =
                 ContentProvider.maybeAddUserId(Calls.CONTENT_URI, userHandle.getIdentifier());
         // start the query
         queryHandler.startQuery(0, null, callsUri, CALL_LOG_PROJECTION,
-                where.toString(), null, Calls.DEFAULT_SORT_ORDER);
+                CALL_LOG_WHERE_CLAUSE, null, Calls.DEFAULT_SORT_ORDER);
     }
 
     @Override
diff --git a/tests/Android.mk b/tests/Android.mk
index 8a8113b..f4b8256 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -22,7 +22,8 @@
         android-support-v4 \
         guava \
         mockito-target \
-        platform-test-annotations
+        platform-test-annotations \
+        legacy-android-test
 
 LOCAL_SRC_FILES := \
         $(call all-java-files-under, src) \
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index f84a545..eccd513 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -29,6 +29,7 @@
 
     <!-- TODO: Needed because we call ActivityManager.getCurrentUser() statically. -->
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
     <uses-permission android:name="android.permission.MANAGE_USERS" />
 
     <!-- Used to access TelephonyManager APIs -->
diff --git a/tests/src/com/android/server/telecom/tests/AnalyticsTests.java b/tests/src/com/android/server/telecom/tests/AnalyticsTests.java
index 021ce82..601e1b6 100644
--- a/tests/src/com/android/server/telecom/tests/AnalyticsTests.java
+++ b/tests/src/com/android/server/telecom/tests/AnalyticsTests.java
@@ -20,6 +20,7 @@
 import android.telecom.Connection;
 import android.telecom.DisconnectCause;
 import android.telecom.InCallService;
+import android.telecom.Log;
 import android.telecom.ParcelableCallAnalytics;
 import android.telecom.TelecomAnalytics;
 import android.telecom.TelecomManager;
@@ -31,7 +32,7 @@
 
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.telecom.Analytics;
-import com.android.server.telecom.Log;
+import com.android.server.telecom.LogUtils;
 import com.android.server.telecom.TelecomLogClass;
 
 import java.io.PrintWriter;
@@ -245,13 +246,13 @@
     @SmallTest
     public void testAnalyticsLogSessionTiming() throws Exception {
         long minTime = 50;
-        Log.startSession(Log.Sessions.CSW_ADD_CONFERENCE_CALL);
+        Log.startSession(LogUtils.Sessions.CSW_ADD_CONFERENCE_CALL);
         Thread.sleep(minTime);
         Log.endSession();
         TelecomManager tm = (TelecomManager) mSpyContext.getSystemService(Context.TELECOM_SERVICE);
         List<TelecomAnalytics.SessionTiming> sessions = tm.dumpAnalytics().getSessionTimings();
         sessions.stream()
-                .filter(s -> Log.Sessions.CSW_ADD_CONFERENCE_CALL.equals(
+                .filter(s -> LogUtils.Sessions.CSW_ADD_CONFERENCE_CALL.equals(
                         Analytics.sSessionIdToLogSession.get(s.getKey())))
                 .forEach(s -> assertTrue(s.getTime() >= minTime));
     }
diff --git a/tests/src/com/android/server/telecom/tests/BasicCallTests.java b/tests/src/com/android/server/telecom/tests/BasicCallTests.java
index 6688ca0..c44185c 100644
--- a/tests/src/com/android/server/telecom/tests/BasicCallTests.java
+++ b/tests/src/com/android/server/telecom/tests/BasicCallTests.java
@@ -41,6 +41,7 @@
 import android.telecom.Connection;
 import android.telecom.ConnectionRequest;
 import android.telecom.DisconnectCause;
+import android.telecom.Log;
 import android.telecom.ParcelableCall;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
@@ -51,7 +52,6 @@
 
 import com.android.internal.telecom.IInCallAdapter;
 import com.android.internal.telephony.CallerInfo;
-import com.android.server.telecom.Log;
 
 import com.google.common.base.Predicate;
 
@@ -122,7 +122,7 @@
         telecomManager.acceptRingingCall();
 
         verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT))
-                .answer(ids.mConnectionId);
+                .answer(eq(ids.mConnectionId), any());
         mConnectionServiceFixtureA.sendSetActive(ids.mConnectionId);
 
         mInCallServiceFixtureX.mInCallAdapter.disconnectCall(ids.mCallId);
@@ -150,7 +150,7 @@
 
         // Answer video API should be called
         verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT))
-                .answerVideo(eq(ids.mConnectionId), eq(VideoProfile.STATE_BIDIRECTIONAL));
+                .answerVideo(eq(ids.mConnectionId), eq(VideoProfile.STATE_BIDIRECTIONAL), any());
         mConnectionServiceFixtureA.sendSetActive(ids.mConnectionId);
 
         mInCallServiceFixtureX.mInCallAdapter.disconnectCall(ids.mCallId);
@@ -177,7 +177,7 @@
 
         // The generic answer method on the ConnectionService is used to answer audio-only calls.
         verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT))
-                .answer(eq(ids.mConnectionId));
+                .answer(eq(ids.mConnectionId), any());
         mConnectionServiceFixtureA.sendSetActive(ids.mConnectionId);
 
         mInCallServiceFixtureX.mInCallAdapter.disconnectCall(ids.mCallId);
@@ -205,7 +205,7 @@
 
         // Answer video API should be called
         verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT))
-                .answerVideo(eq(ids.mConnectionId), eq(VideoProfile.STATE_BIDIRECTIONAL));
+                .answerVideo(eq(ids.mConnectionId), eq(VideoProfile.STATE_BIDIRECTIONAL), any());
         mConnectionServiceFixtureA.sendSetActive(ids.mConnectionId);
         mInCallServiceFixtureX.mInCallAdapter.disconnectCall(ids.mCallId);
     }
@@ -276,7 +276,7 @@
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
         verify(mConnectionServiceFixtureA.getTestDouble())
                 .createConnection(any(PhoneAccountHandle.class), anyString(),
-                        any(ConnectionRequest.class), eq(true), eq(false));
+                        any(ConnectionRequest.class), eq(true), eq(false), any());
 
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
         assertEquals(1, mCallerInfoAsyncQueryFactoryFixture.mRequests.size());
@@ -318,7 +318,7 @@
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
         verify(mConnectionServiceFixtureA.getTestDouble())
                 .createConnection(any(PhoneAccountHandle.class), anyString(),
-                        any(ConnectionRequest.class), eq(true), eq(false));
+                        any(ConnectionRequest.class), eq(true), eq(false), any());
 
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
         // Never reply to the caller info lookup.
@@ -363,7 +363,7 @@
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
         verify(mConnectionServiceFixtureA.getTestDouble())
                 .createConnection(any(PhoneAccountHandle.class), anyString(),
-                        any(ConnectionRequest.class), eq(true), eq(false));
+                        any(ConnectionRequest.class), eq(true), eq(false), any());
 
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
         assertEquals(1, mCallerInfoAsyncQueryFactoryFixture.mRequests.size());
@@ -467,7 +467,7 @@
         IdPair incoming = startAndMakeActiveIncomingCall("650-555-2323",
                 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA);
         verify(mConnectionServiceFixtureA.getTestDouble())
-                .hold(outgoing.mConnectionId);
+                .hold(eq(outgoing.mConnectionId), any());
         mConnectionServiceFixtureA.mConnectionById.get(outgoing.mConnectionId).state =
                 Connection.STATE_HOLDING;
         mConnectionServiceFixtureA.sendSetOnHold(outgoing.mConnectionId);
@@ -595,12 +595,13 @@
 
         // Attempt to pull the call and verify the API call makes it through
         mInCallServiceFixtureX.mInCallAdapter.pullExternalCall(ids.mCallId);
-        verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT).never())
-                .pullExternalCall(ids.mCallId);
+        Thread.sleep(TEST_TIMEOUT);
+        verify(mConnectionServiceFixtureA.getTestDouble(), never())
+                .pullExternalCall(eq(ids.mCallId), any());
     }
 
     /**
-     * Tests the {@link Connection#sendConnectionEvent(String)} API.
+     * Tests the {@link Connection#sendConnectionEvent(String, Bundle)} API.
      *
      * @throws Exception
      */
@@ -615,7 +616,7 @@
     }
 
     /**
-     * Tests the {@link Connection#sendConnectionEvent(String)} API.
+     * Tests the {@link Connection#sendConnectionEvent(String, Bundle)} API.
      *
      * @throws Exception
      */
@@ -648,7 +649,7 @@
 
         mInCallServiceFixtureX.mInCallAdapter.sendCallEvent(ids.mCallId, TEST_EVENT, null);
         verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT))
-                .sendCallEvent(ids.mConnectionId, TEST_EVENT, null);
+                .sendCallEvent(eq(ids.mConnectionId), eq(TEST_EVENT), isNull(Bundle.class), any());
     }
 
     /**
@@ -670,7 +671,7 @@
                 testBundle);
         verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT))
                 .sendCallEvent(eq(ids.mConnectionId), eq(TEST_EVENT),
-                        bundleArgumentCaptor.capture());
+                        bundleArgumentCaptor.capture(), any());
         assert (bundleArgumentCaptor.getValue().containsKey(TEST_BUNDLE_KEY));
     }
 
@@ -767,7 +768,7 @@
         // Attempt to pull the call and verify the API call makes it through
         mInCallServiceFixtureX.mInCallAdapter.pullExternalCall(ids.mCallId);
         verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT))
-                .pullExternalCall(ids.mConnectionId);
+                .pullExternalCall(eq(ids.mConnectionId), any());
     }
 
     /**
@@ -790,38 +791,9 @@
 
         // Attempt to pull the call and verify the API call makes it through
         mInCallServiceFixtureX.mInCallAdapter.pullExternalCall(ids.mCallId);
-        verify(mConnectionServiceFixtureA.getTestDouble(), timeout(TEST_TIMEOUT).never())
-                .pullExternalCall(ids.mConnectionId);
-    }
-
-    public void testMergeFailedAndNotifyInCallUi() throws Exception {
-        IdPair testCall1 = startAndMakeActiveOutgoingCall(
-                "650-555-1212",
-                mPhoneAccountA0.getAccountHandle(),
-                mConnectionServiceFixtureA);
-        IdPair testCall2 = startAndMakeActiveOutgoingCall(
-                "650-555-1213",
-                mPhoneAccountA0.getAccountHandle(),
-                mConnectionServiceFixtureA);
-
-        assertEquals(Call.STATE_ACTIVE,
-                mInCallServiceFixtureX.getCall(testCall1.mCallId).getState());
-        assertEquals(Call.STATE_ACTIVE,
-                mInCallServiceFixtureX.getCall(testCall2.mCallId).getState());
-        assertEquals(Call.STATE_ACTIVE,
-                mInCallServiceFixtureY.getCall(testCall1.mCallId).getState());
-        assertEquals(Call.STATE_ACTIVE,
-                mInCallServiceFixtureY.getCall(testCall2.mCallId).getState());
-
-        // Conference will not occur and instead will send setConferenceMergeFailed
-        ((ConnectionServiceFixture.FakeConnection)
-                mConnectionServiceFixtureA.mLatestConnection).setIsConferenceCreated(false);
-        mInCallServiceFixtureX.getInCallAdapter().conference(testCall2.mCallId, testCall1.mCallId);
-
-        verify(mInCallServiceFixtureX.getTestDouble(), timeout(TEST_TIMEOUT)).onConnectionEvent(
-                eq(testCall2.mCallId), eq(Connection.EVENT_CALL_MERGE_FAILED), any(Bundle.class));
-        verify(mInCallServiceFixtureY.getTestDouble(), timeout(TEST_TIMEOUT)).onConnectionEvent(
-                eq(testCall2.mCallId), eq(Connection.EVENT_CALL_MERGE_FAILED), any(Bundle.class));
+        Thread.sleep(TEST_TIMEOUT);
+        verify(mConnectionServiceFixtureA.getTestDouble(), never())
+                .pullExternalCall(eq(ids.mConnectionId), any());
     }
 
     @LargeTest
diff --git a/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java b/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
new file mode 100644
index 0000000..c8cde98
--- /dev/null
+++ b/tests/src/com/android/server/telecom/tests/BluetoothDeviceManagerTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2016 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.server.telecom.tests;
+
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadset;
+import android.bluetooth.BluetoothProfile;
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Parcel;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.server.telecom.BluetoothAdapterProxy;
+import com.android.server.telecom.BluetoothHeadsetProxy;
+import com.android.server.telecom.TelecomSystem;
+import com.android.server.telecom.bluetooth.BluetoothDeviceManager;
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.verify;
+
+public class BluetoothDeviceManagerTest extends TelecomTestCase {
+    @Mock BluetoothRouteManager mRouteManager;
+    @Mock BluetoothHeadsetProxy mHeadsetProxy;
+    @Mock BluetoothAdapterProxy mAdapterProxy;
+
+    BluetoothDeviceManager mBluetoothDeviceManager;
+    BluetoothProfile.ServiceListener serviceListenerUnderTest;
+    BroadcastReceiver receiverUnderTest;
+
+    private BluetoothDevice device1;
+    private BluetoothDevice device2;
+    private BluetoothDevice device3;
+
+    public void setUp() throws Exception {
+        super.setUp();
+        device1 = makeBluetoothDevice("00:00:00:00:00:01");
+        device2 = makeBluetoothDevice("00:00:00:00:00:02");
+        device3 = makeBluetoothDevice("00:00:00:00:00:03");
+
+        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
+        mBluetoothDeviceManager = new BluetoothDeviceManager(mContext, mAdapterProxy,
+                new TelecomSystem.SyncRoot() { });
+        mBluetoothDeviceManager.setBluetoothRouteManager(mRouteManager);
+
+        ArgumentCaptor<BluetoothProfile.ServiceListener> serviceCaptor =
+                ArgumentCaptor.forClass(BluetoothProfile.ServiceListener.class);
+        verify(mAdapterProxy).getProfileProxy(eq(mContext),
+                serviceCaptor.capture(), eq(BluetoothProfile.HEADSET));
+        serviceListenerUnderTest = serviceCaptor.getValue();
+
+        ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+        ArgumentCaptor<IntentFilter> intentFilterCaptor =
+                ArgumentCaptor.forClass(IntentFilter.class);
+        verify(mContext).registerReceiver(receiverCaptor.capture(), intentFilterCaptor.capture());
+        assertTrue(intentFilterCaptor.getValue().hasAction(
+                BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED));
+        receiverUnderTest = receiverCaptor.getValue();
+
+        mBluetoothDeviceManager.setHeadsetServiceForTesting(mHeadsetProxy);
+    }
+
+    @SmallTest
+    public void testSingleDeviceConnectAndDisconnect() {
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device1));
+        assertEquals(1, mBluetoothDeviceManager.getNumConnectedDevices());
+        assertEquals(device1.getAddress(),
+                mBluetoothDeviceManager.getMostRecentlyConnectedDevice(null));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_DISCONNECTED, device1));
+        assertEquals(0, mBluetoothDeviceManager.getNumConnectedDevices());
+        assertNull(mBluetoothDeviceManager.getMostRecentlyConnectedDevice(null));
+    }
+
+    @SmallTest
+    public void testMultiDeviceConnectAndDisconnect() {
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device1));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device2));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_DISCONNECTED, device1));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device3));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device2));
+        assertEquals(2, mBluetoothDeviceManager.getNumConnectedDevices());
+        assertEquals(device3.getAddress(),
+                mBluetoothDeviceManager.getMostRecentlyConnectedDevice(null));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_DISCONNECTED, device3));
+        assertEquals(1, mBluetoothDeviceManager.getNumConnectedDevices());
+        assertEquals(device2.getAddress(),
+                mBluetoothDeviceManager.getMostRecentlyConnectedDevice(null));
+    }
+
+    @SmallTest
+    public void testExclusionaryGetRecentDevices() {
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device1));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device2));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_DISCONNECTED, device1));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device3));
+        receiverUnderTest.onReceive(mContext,
+                buildConnectionActionIntent(BluetoothHeadset.STATE_CONNECTED, device2));
+        assertEquals(2, mBluetoothDeviceManager.getNumConnectedDevices());
+        assertEquals(device2.getAddress(),
+                mBluetoothDeviceManager.getMostRecentlyConnectedDevice(device3.getAddress()));
+    }
+
+    private Intent buildConnectionActionIntent(int state, BluetoothDevice device) {
+        Intent i = new Intent(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
+        i.putExtra(BluetoothHeadset.EXTRA_STATE, state);
+        i.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+        return i;
+    }
+
+    private BluetoothDevice makeBluetoothDevice(String address) {
+        Parcel p1 = Parcel.obtain();
+        p1.writeString(address);
+        p1.setDataPosition(0);
+        BluetoothDevice device = BluetoothDevice.CREATOR.createFromParcel(p1);
+        p1.recycle();
+        return device;
+    }
+}
diff --git a/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java b/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java
new file mode 100644
index 0000000..e6cb7bf
--- /dev/null
+++ b/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java
@@ -0,0 +1,722 @@
+/*
+ * Copyright (C) 2016 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.server.telecom.tests;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.ContentResolver;
+import android.os.Parcel;
+import android.telecom.Log;
+import android.test.suitebuilder.annotation.LargeTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Pair;
+
+import com.android.internal.os.SomeArgs;
+import com.android.server.telecom.BluetoothHeadsetProxy;
+import com.android.server.telecom.CallAudioModeStateMachine;
+import com.android.server.telecom.TelecomSystem;
+import com.android.server.telecom.Timeouts;
+import com.android.server.telecom.bluetooth.BluetoothDeviceManager;
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
+
+import org.mockito.Mock;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class BluetoothRouteManagerTest extends StateMachineTestBase<BluetoothRouteManager> {
+    private static class BluetoothRouteTestParametersBuilder {
+        private String name;
+        private String initialBluetoothState;
+        private BluetoothDevice initialDevice;
+        private BluetoothDevice audioOnDevice;
+        private int messageType;
+        private String messageDevice;
+        private Pair<Integer, Integer> expectedListenerUpdate;
+        private int expectedBluetoothInteraction;
+        private String expectedConnectionAddress;
+        private String expectedFinalStateName;
+        private BluetoothDevice[] connectedDevices;
+
+        public BluetoothRouteTestParametersBuilder setName(String name) {
+            this.name = name;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setInitialBluetoothState(
+                String initialBluetoothState) {
+            this.initialBluetoothState = initialBluetoothState;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setInitialDevice(BluetoothDevice
+                initialDevice) {
+            this.initialDevice = initialDevice;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setMessageType(int messageType) {
+            this.messageType = messageType;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setMessageDevice(String messageDevice) {
+            this.messageDevice = messageDevice;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setExpectedListenerUpdate(Pair<Integer,
+                Integer> expectedListenerUpdate) {
+            this.expectedListenerUpdate = expectedListenerUpdate;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setExpectedBluetoothInteraction(
+                int expectedBluetoothInteraction) {
+            this.expectedBluetoothInteraction = expectedBluetoothInteraction;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setExpectedConnectionAddress(String
+                expectedConnectionAddress) {
+            this.expectedConnectionAddress = expectedConnectionAddress;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setExpectedFinalStateName(
+                String expectedFinalStateName) {
+            this.expectedFinalStateName = expectedFinalStateName;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setConnectedDevices(
+                BluetoothDevice... connectedDevices) {
+            this.connectedDevices = connectedDevices;
+            return this;
+        }
+
+        public BluetoothRouteTestParametersBuilder setAudioOnDevice(BluetoothDevice device) {
+            this.audioOnDevice = device;
+            return this;
+        }
+
+        public BluetoothRouteTestParameters build() {
+            return new BluetoothRouteTestParameters(name,
+                    initialBluetoothState,
+                    initialDevice,
+                    messageType,
+                    expectedListenerUpdate,
+                    expectedBluetoothInteraction,
+                    expectedConnectionAddress,
+                    expectedFinalStateName,
+                    connectedDevices,
+                    messageDevice,
+                    audioOnDevice);
+        }
+    }
+
+    private static class BluetoothRouteTestParameters extends TestParameters {
+        public String name;
+        public String initialBluetoothState; // One of the state names or prefixes from BRM.
+        public BluetoothDevice initialDevice; // null if we start from AudioOff
+        public BluetoothDevice audioOnDevice; // The device (if any) that is active
+        public int messageType; // Any of the commands from the state machine
+        public String messageDevice; // The device that should be specified in the message.
+        // TODO: Change this when refactoring CARSM.
+        public Pair<Integer, Integer> expectedListenerUpdate; // (old state, new state)
+        public int expectedBluetoothInteraction; // NONE, CONNECT, or DISCONNECT
+        // TODO: this will always be none for now. Change once BT changes their API.
+        public String expectedConnectionAddress; // Expected device to connect to.
+        public String expectedFinalStateName; // Expected name of the final state.
+        public BluetoothDevice[] connectedDevices; // array of connected devices
+
+        public BluetoothRouteTestParameters(String name, String initialBluetoothState,
+                BluetoothDevice initialDevice, int messageType, Pair<Integer, Integer>
+                expectedListenerUpdate, int expectedBluetoothInteraction, String
+                expectedConnectionAddress, String expectedFinalStateName,
+                BluetoothDevice[] connectedDevices, String messageDevice,
+                BluetoothDevice audioOnDevice) {
+            this.name = name;
+            this.initialBluetoothState = initialBluetoothState;
+            this.initialDevice = initialDevice;
+            this.messageType = messageType;
+            this.expectedListenerUpdate = expectedListenerUpdate;
+            this.expectedBluetoothInteraction = expectedBluetoothInteraction;
+            this.expectedConnectionAddress = expectedConnectionAddress;
+            this.expectedFinalStateName = expectedFinalStateName;
+            this.connectedDevices = connectedDevices;
+            this.messageDevice = messageDevice;
+            this.audioOnDevice = audioOnDevice;
+        }
+
+        @Override
+        public String toString() {
+            return "BluetoothRouteTestParameters{" +
+                    "name='" + name + '\'' +
+                    ", initialBluetoothState='" + initialBluetoothState + '\'' +
+                    ", initialDevice=" + initialDevice +
+                    ", messageType=" + messageType +
+                    ", messageDevice='" + messageDevice + '\'' +
+                    ", expectedListenerUpdate=" + expectedListenerUpdate +
+                    ", expectedBluetoothInteraction=" + expectedBluetoothInteraction +
+                    ", expectedConnectionAddress='" + expectedConnectionAddress + '\'' +
+                    ", expectedFinalStateName='" + expectedFinalStateName + '\'' +
+                    ", connectedDevices=" + Arrays.toString(connectedDevices) +
+                    '}';
+        }
+    }
+
+    private static final int NONE = 1;
+    private static final int CONNECT = 2;
+    private static final int DISCONNECT = 3;
+
+    @Mock private BluetoothDeviceManager mDeviceManager;
+    @Mock private BluetoothHeadsetProxy mHeadsetProxy;
+    @Mock private Timeouts.Adapter mTimeoutsAdapter;
+    @Mock private BluetoothRouteManager.BluetoothStateListener mListener;
+
+    private BluetoothDevice device1;
+    private BluetoothDevice device2;
+    private BluetoothDevice device3;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
+
+        device1 = makeBluetoothDevice("00:00:00:00:00:01");
+        device2 = makeBluetoothDevice("00:00:00:00:00:02");
+        device3 = makeBluetoothDevice("00:00:00:00:00:03");
+    }
+
+    @LargeTest
+    public void testTransitions() throws Throwable {
+        List<BluetoothRouteTestParameters> testCases = generateTestCases();
+        parametrizedTestStateMachine(testCases);
+    }
+
+    @SmallTest
+    public void testConnectHfpRetryWhileNotConnected() {
+        BluetoothRouteManager sm = setupStateMachine(
+                BluetoothRouteManager.AUDIO_OFF_STATE_NAME, null);
+        setupConnectedDevices(new BluetoothDevice[]{device1}, null);
+        when(mTimeoutsAdapter.getRetryBluetoothConnectAudioBackoffMillis(
+                any(ContentResolver.class))).thenReturn(0L);
+        when(mHeadsetProxy.connectAudio()).thenReturn(false);
+        executeRoutingAction(sm, BluetoothRouteManager.CONNECT_HFP, null);
+        // Wait 3 times: for the first connection attempt, the retry attempt, and once more to
+        // make sure there are only two attempts.
+        waitForStateMachineActionCompletion(sm, BluetoothRouteManager.RUN_RUNNABLE);
+        waitForStateMachineActionCompletion(sm, BluetoothRouteManager.RUN_RUNNABLE);
+        waitForStateMachineActionCompletion(sm, BluetoothRouteManager.RUN_RUNNABLE);
+        // TODO: verify address
+        verify(mHeadsetProxy, times(2)).connectAudio();
+        assertEquals(BluetoothRouteManager.AUDIO_OFF_STATE_NAME, sm.getCurrentState().getName());
+        sm.getHandler().removeMessages(BluetoothRouteManager.CONNECTION_TIMEOUT);
+        sm.quitNow();
+    }
+
+    @SmallTest
+    public void testConnectHfpRetryWhileConnectedToAnotherDevice() {
+        BluetoothRouteManager sm = setupStateMachine(
+                BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX, device1);
+        setupConnectedDevices(new BluetoothDevice[]{device1, device2}, null);
+        when(mTimeoutsAdapter.getRetryBluetoothConnectAudioBackoffMillis(
+                any(ContentResolver.class))).thenReturn(0L);
+        when(mHeadsetProxy.connectAudio()).thenReturn(false);
+        executeRoutingAction(sm, BluetoothRouteManager.CONNECT_HFP, device2.getAddress());
+        // Wait 3 times: the first connection attempt is accounted for in executeRoutingAction,
+        // so wait for the retry attempt, again to make sure there are only two attempts, and
+        // once more for good luck.
+        waitForStateMachineActionCompletion(sm, BluetoothRouteManager.RUN_RUNNABLE);
+        waitForStateMachineActionCompletion(sm, BluetoothRouteManager.RUN_RUNNABLE);
+        waitForStateMachineActionCompletion(sm, BluetoothRouteManager.RUN_RUNNABLE);
+        // TODO: verify address of device2
+        verify(mHeadsetProxy, times(2)).connectAudio();
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress(),
+                sm.getCurrentState().getName());
+        sm.getHandler().removeMessages(BluetoothRouteManager.CONNECTION_TIMEOUT);
+        sm.quitNow();
+    }
+
+    @SmallTest
+    public void testProperFallbackOrder1() {
+        // Device 1, 2, 3 are connected in that order. Device 1 is activated, then device 2.
+        // Disconnect device 2, verify fallback to device 1. Disconnect device 1, fallback to
+        // device 3.
+        BluetoothRouteManager sm = setupStateMachine(
+                BluetoothRouteManager.AUDIO_OFF_STATE_NAME, null);
+        setupConnectedDevices(new BluetoothDevice[]{device3, device2, device1}, null);
+        executeRoutingAction(sm, BluetoothRouteManager.CONNECT_HFP, device1.getAddress());
+        // TODO: verify address
+        verify(mHeadsetProxy, times(1)).connectAudio();
+
+        setupConnectedDevices(new BluetoothDevice[]{device3, device2, device1}, device1);
+        executeRoutingAction(sm, BluetoothRouteManager.HFP_IS_ON, device1.getAddress());
+
+        executeRoutingAction(sm, BluetoothRouteManager.CONNECT_HFP, device2.getAddress());
+        // TODO: verify address
+        verify(mHeadsetProxy, times(2)).connectAudio();
+
+        setupConnectedDevices(new BluetoothDevice[]{device3, device2, device1}, device2);
+        executeRoutingAction(sm, BluetoothRouteManager.HFP_IS_ON, device2.getAddress());
+        // Disconnect device 2
+        setupConnectedDevices(new BluetoothDevice[]{device3, device1}, null);
+        executeRoutingAction(sm, BluetoothRouteManager.LOST_DEVICE, device2.getAddress());
+        // Verify that we've fallen back to device 1
+        verify(mHeadsetProxy, times(3)).connectAudio();
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress(),
+                sm.getCurrentState().getName());
+        setupConnectedDevices(new BluetoothDevice[]{device3, device1}, device1);
+        executeRoutingAction(sm, BluetoothRouteManager.HFP_IS_ON, device1.getAddress());
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress(),
+                sm.getCurrentState().getName());
+
+        // Disconnect device 1
+        setupConnectedDevices(new BluetoothDevice[]{device3}, null);
+        executeRoutingAction(sm, BluetoothRouteManager.LOST_DEVICE, device1.getAddress());
+        // Verify that we've fallen back to device 3
+        verify(mHeadsetProxy, times(4)).connectAudio();
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device3.getAddress(),
+                sm.getCurrentState().getName());
+        setupConnectedDevices(new BluetoothDevice[]{device3}, device3);
+        executeRoutingAction(sm, BluetoothRouteManager.HFP_IS_ON, device3.getAddress());
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device3.getAddress(),
+                sm.getCurrentState().getName());
+
+        sm.getHandler().removeMessages(BluetoothRouteManager.CONNECTION_TIMEOUT);
+        sm.quitNow();
+    }
+
+    @SmallTest
+    public void testProperFallbackOrder2() {
+        // Device 1, 2, 3 are connected in that order. Device 3 is activated.
+        // Disconnect device 3, verify fallback to device 2. Disconnect device 2, fallback to
+        // device 1.
+        BluetoothRouteManager sm = setupStateMachine(
+                BluetoothRouteManager.AUDIO_OFF_STATE_NAME, null);
+        setupConnectedDevices(new BluetoothDevice[]{device3, device2, device1}, null);
+        executeRoutingAction(sm, BluetoothRouteManager.CONNECT_HFP, device3.getAddress());
+        // TODO: verify address
+        verify(mHeadsetProxy, times(1)).connectAudio();
+
+        setupConnectedDevices(new BluetoothDevice[]{device3, device2, device1}, device3);
+        executeRoutingAction(sm, BluetoothRouteManager.HFP_IS_ON, device3.getAddress());
+
+        // Disconnect device 2
+        setupConnectedDevices(new BluetoothDevice[]{device2, device1}, null);
+        executeRoutingAction(sm, BluetoothRouteManager.LOST_DEVICE, device3.getAddress());
+        // Verify that we've fallen back to device 2
+        verify(mHeadsetProxy, times(2)).connectAudio();
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device2.getAddress(),
+                sm.getCurrentState().getName());
+        setupConnectedDevices(new BluetoothDevice[]{device2, device1}, device2);
+        executeRoutingAction(sm, BluetoothRouteManager.HFP_IS_ON, device2.getAddress());
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device2.getAddress(),
+                sm.getCurrentState().getName());
+
+        // Disconnect device 2
+        setupConnectedDevices(new BluetoothDevice[]{device1}, null);
+        executeRoutingAction(sm, BluetoothRouteManager.LOST_DEVICE, device2.getAddress());
+        // Verify that we've fallen back to device 1
+        verify(mHeadsetProxy, times(3)).connectAudio();
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress(),
+                sm.getCurrentState().getName());
+        setupConnectedDevices(new BluetoothDevice[]{device1}, device1);
+        executeRoutingAction(sm, BluetoothRouteManager.HFP_IS_ON, device1.getAddress());
+        assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress(),
+                sm.getCurrentState().getName());
+
+        sm.getHandler().removeMessages(BluetoothRouteManager.CONNECTION_TIMEOUT);
+        sm.quitNow();
+    }
+
+    @Override
+    protected void runParametrizedTestCase(TestParameters _params) {
+        BluetoothRouteTestParameters params = (BluetoothRouteTestParameters) _params;
+        BluetoothRouteManager sm = setupStateMachine(
+                params.initialBluetoothState, params.initialDevice);
+
+        setupConnectedDevices(params.connectedDevices, params.audioOnDevice);
+        executeRoutingAction(sm, params.messageType, params.messageDevice);
+
+        assertEquals(params.expectedFinalStateName, sm.getCurrentState().getName());
+
+        if (params.expectedListenerUpdate != null) {
+            verify(mListener).onBluetoothStateChange(params.expectedListenerUpdate.first,
+                    params.expectedListenerUpdate.second);
+        } else {
+            verify(mListener, never()).onBluetoothStateChange(anyInt(), anyInt());
+        }
+        // TODO: work the address in here
+        switch (params.expectedBluetoothInteraction) {
+            case NONE:
+                verify(mHeadsetProxy, never()).connectAudio();
+                verify(mHeadsetProxy, never()).disconnectAudio();
+                break;
+            case CONNECT:
+                verify(mHeadsetProxy).connectAudio();
+                verify(mHeadsetProxy, never()).disconnectAudio();
+                break;
+            case DISCONNECT:
+                verify(mHeadsetProxy, never()).connectAudio();
+                verify(mHeadsetProxy).disconnectAudio();
+                break;
+        }
+
+        sm.getHandler().removeMessages(BluetoothRouteManager.CONNECTION_TIMEOUT);
+        sm.quitNow();
+    }
+
+    private BluetoothRouteManager setupStateMachine(String initialState,
+            BluetoothDevice initialDevice) {
+        resetMocks(true);
+        BluetoothRouteManager sm = new BluetoothRouteManager(mContext,
+                new TelecomSystem.SyncRoot() { }, mDeviceManager, mTimeoutsAdapter);
+        sm.setListener(mListener);
+        sm.setInitialStateForTesting(initialState, initialDevice);
+        waitForStateMachineActionCompletion(sm, BluetoothRouteManager.RUN_RUNNABLE);
+        resetMocks(false);
+        return sm;
+    }
+
+    private void setupConnectedDevices(BluetoothDevice[] devices, BluetoothDevice activeDevice) {
+        when(mDeviceManager.getNumConnectedDevices()).thenReturn(devices.length);
+        when(mHeadsetProxy.getConnectedDevices()).thenReturn(Arrays.asList(devices));
+        if (activeDevice != null) {
+            when(mHeadsetProxy.isAudioConnected(eq(activeDevice))).thenReturn(true);
+        }
+        doAnswer(invocation -> {
+            BluetoothDevice first = getFirstExcluding(devices,
+                    (String) invocation.getArguments()[0]);
+            return first == null ? null : first.getAddress();
+        }).when(mDeviceManager).getMostRecentlyConnectedDevice(anyString());
+    }
+
+    private void executeRoutingAction(BluetoothRouteManager brm, int message, String device) {
+        SomeArgs args = SomeArgs.obtain();
+        args.arg1 = Log.createSubsession();
+        args.arg2 = device;
+        brm.sendMessage(message, args);
+        waitForStateMachineActionCompletion(brm, CallAudioModeStateMachine.RUN_RUNNABLE);
+    }
+
+    private BluetoothDevice makeBluetoothDevice(String address) {
+        Parcel p1 = Parcel.obtain();
+        p1.writeString(address);
+        p1.setDataPosition(0);
+        BluetoothDevice device = BluetoothDevice.CREATOR.createFromParcel(p1);
+        p1.recycle();
+        return device;
+    }
+
+    private void resetMocks(boolean createNewMocks) {
+        reset(mDeviceManager, mListener, mHeadsetProxy, mTimeoutsAdapter);
+        if (createNewMocks) {
+            mDeviceManager = mock(BluetoothDeviceManager.class);
+            mListener = mock(BluetoothRouteManager.BluetoothStateListener.class);
+            mHeadsetProxy = mock(BluetoothHeadsetProxy.class);
+            mTimeoutsAdapter = mock(Timeouts.Adapter.class);
+        }
+        when(mDeviceManager.getHeadsetService()).thenReturn(mHeadsetProxy);
+        when(mHeadsetProxy.connectAudio()).thenReturn(true);
+        when(mTimeoutsAdapter.getRetryBluetoothConnectAudioBackoffMillis(
+                any(ContentResolver.class))).thenReturn(100000L);
+        when(mTimeoutsAdapter.getBluetoothPendingTimeoutMillis(
+                any(ContentResolver.class))).thenReturn(100000L);
+    }
+
+    private static BluetoothDevice getFirstExcluding(
+            BluetoothDevice[] devices, String excludeAddress) {
+        for (BluetoothDevice x : devices) {
+            if (!Objects.equals(excludeAddress, x.getAddress())) {
+                return x;
+            }
+        }
+        return null;
+    }
+
+    private List<BluetoothRouteTestParameters> generateTestCases() {
+        List<BluetoothRouteTestParameters> result = new ArrayList<>();
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("New device connected while audio off")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .setInitialDevice(null)
+                .setConnectedDevices(device1)
+                .setMessageType(BluetoothRouteManager.NEW_DEVICE_CONNECTED)
+                .setMessageDevice(device1.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_DISCONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedConnectionAddress(null)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Nonspecific connection request while audio off.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .setInitialDevice(null)
+                .setConnectedDevices(device2, device1)
+                .setMessageType(BluetoothRouteManager.CONNECT_HFP)
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING))
+                .setExpectedBluetoothInteraction(CONNECT)
+                .setExpectedConnectionAddress(device2.getAddress())
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device2.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Connection to a device succeeds after pending")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setAudioOnDevice(device2)
+                .setConnectedDevices(device2, device1)
+                .setMessageType(BluetoothRouteManager.HFP_IS_ON)
+                .setMessageDevice(device2.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedConnectionAddress(null)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device2.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Device loses HFP audio but remains connected. No fallback.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2)
+                .setMessageType(BluetoothRouteManager.HFP_LOST)
+                .setMessageDevice(device2.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedConnectionAddress(null)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Device loses HFP audio but remains connected. Fallback.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2, device1, device3)
+                .setMessageType(BluetoothRouteManager.HFP_LOST)
+                .setMessageDevice(device2.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING))
+                .setExpectedBluetoothInteraction(CONNECT)
+                .setExpectedConnectionAddress(device1.getAddress())
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Switch active devices")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2, device1, device3)
+                .setMessageType(BluetoothRouteManager.CONNECT_HFP)
+                .setMessageDevice(device3.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING))
+                .setExpectedBluetoothInteraction(CONNECT)
+                .setExpectedConnectionAddress(device3.getAddress())
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device3.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Switch to another device before first device has connected")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2, device1, device3)
+                .setMessageType(BluetoothRouteManager.CONNECT_HFP)
+                .setMessageDevice(device3.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING))
+                .setExpectedBluetoothInteraction(CONNECT)
+                .setExpectedConnectionAddress(device3.getAddress())
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device3.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Device gets disconnected while active. No fallback.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices()
+                .setMessageType(BluetoothRouteManager.LOST_DEVICE)
+                .setMessageDevice(device2.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_DISCONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedConnectionAddress(null)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Device gets disconnected while active. Fallback.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device3)
+                .setMessageType(BluetoothRouteManager.LOST_DEVICE)
+                .setMessageDevice(device2.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING))
+                .setExpectedBluetoothInteraction(CONNECT)
+                .setExpectedConnectionAddress(device3.getAddress())
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device3.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Connection to device2 times out but device 1 still connected.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2, device1)
+                .setAudioOnDevice(device1)
+                .setMessageType(BluetoothRouteManager.CONNECTION_TIMEOUT)
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("device1 somehow becomes active when device2 is still pending.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2, device1)
+                .setAudioOnDevice(device1)
+                .setMessageType(BluetoothRouteManager.HFP_IS_ON)
+                .setMessageDevice(device1.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device1.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Device gets disconnected while pending. Fallback.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device3)
+                .setMessageType(BluetoothRouteManager.LOST_DEVICE)
+                .setMessageDevice(device2.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING))
+                .setExpectedBluetoothInteraction(CONNECT)
+                .setExpectedConnectionAddress(device3.getAddress())
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX
+                        + ":" + device3.getAddress())
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Device gets disconnected while pending. No fallback.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices()
+                .setMessageType(BluetoothRouteManager.LOST_DEVICE)
+                .setMessageDevice(device2.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING,
+                        BluetoothRouteManager.BLUETOOTH_DISCONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Audio routing requests HFP disconnection while a device is active")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2, device3)
+                .setMessageType(BluetoothRouteManager.DISCONNECT_HFP)
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED))
+                .setExpectedBluetoothInteraction(DISCONNECT)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Audio routing requests HFP disconnection while a device is pending")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_CONNECTING_STATE_NAME_PREFIX)
+                .setInitialDevice(device2)
+                .setConnectedDevices(device2, device3)
+                .setMessageType(BluetoothRouteManager.DISCONNECT_HFP)
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING,
+                        BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED))
+                .setExpectedBluetoothInteraction(DISCONNECT)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .build());
+
+        result.add(new BluetoothRouteTestParametersBuilder()
+                .setName("Bluetooth turns itself on.")
+                .setInitialBluetoothState(BluetoothRouteManager.AUDIO_OFF_STATE_NAME)
+                .setInitialDevice(null)
+                .setConnectedDevices(device2, device3)
+                .setMessageType(BluetoothRouteManager.HFP_IS_ON)
+                .setMessageDevice(device3.getAddress())
+                .setExpectedListenerUpdate(Pair.create(
+                        BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED,
+                        BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED))
+                .setExpectedBluetoothInteraction(NONE)
+                .setExpectedFinalStateName(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX
+                        + ":" + device3.getAddress())
+                .build());
+
+        return result;
+    }
+}
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java b/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java
index 38ea10e..af1d3a2 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioModeStateMachineTest.java
@@ -604,6 +604,8 @@
                 verify(mCallAudioManager).stopCallWaiting();
                 break;
         }
+
+        sm.quitNow();
     }
 
     private void resetMocks() {
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
index 0766b72..d53f270 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
@@ -25,7 +25,7 @@
 import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.server.telecom.BluetoothManager;
+import com.android.server.telecom.bluetooth.BluetoothRouteManager;
 import com.android.server.telecom.Call;
 import com.android.server.telecom.CallAudioModeStateMachine;
 import com.android.server.telecom.CallAudioRouteStateMachine;
@@ -135,7 +135,7 @@
     }
 
     @Mock CallsManager mockCallsManager;
-    @Mock BluetoothManager mockBluetoothManager;
+    @Mock BluetoothRouteManager mockBluetoothRouteManager;
     @Mock IAudioService mockAudioService;
     @Mock ConnectionServiceWrapper mockConnectionServiceWrapper;
     @Mock WiredHeadsetManager mockWiredHeadsetManager;
@@ -207,15 +207,15 @@
         CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
                 mContext,
                 mockCallsManager,
-                mockBluetoothManager,
+                mockBluetoothRouteManager,
                 mockWiredHeadsetManager,
                 mockStatusBarNotifier,
                 mAudioServiceFactory,
                 mMockInterruptionFilterProxy,
                 true);
 
-        when(mockBluetoothManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(true);
+        when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true);
         when(mockAudioManager.isSpeakerphoneOn()).thenReturn(true);
         doAnswer(new Answer() {
             @Override
@@ -236,7 +236,7 @@
                 CallAudioState.ROUTE_WIRED_HEADSET,
                 CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER);
         verifyNewSystemCallAudioState(initState, expectedMiddleState);
-        resetMocks();
+        resetMocks(true);
 
         stateMachine.sendMessageWithSessionInfo(
                 CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET);
@@ -248,15 +248,15 @@
         CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
                 mContext,
                 mockCallsManager,
-                mockBluetoothManager,
+                mockBluetoothRouteManager,
                 mockWiredHeadsetManager,
                 mockStatusBarNotifier,
                 mAudioServiceFactory,
                 mMockInterruptionFilterProxy,
                 true);
 
-        when(mockBluetoothManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(true);
+        when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true);
         when(mockAudioManager.isSpeakerphoneOn()).thenReturn(true);
 
         CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH,
@@ -276,7 +276,7 @@
         // Expecting to end up in earpiece, so we expect notifications to be filtered.
         assertEquals(NotificationManager.INTERRUPTION_FILTER_ALARMS,
                 mMockInterruptionFilterProxy.getCurrentInterruptionFilter());
-        resetMocks();
+        resetMocks(false);
         stateMachine.sendMessageWithSessionInfo(
                 CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH);
         stateMachine.sendMessageWithSessionInfo(
@@ -291,15 +291,15 @@
         CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
                 mContext,
                 mockCallsManager,
-                mockBluetoothManager,
+                mockBluetoothRouteManager,
                 mockWiredHeadsetManager,
                 mockStatusBarNotifier,
                 mAudioServiceFactory,
                 mMockInterruptionFilterProxy,
                 true);
 
-        when(mockBluetoothManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(true);
+        when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true);
         when(mockAudioManager.isSpeakerphoneOn()).thenReturn(false);
 
         CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH,
@@ -310,7 +310,7 @@
                 CallAudioRouteStateMachine.RINGING_FOCUS);
         waitForStateMachineActionCompletion(stateMachine, CallAudioRouteStateMachine.RUN_RUNNABLE);
 
-        verify(mockBluetoothManager, never()).connectBluetoothAudio();
+        verify(mockBluetoothRouteManager, never()).connectBluetoothAudio(null);
         // Shouldn't change interruption filter when in bluetooth route.
         assertEquals(NotificationManager.INTERRUPTION_FILTER_ALL,
                 mMockInterruptionFilterProxy.getCurrentInterruptionFilter());
@@ -318,7 +318,7 @@
         stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
                 CallAudioRouteStateMachine.ACTIVE_FOCUS);
         waitForStateMachineActionCompletion(stateMachine, CallAudioRouteStateMachine.RUN_RUNNABLE);
-        verify(mockBluetoothManager, times(1)).connectBluetoothAudio();
+        verify(mockBluetoothRouteManager, times(1)).connectBluetoothAudio(null);
     }
 
     @MediumTest
@@ -326,15 +326,15 @@
         CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
                 mContext,
                 mockCallsManager,
-                mockBluetoothManager,
+                mockBluetoothRouteManager,
                 mockWiredHeadsetManager,
                 mockStatusBarNotifier,
                 mAudioServiceFactory,
                 mMockInterruptionFilterProxy,
                 true);
 
-        when(mockBluetoothManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(false);
+        when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false);
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(false);
         when(mockAudioManager.isSpeakerphoneOn()).thenReturn(false);
         CallAudioState initState = new CallAudioState(false, CallAudioState.ROUTE_EARPIECE,
                 CallAudioState.ROUTE_EARPIECE);
@@ -342,10 +342,12 @@
 
         stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
                 CallAudioRouteStateMachine.RINGING_FOCUS);
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(true);
+
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true);
         stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.CONNECT_BLUETOOTH);
         waitForStateMachineActionCompletion(stateMachine, CallAudioRouteStateMachine.RUN_RUNNABLE);
-        verify(mockBluetoothManager, never()).connectBluetoothAudio();
+
+        verify(mockBluetoothRouteManager, never()).connectBluetoothAudio(null);
         CallAudioState expectedEndState = new CallAudioState(false,
                 CallAudioState.ROUTE_BLUETOOTH,
                 CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH);
@@ -354,7 +356,7 @@
         stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
                 CallAudioRouteStateMachine.ACTIVE_FOCUS);
         waitForStateMachineActionCompletion(stateMachine, CallAudioRouteStateMachine.RUN_RUNNABLE);
-        verify(mockBluetoothManager, times(1)).connectBluetoothAudio();
+        verify(mockBluetoothRouteManager, times(1)).connectBluetoothAudio(null);
     }
 
     @SmallTest
@@ -420,13 +422,13 @@
             boolean doesDeviceSupportEarpiece) {
         when(mockWiredHeadsetManager.isPluggedIn()).thenReturn(
                 (expectedState.getSupportedRouteMask() & CallAudioState.ROUTE_WIRED_HEADSET) != 0);
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(
                 (expectedState.getSupportedRouteMask() & CallAudioState.ROUTE_BLUETOOTH) != 0);
 
         CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
                 mContext,
                 mockCallsManager,
-                mockBluetoothManager,
+                mockBluetoothRouteManager,
                 mockWiredHeadsetManager,
                 mockStatusBarNotifier,
                 mAudioServiceFactory,
@@ -933,7 +935,7 @@
 
     private void runParametrizedTestCaseWithFocus(final RoutingTestParameters params)
             throws Throwable {
-        resetMocks();
+        resetMocks(true);
         when(mMockInterruptionFilterProxy.getCurrentInterruptionFilter()).thenReturn(
                 params.initialNotificationFilter);
 
@@ -941,22 +943,14 @@
         final CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
                 mContext,
                 mockCallsManager,
-                mockBluetoothManager,
+                mockBluetoothRouteManager,
                 mockWiredHeadsetManager,
                 mockStatusBarNotifier,
                 mAudioServiceFactory,
                 mMockInterruptionFilterProxy,
                 params.doesDeviceSupportEarpiece);
 
-        // Set up bluetooth and speakerphone state
-        when(mockBluetoothManager.isBluetoothAudioConnectedOrPending()).thenReturn(
-                params.initialRoute == CallAudioState.ROUTE_BLUETOOTH);
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(
-                (params.availableRoutes & CallAudioState.ROUTE_BLUETOOTH) != 0
-                        || (params.expectedAvailableRoutes & CallAudioState.ROUTE_BLUETOOTH) != 0);
-        doReturn(params.initialRoute == CallAudioState.ROUTE_SPEAKER).when(mockAudioManager).
-                isSpeakerphoneOn();
-        when(fakeCall.getSupportedAudioRoutes()).thenReturn(params.callSupportedRoutes);
+        setupMocksForParams(params);
 
         // Set the initial CallAudioState object
         final CallAudioState initState = new CallAudioState(false,
@@ -966,6 +960,11 @@
         // Make the state machine have focus so that we actually do something
         stateMachine.sendMessageWithSessionInfo(CallAudioRouteStateMachine.SWITCH_FOCUS,
                 CallAudioRouteStateMachine.ACTIVE_FOCUS);
+        waitForStateMachineActionCompletion(stateMachine, CallAudioRouteStateMachine.RUN_RUNNABLE);
+
+        // Reset mocks one more time to discard stuff from initialization
+        resetMocks(false);
+        setupMocksForParams(params);
         stateMachine.sendMessageWithSessionInfo(params.action);
 
         waitForStateMachineActionCompletion(stateMachine, CallAudioRouteStateMachine.RUN_RUNNABLE);
@@ -991,17 +990,17 @@
         // Verify interactions with the speakerphone and bluetooth systems
         switch (params.bluetoothInteraction) {
             case NONE:
-                verify(mockBluetoothManager, never()).disconnectBluetoothAudio();
-                verify(mockBluetoothManager, never()).connectBluetoothAudio();
+                verify(mockBluetoothRouteManager, never()).disconnectBluetoothAudio();
+                verify(mockBluetoothRouteManager, never()).connectBluetoothAudio(null);
                 break;
             case ON:
-                verify(mockBluetoothManager).connectBluetoothAudio();
+                verify(mockBluetoothRouteManager).connectBluetoothAudio(null);
 
-                verify(mockBluetoothManager, never()).disconnectBluetoothAudio();
+                verify(mockBluetoothRouteManager, never()).disconnectBluetoothAudio();
                 break;
             case OFF:
-                verify(mockBluetoothManager, never()).connectBluetoothAudio();
-                verify(mockBluetoothManager).disconnectBluetoothAudio();
+                verify(mockBluetoothRouteManager, never()).connectBluetoothAudio(null);
+                verify(mockBluetoothRouteManager).disconnectBluetoothAudio();
         }
 
         switch (params.speakerInteraction) {
@@ -1019,15 +1018,27 @@
         verifyNewSystemCallAudioState(initState, expectedState);
     }
 
+    private void setupMocksForParams(RoutingTestParameters params) {
+        // Set up bluetooth and speakerphone state
+        when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(
+                params.initialRoute == CallAudioState.ROUTE_BLUETOOTH);
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(
+                (params.availableRoutes & CallAudioState.ROUTE_BLUETOOTH) != 0
+                        || (params.expectedAvailableRoutes & CallAudioState.ROUTE_BLUETOOTH) != 0);
+        when(mockAudioManager.isSpeakerphoneOn()).thenReturn(
+                params.initialRoute == CallAudioState.ROUTE_SPEAKER);
+        when(fakeCall.getSupportedAudioRoutes()).thenReturn(params.callSupportedRoutes);
+    }
+
     private void runParametrizedTestCaseWithoutFocus(final RoutingTestParameters params)
             throws Throwable {
-        resetMocks();
+        resetMocks(true);
 
         // Construct a fresh state machine on every case
         final CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine(
                 mContext,
                 mockCallsManager,
-                mockBluetoothManager,
+                mockBluetoothRouteManager,
                 mockWiredHeadsetManager,
                 mockStatusBarNotifier,
                 mAudioServiceFactory,
@@ -1035,7 +1046,7 @@
                 params.doesDeviceSupportEarpiece);
 
         // Set up bluetooth and speakerphone state
-        when(mockBluetoothManager.isBluetoothAvailable()).thenReturn(
+        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(
                 (params.availableRoutes & CallAudioState.ROUTE_BLUETOOTH) != 0
                 || (params.expectedAvailableRoutes & CallAudioState.ROUTE_BLUETOOTH) != 0);
         when(mockAudioManager.isSpeakerphoneOn()).thenReturn(
@@ -1064,8 +1075,8 @@
     }
 
     private void verifyNoSystemAudioChanges() {
-        verify(mockBluetoothManager, never()).disconnectBluetoothAudio();
-        verify(mockBluetoothManager, never()).connectBluetoothAudio();
+        verify(mockBluetoothRouteManager, never()).disconnectBluetoothAudio();
+        verify(mockBluetoothRouteManager, never()).connectBluetoothAudio(null);
         verify(mockAudioManager, never()).setSpeakerphoneOn(any(Boolean.class));
         verify(mockCallsManager, never()).onCallAudioStateChanged(any(CallAudioState.class),
                 any(CallAudioState.class));
@@ -1091,11 +1102,14 @@
         assertTrue(newStateCaptor2.getValue().equals(expectedNewState));
     }
 
-    private void resetMocks() {
-        reset(mockAudioManager, mockBluetoothManager, mockCallsManager,
-                mockConnectionServiceWrapper, mMockInterruptionFilterProxy, fakeCall);
-        mMockInterruptionFilterProxy = mock(InterruptionFilterProxy.class);
-        setupInterruptionFilterMocks();
+    private void resetMocks(boolean resetNotificationFilter) {
+        reset(mockAudioManager, mockBluetoothRouteManager, mockCallsManager,
+                mockConnectionServiceWrapper, fakeCall);
+        if (resetNotificationFilter) {
+            reset(mMockInterruptionFilterProxy);
+            mMockInterruptionFilterProxy = mock(InterruptionFilterProxy.class);
+            setupInterruptionFilterMocks();
+        }
         when(mockCallsManager.getForegroundCall()).thenReturn(fakeCall);
         when(fakeCall.getConnectionService()).thenReturn(mockConnectionServiceWrapper);
         when(fakeCall.isAlive()).thenReturn(true);
diff --git a/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java b/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java
index e9db543..590304c 100644
--- a/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallLogManagerTest.java
@@ -296,7 +296,7 @@
                 Integer.valueOf(CallLog.Calls.MISSED_TYPE));
         // Timeout needed because showMissedCallNotification is called from onPostExecute.
         verify(mMissedCallNotifier, timeout(TEST_TIMEOUT_MILLIS))
-                .showMissedCallNotification(fakeMissedCall);
+                .showMissedCallNotification(any(MissedCallNotifier.CallInfo.class));
     }
 
     @MediumTest
diff --git a/tests/src/com/android/server/telecom/tests/CallScreeningServiceFilterTest.java b/tests/src/com/android/server/telecom/tests/CallScreeningServiceFilterTest.java
index 3d3306d..3767914 100644
--- a/tests/src/com/android/server/telecom/tests/CallScreeningServiceFilterTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallScreeningServiceFilterTest.java
@@ -34,6 +34,7 @@
 import com.android.internal.telecom.ICallScreeningService;
 import com.android.server.telecom.Call;
 import com.android.server.telecom.CallsManager;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.ParcelableCallUtils;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.TelecomServiceImpl;
@@ -62,9 +63,8 @@
     @Mock Context mContext;
     @Mock CallsManager mCallsManager;
     @Mock PhoneAccountRegistrar mPhoneAccountRegistrar;
-    @Mock TelecomServiceImpl.DefaultDialerManagerAdapter mDefaultDialerManagerAdapter;
-    @Mock
-    ParcelableCallUtils.Converter mParcelableCallUtilsConverter;
+    @Mock DefaultDialerCache mDefaultDialerCache;
+    @Mock ParcelableCallUtils.Converter mParcelableCallUtilsConverter;
     private TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
 
     @Mock Call mCall;
@@ -106,10 +106,10 @@
         }};
 
         mFilter = new CallScreeningServiceFilter(mContext, mCallsManager, mPhoneAccountRegistrar,
-                mDefaultDialerManagerAdapter, mParcelableCallUtilsConverter, mLock);
+                mDefaultDialerCache, mParcelableCallUtilsConverter, mLock);
 
-        when(mDefaultDialerManagerAdapter.getDefaultDialerApplication(
-                eq(mContext), eq(UserHandle.USER_CURRENT))).thenReturn(PKG_NAME);
+        when(mDefaultDialerCache.getDefaultDialerApplication(eq(UserHandle.USER_CURRENT)))
+                .thenReturn(PKG_NAME);
         when(mPackageManager.queryIntentServicesAsUser(any(Intent.class), anyInt(), anyInt()))
                 .thenReturn(Collections.singletonList(mResolveInfo));
         when(mParcelableCallUtilsConverter.toParcelableCall(
@@ -120,8 +120,8 @@
 
     @SmallTest
     public void testNoDefaultDialer() {
-        when(mDefaultDialerManagerAdapter.getDefaultDialerApplication(
-                eq(mContext), eq(UserHandle.USER_CURRENT))).thenReturn(null);
+        when(mDefaultDialerCache.getDefaultDialerApplication(eq(UserHandle.USER_CURRENT)))
+                .thenReturn(null);
         mFilter.startFilterLookup(mCall, mCallback);
         verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
     }
diff --git a/tests/src/com/android/server/telecom/tests/CallerInfoAsyncQueryFactoryFixture.java b/tests/src/com/android/server/telecom/tests/CallerInfoAsyncQueryFactoryFixture.java
index 290fa7a..5f9555c 100644
--- a/tests/src/com/android/server/telecom/tests/CallerInfoAsyncQueryFactoryFixture.java
+++ b/tests/src/com/android/server/telecom/tests/CallerInfoAsyncQueryFactoryFixture.java
@@ -19,9 +19,9 @@
 import com.android.internal.telephony.CallerInfo;
 import com.android.internal.telephony.CallerInfoAsyncQuery;
 import com.android.server.telecom.CallerInfoAsyncQueryFactory;
-import com.android.server.telecom.Log;
 
 import android.content.Context;
+import android.telecom.Log;
 
 import org.mockito.Mockito;
 
diff --git a/tests/src/com/android/server/telecom/tests/CallerInfoLookupHelperTest.java b/tests/src/com/android/server/telecom/tests/CallerInfoLookupHelperTest.java
index f261d3e..2ae717d 100644
--- a/tests/src/com/android/server/telecom/tests/CallerInfoLookupHelperTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallerInfoLookupHelperTest.java
@@ -22,6 +22,7 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.test.suitebuilder.annotation.SmallTest;
+import android.telecom.Logging.Session;
 
 import com.android.internal.telephony.CallerInfo;
 import com.android.internal.telephony.CallerInfoAsyncQuery;
@@ -29,7 +30,6 @@
 import com.android.server.telecom.CallerInfoAsyncQueryFactory;
 import com.android.server.telecom.CallerInfoLookupHelper;
 import com.android.server.telecom.ContactsAsyncHelper;
-import com.android.server.telecom.Session;
 import com.android.server.telecom.TelecomSystem;
 
 import org.mockito.ArgumentCaptor;
diff --git a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
index 5ed941e..b14a5e5 100644
--- a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
@@ -21,7 +21,6 @@
 
 import com.android.internal.telecom.IConnectionService;
 import com.android.internal.telecom.IInCallService;
-import com.android.server.telecom.Log;
 
 import org.mockito.MockitoAnnotations;
 import org.mockito.invocation.InvocationOnMock;
@@ -53,6 +52,7 @@
 import android.os.UserManager;
 import android.telecom.CallAudioState;
 import android.telecom.ConnectionService;
+import android.telecom.Log;
 import android.telecom.InCallService;
 import android.telecom.PhoneAccount;
 import android.telecom.TelecomManager;
@@ -259,6 +259,12 @@
         }
 
         @Override
+        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle handle,
+                IntentFilter filter, String broadcastPermission, Handler scheduler) {
+            return null;
+        }
+
+        @Override
         public void sendBroadcast(Intent intent) {
             // TODO -- need to ensure this is captured
         }
diff --git a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
index fad8b7e..59c9468 100644
--- a/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ConnectionServiceFixture.java
@@ -20,7 +20,6 @@
 import com.android.internal.telecom.IConnectionServiceAdapter;
 import com.android.internal.telecom.IVideoProvider;
 import com.android.internal.telecom.RemoteServiceCallback;
-import com.android.server.telecom.Log;
 
 import junit.framework.TestCase;
 
@@ -38,6 +37,8 @@
 import android.telecom.ConnectionRequest;
 import android.telecom.ConnectionService;
 import android.telecom.DisconnectCause;
+import android.telecom.Log;
+import android.telecom.Logging.Session;
 import android.telecom.ParcelableConference;
 import android.telecom.ParcelableConnection;
 import android.telecom.PhoneAccountHandle;
@@ -192,28 +193,29 @@
         List<String> rejectedCallIds = Lists.newArrayList();
 
         @Override
-        public void addConnectionServiceAdapter(IConnectionServiceAdapter adapter)
-                throws RemoteException {
+        public void addConnectionServiceAdapter(IConnectionServiceAdapter adapter,
+                Session.Info info) throws RemoteException {
             if (!mConnectionServiceAdapters.add(adapter)) {
                 throw new RuntimeException("Adapter already added: " + adapter);
             }
-            mConnectionServiceDelegateAdapter.addConnectionServiceAdapter(adapter);
+            mConnectionServiceDelegateAdapter.addConnectionServiceAdapter(adapter,
+                    null /*Session.Info*/);
         }
 
         @Override
-        public void removeConnectionServiceAdapter(IConnectionServiceAdapter adapter)
-                throws RemoteException {
+        public void removeConnectionServiceAdapter(IConnectionServiceAdapter adapter,
+                Session.Info info) throws RemoteException {
             if (!mConnectionServiceAdapters.remove(adapter)) {
                 throw new RuntimeException("Adapter never added: " + adapter);
             }
-            mConnectionServiceDelegateAdapter.removeConnectionServiceAdapter(adapter);
+            mConnectionServiceDelegateAdapter.removeConnectionServiceAdapter(adapter,
+                    null /*Session.Info*/);
         }
 
         @Override
         public void createConnection(PhoneAccountHandle connectionManagerPhoneAccount,
-                String id,
-                ConnectionRequest request, boolean isIncoming, boolean isUnknown)
-                throws RemoteException {
+                String id, ConnectionRequest request, boolean isIncoming, boolean isUnknown,
+                Session.Info info) throws RemoteException {
             Log.i(ConnectionServiceFixture.this, "xoxox createConnection --> " + id);
 
             if (mConnectionById.containsKey(id)) {
@@ -233,74 +235,84 @@
             c.isConferenceCreated = true;
             mConnectionById.put(id, c);
             mConnectionServiceDelegateAdapter.createConnection(connectionManagerPhoneAccount,
-                    id, request, isIncoming, isUnknown);
+                    id, request, isIncoming, isUnknown, null /*Session.Info*/);
         }
 
         @Override
-        public void abort(String callId) throws RemoteException { }
+        public void abort(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void answerVideo(String callId, int videoState) throws RemoteException { }
+        public void answerVideo(String callId, int videoState,
+                Session.Info info) throws RemoteException { }
 
         @Override
-        public void answer(String callId) throws RemoteException { }
+        public void answer(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void reject(String callId) throws RemoteException {
+        public void reject(String callId, Session.Info info) throws RemoteException {
             rejectedCallIds.add(callId);
         }
 
         @Override
-        public void rejectWithMessage(String callId, String message) throws RemoteException { }
+        public void rejectWithMessage(String callId, String message,
+                Session.Info info) throws RemoteException { }
 
         @Override
-        public void disconnect(String callId) throws RemoteException { }
+        public void disconnect(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void silence(String callId) throws RemoteException { }
+        public void silence(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void hold(String callId) throws RemoteException { }
+        public void hold(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void unhold(String callId) throws RemoteException { }
+        public void unhold(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void onCallAudioStateChanged(String activeCallId, CallAudioState audioState)
+        public void onCallAudioStateChanged(String activeCallId, CallAudioState audioState,
+                Session.Info info)
                 throws RemoteException { }
 
         @Override
-        public void playDtmfTone(String callId, char digit) throws RemoteException { }
+        public void playDtmfTone(String callId, char digit,
+                Session.Info info) throws RemoteException { }
 
         @Override
-        public void stopDtmfTone(String callId) throws RemoteException { }
+        public void stopDtmfTone(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void conference(String conferenceCallId, String callId) throws RemoteException {
-            mConnectionServiceDelegateAdapter.conference(conferenceCallId, callId);
+        public void conference(String conferenceCallId, String callId,
+                Session.Info info) throws RemoteException {
+            mConnectionServiceDelegateAdapter.conference(conferenceCallId, callId, info);
         }
 
         @Override
-        public void splitFromConference(String callId) throws RemoteException { }
+        public void splitFromConference(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void mergeConference(String conferenceCallId) throws RemoteException { }
+        public void mergeConference(String conferenceCallId,
+                Session.Info info) throws RemoteException { }
 
         @Override
-        public void swapConference(String conferenceCallId) throws RemoteException { }
+        public void swapConference(String conferenceCallId,
+                Session.Info info) throws RemoteException { }
 
         @Override
-        public void onPostDialContinue(String callId, boolean proceed) throws RemoteException { }
+        public void onPostDialContinue(String callId, boolean proceed,
+                Session.Info info) throws RemoteException { }
 
         @Override
-        public void pullExternalCall(String callId) throws RemoteException { }
+        public void pullExternalCall(String callId, Session.Info info) throws RemoteException { }
 
         @Override
-        public void sendCallEvent(String callId, String event, Bundle extras) throws RemoteException
+        public void sendCallEvent(String callId, String event, Bundle extras,
+                Session.Info info) throws RemoteException
         {}
 
-        public void onExtrasChanged(String callId, Bundle extras) throws RemoteException {
-            mConnectionServiceDelegateAdapter.onExtrasChanged(callId, extras);
+        public void onExtrasChanged(String callId, Bundle extras,
+                Session.Info info) throws RemoteException {
+            mConnectionServiceDelegateAdapter.onExtrasChanged(callId, extras, info);
         }
 
         @Override
@@ -383,28 +395,28 @@
             a.handleCreateConnectionComplete(
                     id,
                     mConnectionById.get(id).request,
-                    parcelable(mConnectionById.get(id)));
+                    parcelable(mConnectionById.get(id)), null /*Session.Info*/);
         }
     }
 
     public void sendSetActive(String id) throws Exception {
         mConnectionById.get(id).state = Connection.STATE_ACTIVE;
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setActive(id);
+            a.setActive(id, null /*Session.Info*/);
         }
     }
 
     public void sendSetRinging(String id) throws Exception {
         mConnectionById.get(id).state = Connection.STATE_RINGING;
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setRinging(id);
+            a.setRinging(id, null /*Session.Info*/);
         }
     }
 
     public void sendSetDialing(String id) throws Exception {
         mConnectionById.get(id).state = Connection.STATE_DIALING;
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setDialing(id);
+            a.setDialing(id, null /*Session.Info*/);
         }
     }
 
@@ -412,61 +424,62 @@
         mConnectionById.get(id).state = Connection.STATE_DISCONNECTED;
         mConnectionById.get(id).disconnectCause = new DisconnectCause(disconnectCause);
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setDisconnected(id, mConnectionById.get(id).disconnectCause);
+            a.setDisconnected(id, mConnectionById.get(id).disconnectCause, null /*Session.Info*/);
         }
     }
 
     public void sendSetOnHold(String id) throws Exception {
         mConnectionById.get(id).state = Connection.STATE_HOLDING;
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setOnHold(id);
+            a.setOnHold(id, null /*Session.Info*/);
         }
     }
 
     public void sendSetRingbackRequested(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setRingbackRequested(id, mConnectionById.get(id).ringing);
+            a.setRingbackRequested(id, mConnectionById.get(id).ringing, null /*Session.Info*/);
         }
     }
 
     public void sendSetConnectionCapabilities(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setConnectionCapabilities(id, mConnectionById.get(id).capabilities);
+            a.setConnectionCapabilities(id, mConnectionById.get(id).capabilities,
+                    null /*Session.Info*/);
         }
     }
 
     public void sendSetConnectionProperties(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setConnectionProperties(id, mConnectionById.get(id).properties);
+            a.setConnectionProperties(id, mConnectionById.get(id).properties, null /*Session.Info*/);
         }
     }
     public void sendSetIsConferenced(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setIsConferenced(id, mConnectionById.get(id).conferenceId);
+            a.setIsConferenced(id, mConnectionById.get(id).conferenceId, null /*Session.Info*/);
         }
     }
 
     public void sendAddConferenceCall(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.addConferenceCall(id, parcelable(mConferenceById.get(id)));
+            a.addConferenceCall(id, parcelable(mConferenceById.get(id)), null /*Session.Info*/);
         }
     }
 
     public void sendRemoveCall(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.removeCall(id);
+            a.removeCall(id, null /*Session.Info*/);
         }
     }
 
     public void sendOnPostDialWait(String id, String remaining) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.onPostDialWait(id, remaining);
+            a.onPostDialWait(id, remaining, null /*Session.Info*/);
         }
     }
 
     public void sendOnPostDialChar(String id, char nextChar) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.onPostDialChar(id, nextChar);
+            a.onPostDialChar(id, nextChar, null /*Session.Info*/);
         }
     }
 
@@ -493,31 +506,32 @@
                 public IBinder asBinder() {
                     return this;
                 }
-            });
+            }, null /*Session.Info*/);
         }
     }
 
     public void sendSetVideoProvider(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setVideoProvider(id, mConnectionById.get(id).videoProvider);
+            a.setVideoProvider(id, mConnectionById.get(id).videoProvider, null /*Session.Info*/);
         }
     }
 
     public void sendSetVideoState(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setVideoState(id, mConnectionById.get(id).videoState);
+            a.setVideoState(id, mConnectionById.get(id).videoState, null /*Session.Info*/);
         }
     }
 
     public void sendSetIsVoipAudioMode(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setIsVoipAudioMode(id, mConnectionById.get(id).isVoipAudioMode);
+            a.setIsVoipAudioMode(id, mConnectionById.get(id).isVoipAudioMode,
+                    null /*Session.Info*/);
         }
     }
 
     public void sendSetStatusHints(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setStatusHints(id, mConnectionById.get(id).statusHints);
+            a.setStatusHints(id, mConnectionById.get(id).statusHints, null /*Session.Info*/);
         }
     }
 
@@ -526,7 +540,7 @@
             a.setAddress(
                     id,
                     mConnectionById.get(id).request.getAddress(),
-                    mConnectionById.get(id).addressPresentation);
+                    mConnectionById.get(id).addressPresentation, null /*Session.Info*/);
         }
     }
 
@@ -535,31 +549,32 @@
             a.setCallerDisplayName(
                     id,
                     mConnectionById.get(id).callerDisplayName,
-                    mConnectionById.get(id).callerDisplayNamePresentation);
+                    mConnectionById.get(id).callerDisplayNamePresentation, null /*Session.Info*/);
         }
     }
 
     public void sendSetConferenceableConnections(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setConferenceableConnections(id, mConnectionById.get(id).conferenceableConnectionIds);
+            a.setConferenceableConnections(id, mConnectionById.get(id).conferenceableConnectionIds,
+                    null /*Session.Info*/);
         }
     }
 
     public void sendAddExistingConnection(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.addExistingConnection(id, parcelable(mConnectionById.get(id)));
+            a.addExistingConnection(id, parcelable(mConnectionById.get(id)), null /*Session.Info*/);
         }
     }
 
     public void sendConnectionEvent(String id, String event, Bundle extras) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.onConnectionEvent(id, event, extras);
+            a.onConnectionEvent(id, event, extras, null /*Session.Info*/);
         }
     }
 
     public void sendSetConferenceMergeFailed(String id) throws Exception {
         for (IConnectionServiceAdapter a : mConnectionServiceAdapters) {
-            a.setConferenceMergeFailed(id);
+            a.setConferenceMergeFailed(id, null /*Session.Info*/);
         }
     }
 
diff --git a/tests/src/com/android/server/telecom/tests/ContactsAsyncHelperTest.java b/tests/src/com/android/server/telecom/tests/ContactsAsyncHelperTest.java
index 363d613..960a170 100644
--- a/tests/src/com/android/server/telecom/tests/ContactsAsyncHelperTest.java
+++ b/tests/src/com/android/server/telecom/tests/ContactsAsyncHelperTest.java
@@ -35,6 +35,7 @@
 import static org.mockito.Matchers.anyObject;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.verify;
@@ -87,14 +88,15 @@
     }
 
     @SmallTest
-    public void testEmptyUri() {
+    public void testEmptyUri() throws Exception {
         ContactsAsyncHelper cah = new ContactsAsyncHelper(mNullContentResolverAdapter);
         try {
             cah.startObtainPhotoAsync(TOKEN, mContext, null, mListener, COOKIE);
         } catch (IllegalStateException e) {
             // expected to fail
         }
-        verify(mListener, timeout(TEST_TIMEOUT).never()).onImageLoadComplete(anyInt(),
+        Thread.sleep(TEST_TIMEOUT);
+        verify(mListener, never()).onImageLoadComplete(anyInt(),
                 any(Drawable.class), any(Bitmap.class), anyObject());
     }
 
diff --git a/tests/src/com/android/server/telecom/tests/DefaultDialerCacheTest.java b/tests/src/com/android/server/telecom/tests/DefaultDialerCacheTest.java
new file mode 100644
index 0000000..4c95508
--- /dev/null
+++ b/tests/src/com/android/server/telecom/tests/DefaultDialerCacheTest.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2016 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.server.telecom.tests;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.UserHandle;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.server.telecom.DefaultDialerCache;
+import com.android.server.telecom.TelecomSystem;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class DefaultDialerCacheTest extends TelecomTestCase {
+
+    private static final String DIALER1 = "com.android.dialer";
+    private static final String DIALER2 = "xyz.abc.dialer";
+    private static final String DIALER3 = "aaa.bbb.ccc.ddd";
+    private static final int USER0 = 0;
+    private static final int USER1 = 1;
+    private static final int USER2 = 2;
+
+    private DefaultDialerCache mDefaultDialerCache;
+    private ContentObserver mDefaultDialerSettingObserver;
+    private BroadcastReceiver mPackageChangeReceiver;
+
+    @Mock private DefaultDialerCache.DefaultDialerManagerAdapter mMockDefaultDialerManager;
+
+    public void setUp() throws Exception {
+        super.setUp();
+        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
+
+        ArgumentCaptor<BroadcastReceiver> receiverCaptor =
+                ArgumentCaptor.forClass(BroadcastReceiver.class);
+
+        mDefaultDialerCache = new DefaultDialerCache(
+                mContext, mMockDefaultDialerManager, new TelecomSystem.SyncRoot() { });
+
+        verify(mContext).registerReceiverAsUser(
+                receiverCaptor.capture(), eq(UserHandle.ALL), any(IntentFilter.class),
+                isNull(String.class), isNull(Handler.class));
+        mPackageChangeReceiver = receiverCaptor.getValue();
+        mDefaultDialerSettingObserver = mDefaultDialerCache.getContentObserver();
+
+        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0)))
+                .thenReturn(DIALER1);
+        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER1)))
+                .thenReturn(DIALER2);
+        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER2)))
+                .thenReturn(DIALER3);
+    }
+
+    @SmallTest
+    public void testThreeUsers() {
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER0));
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER1));
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+    }
+
+    @SmallTest
+    public void testDialer1PackageChanged() {
+        // Populate the caches first
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+
+        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED,
+                Uri.fromParts("package", DIALER1, null));
+        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0)))
+                .thenReturn(DIALER2);
+        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER0));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER1));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER2);
+    }
+
+    @SmallTest
+    public void testRandomOtherPackageChanged() {
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+
+        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED,
+                Uri.fromParts("package", "red.orange.blue", null));
+        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER0));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER1));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+    }
+
+    @SmallTest
+    public void testPackageRemovedWithoutReplace() {
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+
+        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED,
+                Uri.fromParts("package", DIALER1, null));
+        packageChangeIntent.putExtra(Intent.EXTRA_REPLACING, false);
+
+        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER0));
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER1));
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+    }
+
+    @SmallTest
+    public void testPackageAdded() {
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+
+        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_ADDED,
+                Uri.fromParts("package", "ppp.qqq.zzz", null));
+
+        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER0));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER1));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+    }
+
+    @SmallTest
+    public void testPackageRemovedWithReplace() {
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+
+        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED,
+                Uri.fromParts("package", DIALER1, null));
+        packageChangeIntent.putExtra(Intent.EXTRA_REPLACING, true);
+
+        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER0));
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER1));
+        verify(mMockDefaultDialerManager, times(1))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+    }
+
+    @SmallTest
+    public void testDefaultDialerSettingChanged() {
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
+
+        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0)))
+                .thenReturn(DIALER2);
+        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER1)))
+                .thenReturn(DIALER2);
+        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER2)))
+                .thenReturn(DIALER2);
+        mDefaultDialerSettingObserver.onChange(false);
+
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER0));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+        verify(mMockDefaultDialerManager, times(2))
+                .getDefaultDialerApplication(any(Context.class), eq(USER2));
+
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
+        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER2);
+    }
+}
diff --git a/tests/src/com/android/server/telecom/tests/EventManagerTest.java b/tests/src/com/android/server/telecom/tests/EventManagerTest.java
new file mode 100644
index 0000000..bb07306
--- /dev/null
+++ b/tests/src/com/android/server/telecom/tests/EventManagerTest.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2016 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.server.telecom.tests;
+
+import android.telecom.Logging.EventManager;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.stream.Collectors;
+
+/**
+ * Unit tests for android.telecom.Logging.EventManager.
+ */
+
+public class EventManagerTest extends TelecomTestCase {
+
+    private EventManager mTestEventManager;
+    // A reference to the recently added event record, populated from the eventRecordAdded callback
+    private EventManager.EventRecord mAddedEventRecord;
+
+    private static final String TEST_EVENT = "testEvent";
+    private static final String TEST_START_EVENT = "testStartEvent";
+    private static final String TEST_END_EVENT = "testEndEvent";
+    private static final String TEST_TIMED_EVENT = "TimedEvent";
+    private static final int TEST_DELAY_TIME = 100; // ms
+
+    private class TestRecord implements EventManager.Loggable {
+        private String mId;
+        private String mDescription;
+
+        TestRecord(String id, String description) {
+            mId = id;
+            mDescription = description;
+        }
+
+        @Override
+        public String getId() {
+            return mId;
+        }
+
+        @Override
+        public String getDescription() {
+            return mDescription;
+        }
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mTestEventManager = new EventManager(() -> "");
+        mTestEventManager.registerEventListener((e) -> mAddedEventRecord = e);
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        mTestEventManager = null;
+        mAddedEventRecord = null;
+        super.tearDown();
+    }
+
+    /**
+     * Tests EventManager#addEventRecord to make sure that new events are added properly and that
+     * the eventRecordAdded callback is working.
+     */
+    @SmallTest
+    public void testAddEventRecord() throws Exception {
+        TestRecord testRecord = new TestRecord("testId", "testDescription");
+        mTestEventManager.event(testRecord, TEST_EVENT, null);
+
+        assertNotNull(mAddedEventRecord);
+        assertEquals(testRecord, mAddedEventRecord.getRecordEntry());
+        assertTrue(mTestEventManager.getEventRecords().contains(mAddedEventRecord));
+        assertTrue(mTestEventManager.getCallEventRecordMap().containsKey(
+                mAddedEventRecord.getRecordEntry()));
+    }
+
+    /**
+     * Tests EventManager#addEventRecord for the case when we overflow the cached record entries and
+     * the oldest entry is dropped.
+     */
+    @SmallTest
+    public void testAddEventRecordOverflowMaxEvents() throws Exception {
+        TestRecord oldestRecordEntry = new TestRecord("id0", "desc0");
+        // Add the oldest record separately so that we can verify it is dropped later
+        mTestEventManager.event(oldestRecordEntry, TEST_EVENT, null);
+        // Record the EventRecord created by the oldest event
+        assertNotNull(mAddedEventRecord);
+        EventManager.EventRecord oldestRecord = mAddedEventRecord;
+        for (int i = 1; i < EventManager.DEFAULT_EVENTS_TO_CACHE; i++) {
+            mTestEventManager.event(new TestRecord("id" + i, "desc" + i), TEST_EVENT, null);
+        }
+
+        // Add a new event that overflows the cache
+        TestRecord overflowRecord = new TestRecord("newestId", "newestDesc");
+        // Add the oldest record separately so that we can verify it is dropped later
+        mTestEventManager.event(overflowRecord, TEST_EVENT, null);
+
+        assertFalse(mTestEventManager.getEventRecords().contains(oldestRecord));
+        assertTrue(mTestEventManager.getEventRecords().contains(mAddedEventRecord));
+    }
+
+    /**
+     * Tests the restructuring of the record entry queue when it is changed (usually in debugging).
+     * If the queue is resized to be smaller, the oldest records are dropped.
+     */
+    @SmallTest
+    public void testChangeQueueSize() throws Exception {
+        TestRecord oldestRecordEntry = new TestRecord("id0", "desc0");
+        // Add the oldest record separately so that we can verify it is dropped later
+        mTestEventManager.event(oldestRecordEntry, TEST_EVENT, null);
+        // Record the EventRecord created by the oldest event
+        assertNotNull(mAddedEventRecord);
+        EventManager.EventRecord oldestRecord = mAddedEventRecord;
+        for (int i = 1; i < EventManager.DEFAULT_EVENTS_TO_CACHE; i++) {
+            mTestEventManager.event(new TestRecord("id" + i, "desc" + i), TEST_EVENT, null);
+        }
+
+        mTestEventManager.changeEventCacheSize(EventManager.DEFAULT_EVENTS_TO_CACHE - 1);
+
+        assertFalse(mTestEventManager.getEventRecords().contains(oldestRecord));
+        // Check to make sure the other event records are there (id1-9)
+        LinkedBlockingQueue<EventManager.EventRecord> eventRecords =
+                mTestEventManager.getEventRecords();
+        for (int i = 1; i < EventManager.DEFAULT_EVENTS_TO_CACHE; i++) {
+            final int index = i;
+            List<EventManager.EventRecord> filteredEvent = eventRecords.stream()
+                    .filter(e -> e.getRecordEntry().getId().equals("id" + index))
+                    .collect(Collectors.toList());
+            assertEquals(1, filteredEvent.size());
+            assertEquals("desc" + index, filteredEvent.get(0).getRecordEntry().getDescription());
+        }
+    }
+
+    /**
+     * Tests adding TimedEventPairs and generating the paired events as well as verifies that the
+     * timing response is correct.
+     */
+    @SmallTest
+    public void testExtractEventTimings() throws Exception {
+        TestRecord testRecord = new TestRecord("testId", "testDesc");
+        // Add unassociated event
+        mTestEventManager.event(testRecord, TEST_EVENT, null);
+        mTestEventManager.addRequestResponsePair(new EventManager.TimedEventPair(TEST_START_EVENT,
+                TEST_END_EVENT, TEST_TIMED_EVENT));
+
+        // Add Start/End Event
+        mTestEventManager.event(testRecord, TEST_START_EVENT, null);
+        try {
+            Thread.sleep(TEST_DELAY_TIME);
+        } catch (InterruptedException ignored) { }
+        mTestEventManager.event(testRecord, TEST_END_EVENT, null);
+
+        // Verify that the events were captured and that the timing is correct.
+        List<EventManager.EventRecord.EventTiming> timings =
+                mAddedEventRecord.extractEventTimings();
+        assertEquals(1, timings.size());
+        assertEquals(TEST_TIMED_EVENT, timings.get(0).name);
+        // Verify that the timing is correct with a +-10 ms buffer
+        assertTrue(timings.get(0).time >= TEST_DELAY_TIME - 10);
+        assertTrue(timings.get(0).time <= TEST_DELAY_TIME + 10);
+    }
+
+    /**
+     * Verify that adding events to different records does not create a valid TimedEventPair
+     */
+    @SmallTest
+    public void testExtractEventTimingsDifferentRecords() throws Exception {
+        TestRecord testRecord = new TestRecord("testId", "testDesc");
+        TestRecord testRecord2 = new TestRecord("testId2", "testDesc2");
+        mTestEventManager.addRequestResponsePair(new EventManager.TimedEventPair(TEST_START_EVENT,
+                TEST_END_EVENT, TEST_TIMED_EVENT));
+
+        // Add Start event for two separate records
+        mTestEventManager.event(testRecord, TEST_START_EVENT, null);
+        EventManager.EventRecord eventRecord1 = mAddedEventRecord;
+        mTestEventManager.event(testRecord2, TEST_END_EVENT, null);
+        EventManager.EventRecord eventRecord2 = mAddedEventRecord;
+
+        // Verify that the events were captured and that the timing is correct.
+        List<EventManager.EventRecord.EventTiming> timings1 =
+                eventRecord1.extractEventTimings();
+        List<EventManager.EventRecord.EventTiming> timings2 =
+                eventRecord2.extractEventTimings();
+        assertEquals(0, timings1.size());
+        assertEquals(0, timings2.size());
+    }
+}
\ No newline at end of file
diff --git a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
index f5c0439..c44f92c 100644
--- a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
+++ b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
@@ -43,11 +43,11 @@
 import com.android.server.telecom.BluetoothHeadsetProxy;
 import com.android.server.telecom.Call;
 import com.android.server.telecom.CallsManager;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.InCallController;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.R;
 import com.android.server.telecom.SystemStateProvider;
-import com.android.server.telecom.TelecomServiceImpl.DefaultDialerManagerAdapter;
 import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.Timeouts;
 
@@ -64,8 +64,6 @@
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.isNull;
-import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
@@ -83,8 +81,8 @@
     @Mock Call mMockCall;
     @Mock Resources mMockResources;
     @Mock MockContext mMockContext;
-    @Mock DefaultDialerManagerAdapter mMockDefaultDialerAdapter;
     @Mock Timeouts.Adapter mTimeoutsAdapter;
+    @Mock DefaultDialerCache mDefaultDialerCache;
 
     private static final int CURRENT_USER_ID = 900973;
     private static final String DEF_PKG = "defpkg";
@@ -107,7 +105,7 @@
         doReturn(SYS_PKG).when(mMockResources).getString(R.string.ui_default_package);
         doReturn(SYS_CLASS).when(mMockResources).getString(R.string.incall_default_class);
         mInCallController = new InCallController(mMockContext, mLock, mMockCallsManager,
-                mMockSystemStateProvider, mMockDefaultDialerAdapter, mTimeoutsAdapter);
+                mMockSystemStateProvider, mDefaultDialerCache, mTimeoutsAdapter);
     }
 
     @Override
@@ -186,7 +184,7 @@
         when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE);
         when(mMockCall.getIntentExtras()).thenReturn(callExtras);
         when(mMockCall.isExternalCall()).thenReturn(false);
-        when(mMockDefaultDialerAdapter.getDefaultDialerApplication(mMockContext, CURRENT_USER_ID))
+        when(mDefaultDialerCache.getDefaultDialerApplication(CURRENT_USER_ID))
                 .thenReturn(DEF_PKG);
         when(mMockContext.bindServiceAsUser(any(Intent.class), any(ServiceConnection.class),
                 anyInt(), eq(UserHandle.CURRENT))).thenReturn(true);
@@ -236,7 +234,7 @@
         when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE);
         when(mMockCall.getIntentExtras()).thenReturn(callExtras);
         when(mMockCall.isExternalCall()).thenReturn(false);
-        when(mMockDefaultDialerAdapter.getDefaultDialerApplication(mMockContext, CURRENT_USER_ID))
+        when(mDefaultDialerCache.getDefaultDialerApplication(CURRENT_USER_ID))
                 .thenReturn(DEF_PKG);
         when(mMockContext.bindServiceAsUser(any(Intent.class), any(ServiceConnection.class),
                 eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
@@ -292,7 +290,7 @@
         when(mMockCall.getIntentExtras()).thenReturn(callExtras);
         when(mMockCall.isExternalCall()).thenReturn(false);
         when(mMockCall.getConferenceableCalls()).thenReturn(Collections.emptyList());
-        when(mMockDefaultDialerAdapter.getDefaultDialerApplication(mMockContext, CURRENT_USER_ID))
+        when(mDefaultDialerCache.getDefaultDialerApplication(CURRENT_USER_ID))
                 .thenReturn(DEF_PKG);
         when(mMockContext.bindServiceAsUser(
                 any(Intent.class), any(ServiceConnection.class), anyInt(), any(UserHandle.class)))
@@ -407,8 +405,7 @@
         when(mMockCallsManager.hasEmergencyCall()).thenReturn(false);
         when(mMockCall.isIncoming()).thenReturn(true);
         when(mMockCall.isExternalCall()).thenReturn(false);
-        when(mMockDefaultDialerAdapter.getDefaultDialerApplication(mMockContext, CURRENT_USER_ID))
-                .thenReturn(DEF_PKG);
+        when(mDefaultDialerCache.getDefaultDialerApplication(CURRENT_USER_ID)).thenReturn(DEF_PKG);
         when(mMockContext.bindServiceAsUser(
                 any(Intent.class), any(ServiceConnection.class), anyInt(), any(UserHandle.class)))
                 .thenReturn(true);
@@ -457,8 +454,7 @@
         when(mMockCallsManager.hasEmergencyCall()).thenReturn(false);
         when(mMockCall.isIncoming()).thenReturn(false);
         when(mMockCall.getTargetPhoneAccount()).thenReturn(PA_HANDLE);
-        when(mMockDefaultDialerAdapter.getDefaultDialerApplication(mMockContext, CURRENT_USER_ID))
-                .thenReturn(DEF_PKG);
+        when(mDefaultDialerCache.getDefaultDialerApplication(CURRENT_USER_ID)).thenReturn(DEF_PKG);
         when(mMockContext.bindServiceAsUser(any(Intent.class), any(ServiceConnection.class),
                 anyInt(), eq(UserHandle.CURRENT))).thenReturn(true);
         when(mMockCall.isExternalCall()).thenReturn(isExternalCall);
diff --git a/tests/src/com/android/server/telecom/tests/LogTest.java b/tests/src/com/android/server/telecom/tests/LogTest.java
deleted file mode 100644
index 20c4d63..0000000
--- a/tests/src/com/android/server/telecom/tests/LogTest.java
+++ /dev/null
@@ -1,579 +0,0 @@
-/*
- * Copyright (C) 2015 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.server.telecom.tests;
-
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Message;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import com.android.internal.os.SomeArgs;
-import com.android.server.telecom.Analytics;
-import com.android.server.telecom.Call;
-import com.android.server.telecom.Session;
-import com.android.server.telecom.SystemLoggingContainer;
-import com.android.server.telecom.Log;
-
-import org.junit.Assert;
-import org.mockito.ArgumentCaptor;
-import org.mockito.MockitoAnnotations;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-/**
- * Unit tests for Telecom's Logging system.
- */
-public class LogTest extends TelecomTestCase{
-
-    /**
-     * This helper class captures the logs that are sent to Log and stores them in an array to be
-     * verified by LogTest.
-     */
-    private class TestLoggingContainer extends SystemLoggingContainer {
-        public ArrayList<String> receivedStrings;
-
-        public TestLoggingContainer() {
-            receivedStrings = new ArrayList<>(100);
-        }
-
-        @Override
-        public synchronized void v(String msgTag, String msg) {
-            if (msgTag.equals(LogTest.TESTING_TAG)) {
-                synchronized (this) {
-                    receivedStrings.add(processMessage(msg));
-                }
-            }
-        }
-
-        @Override
-        public synchronized void i(String msgTag, String msg) {
-            if (msgTag.equals(LogTest.TESTING_TAG)) {
-                synchronized (this) {
-                    receivedStrings.add(processMessage(msg));
-                }
-            }
-        }
-
-        public boolean didReceiveMessage(int timeoutMs, String msg) {
-            String matchedString = null;
-            // Wait for timeout to expire before checking received messages
-            if (timeoutMs > 0) {
-                try {
-                    Thread.sleep(timeoutMs);
-                } catch (InterruptedException e) {
-                    Log.w(LogTest.TESTING_TAG, "TestLoggingContainer: Thread Interrupted!");
-                }
-            }
-            synchronized (this) {
-                for (String receivedString : receivedStrings) {
-                    if (receivedString.contains(msg)) {
-                        matchedString = receivedString;
-                        break;
-                    }
-                }
-                if (matchedString != null) {
-                    receivedStrings.remove(matchedString);
-                    return true;
-                }
-            }
-            android.util.Log.i(TESTING_TAG, "Did not receive message: " + msg);
-            return false;
-        }
-
-        public boolean isMessagesEmpty() {
-            boolean isEmpty = receivedStrings.isEmpty();
-            if (!isEmpty) {
-                printMessagesThatAreLeft();
-            }
-            return isEmpty;
-        }
-
-        public synchronized void printMessagesThatAreLeft() {
-            android.util.Log.i(TESTING_TAG, "Remaining Messages in Log Queue:");
-            for (String receivedString : receivedStrings) {
-                android.util.Log.i(TESTING_TAG, "\t- " + receivedString);
-            }
-        }
-
-        // Remove Unnecessary parts of message string before processing
-        private String processMessage(String msg) {
-            if(msg.contains(Session.CREATE_SUBSESSION)) {
-                return clipMsg(Session.CREATE_SUBSESSION, msg);
-            }
-            if(msg.contains(Session.CONTINUE_SUBSESSION)) {
-                return clipMsg(Session.CONTINUE_SUBSESSION, msg);
-            }
-            if (msg.contains(Session.END_SUBSESSION)) {
-                return clipMsg(Session.END_SUBSESSION, msg);
-            }
-            if (msg.contains(Session.END_SESSION)) {
-                return clipMsg(Session.END_SESSION, msg);
-            }
-            return msg;
-        }
-
-        private String clipMsg(String id, String msg) {
-                int clipStartIndex = msg.indexOf(id) + id.length();
-                int clipEndIndex = msg.lastIndexOf(":");
-                return msg.substring(0, clipStartIndex) + msg.substring(clipEndIndex, msg.length());
-        }
-    }
-
-    public static final int TEST_THREAD_COUNT = 150;
-    public static final int TEST_SLEEP_TIME_MS = 50;
-    // Should be larger than TEST_SLEEP_TIME_MS!
-    public static final int TEST_VERIFY_TIMEOUT_MS = 100;
-    public static final String TEST_ENTER_METHOD1 = "TEM1";
-    public static final String TEST_ENTER_METHOD2 = "TEM2";
-    public static final String TEST_ENTER_METHOD3 = "TEM3";
-    public static final String TEST_ENTER_METHOD4 = "TEM4";
-    public static final String TEST_CLASS_NAME = "LogTest";
-
-    private static final int EVENT_START_TEST_SLEEPY_METHOD = 0;
-    private static final int EVENT_START_TEST_SLEEPY_MULTIPLE_METHOD = 1;
-    private static final int EVENT_LAST_MESSAGE = 2;
-
-    private static final long RANDOM_NUMBER_SEED = 6191991;
-
-    Random rng = new Random(RANDOM_NUMBER_SEED);
-
-    private Handler mSleepyHandler = new Handler(
-            new HandlerThread("sleepyThread"){{start();}}.getLooper()) {
-        @Override
-        public void handleMessage(Message msg) {
-            SomeArgs args = (SomeArgs) msg.obj;
-            Session subsession = (Session) args.arg1;
-            Log.continueSession(subsession, "lTSH.hM");
-            switch (msg.what) {
-                case EVENT_START_TEST_SLEEPY_METHOD:
-                    sleepyMethod(TEST_SLEEP_TIME_MS);
-                    break;
-            }
-            Log.endSession();
-        }
-    };
-
-    private boolean isHandlerCompleteWithEvents;
-    private Handler mSleepyMultipleHandler = new Handler(
-            new HandlerThread("sleepyMultipleThread"){{start();}}.getLooper()){
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case EVENT_START_TEST_SLEEPY_MULTIPLE_METHOD:
-                    SomeArgs args = (SomeArgs) msg.obj;
-                    Session subsession = (Session) args.arg1;
-                    Log.continueSession(subsession, "lTSCH.hM");
-                    sleepyMultipleMethod();
-                    Log.endSession();
-                    break;
-                case EVENT_LAST_MESSAGE:
-                    isHandlerCompleteWithEvents = true;
-                    break;
-            }
-        }
-    };
-
-    private AtomicInteger mCompleteCount;
-    class LogTestRunnable implements java.lang.Runnable {
-        private String mshortMethodName;
-        public LogTestRunnable(String shortMethodName) {
-            mshortMethodName = shortMethodName;
-        }
-
-        public void run() {
-            Log.startSession(mshortMethodName);
-            sleepyCallerMethod(TEST_SLEEP_TIME_MS);
-            Log.endSession();
-            mCompleteCount.incrementAndGet();
-        }
-    }
-
-    TestLoggingContainer mTestSystemLogger;
-
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        MockitoAnnotations.initMocks(this);
-        mTestSystemLogger = new TestLoggingContainer();
-        Log.setLoggingContainer(mTestSystemLogger);
-        Log.setIsExtendedLoggingEnabled(true);
-        Log.restartSessionCounter();
-        Log.sCleanStaleSessions = null;
-        Log.sSessionMapper.clear();
-        Log.setContext(mComponentContextFixture.getTestDouble().getApplicationContext());
-        Log.sSessionCleanupTimeoutMs = new Log.ISessionCleanupTimeoutMs() {
-            @Override
-            // Set to the default value of Timeouts.getStaleSessionCleanupTimeoutMillis without
-            // needing to query.
-            public long get() {
-                return Log.DEFAULT_SESSION_TIMEOUT_MS;
-            }
-        };
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        mTestSystemLogger = null;
-        Log.setLoggingContainer(new SystemLoggingContainer());
-        super.tearDown();
-    }
-
-    @MediumTest
-    public void testSingleThreadSession() throws Exception {
-        String sessionName = "LT.sTS";
-        Log.startSession(sessionName);
-        sleepyMethod(TEST_SLEEP_TIME_MS);
-        Log.endSession();
-
-        verifyEventResult(Session.START_SESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyMethodCall("", sessionName, 0, "", TEST_ENTER_METHOD1, TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.END_SUBSESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyEndEventResult(sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-
-        assertEquals(Log.sSessionMapper.size(), 0);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-    }
-
-    @MediumTest
-    public void testSingleHandlerThreadSession() throws Exception {
-        String sessionName = "LT.tSHTS";
-        Log.startSession(sessionName);
-        Session subsession = Log.createSubsession();
-        SomeArgs args = SomeArgs.obtain();
-        args.arg1 = subsession;
-        mSleepyHandler.obtainMessage(EVENT_START_TEST_SLEEPY_METHOD, args).sendToTarget();
-        Log.endSession();
-
-        verifyEventResult(Session.START_SESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.CREATE_SUBSESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyContinueEventResult(sessionName, "lTSH.hM", "_0", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.END_SUBSESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyMethodCall(sessionName, "lTSH.hM", 0, "_0", TEST_ENTER_METHOD1,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.END_SUBSESSION, sessionName + "->lTSH.hM", "_0", 0,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyEndEventResult(sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-
-        assertEquals(Log.sSessionMapper.size(), 0);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-    }
-
-    @MediumTest
-    public void testSpawnMultipleThreadSessions() throws Exception {
-        final String sessionName = "LT.lTR";
-        mCompleteCount = new AtomicInteger(0);
-        for (int i = 0; i < TEST_THREAD_COUNT; i++) {
-            Thread.sleep(10);
-            new Thread(new LogTestRunnable(sessionName)).start();
-        }
-
-        // Poll until all of the threads have completed
-        while (mCompleteCount.get() < TEST_THREAD_COUNT) {
-            Thread.sleep(1000);
-        }
-
-        // Loop through verification separately to spawn threads fast so there is possible overlap
-        // (verifyEventResult(...) delays)
-        for (int i = 0; i < TEST_THREAD_COUNT; i++) {
-            verifyEventResult(Session.START_SESSION, sessionName, "", i, 0);
-            verifyMethodCall("", sessionName, i, "", TEST_ENTER_METHOD2, 0);
-            verifyMethodCall("", sessionName, i, "", TEST_ENTER_METHOD1, 0);
-            verifyEventResult(Session.END_SUBSESSION, sessionName, "", i, 0);
-            verifyEndEventResult(sessionName, "", i, 0);
-        }
-
-        assertEquals(Log.sSessionMapper.size(), 0);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-    }
-
-    @MediumTest
-    public void testSpawnMultipleThreadMultipleHandlerSession() throws Exception {
-        String sessionName = "LT.tSMTMHS";
-        Log.startSession(sessionName);
-        Session subsession = Log.createSubsession();
-        SomeArgs args = SomeArgs.obtain();
-        args.arg1 = subsession;
-        mSleepyMultipleHandler.obtainMessage(EVENT_START_TEST_SLEEPY_MULTIPLE_METHOD,
-                args).sendToTarget();
-        Log.endSession();
-
-        verifyEventResult(Session.START_SESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.END_SUBSESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.CREATE_SUBSESSION, sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyContinueEventResult(sessionName, "lTSCH.hM", "_0", 0, TEST_VERIFY_TIMEOUT_MS);
-        verifyMethodCall(sessionName, "lTSCH.hM", 0, "_0", TEST_ENTER_METHOD3,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.END_SUBSESSION, sessionName + "->lTSCH.hM", "_0", 0,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.CREATE_SUBSESSION, sessionName + "->lTSCH.hM", "_0", 0,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyContinueEventResult(sessionName + "->" + "lTSCH.hM", "lTSH.hM", "_0_0", 0,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyMethodCall(sessionName + "->lTSCH.hM", "lTSH.hM", 0, "_0_0", TEST_ENTER_METHOD1,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyEventResult(Session.END_SUBSESSION, sessionName + "->lTSCH.hM->lTSH.hM", "_0_0", 0,
-                TEST_VERIFY_TIMEOUT_MS);
-        verifyEndEventResult(sessionName, "", 0, TEST_VERIFY_TIMEOUT_MS);
-
-        assertEquals(Log.sSessionMapper.size(), 0);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-    }
-
-    @MediumTest
-    public void testSpawnMultipleThreadMultipleHandlerSessions() throws Exception {
-        String sessionName = "LT.tSMTMHSs";
-        isHandlerCompleteWithEvents = false;
-        for (int i = 0; i < TEST_THREAD_COUNT; i++) {
-            Log.startSession(sessionName);
-            Session subsession = Log.createSubsession();
-            SomeArgs args = SomeArgs.obtain();
-            args.arg1 = subsession;
-            mSleepyMultipleHandler.obtainMessage(EVENT_START_TEST_SLEEPY_MULTIPLE_METHOD,
-                    args).sendToTarget();
-            Log.endSession();
-        }
-        // Send a message that denotes the last message that is sent. We poll until this message
-        // is processed in order to verify the results without waiting an arbitrary amount of time
-        // (that can change per device).
-        mSleepyMultipleHandler.obtainMessage(EVENT_LAST_MESSAGE).sendToTarget();
-
-        while (!isHandlerCompleteWithEvents) {
-            Thread.sleep(1000);
-        }
-
-        for (int i = 0; i < TEST_THREAD_COUNT; i++) {
-            verifyEventResult(Session.START_SESSION, sessionName, "", i, 0);
-            verifyEventResult(Session.END_SUBSESSION, sessionName, "", i, 0);
-            verifyEventResult(Session.CREATE_SUBSESSION, sessionName, "", i, 0);
-            verifyContinueEventResult(sessionName, "lTSCH.hM", "_0", i, 0);
-            verifyMethodCall(sessionName, "lTSCH.hM", i, "_0", TEST_ENTER_METHOD3, 0);
-            verifyEventResult(Session.END_SUBSESSION, sessionName + "->lTSCH.hM", "_0", i, 0);
-            verifyEventResult(Session.CREATE_SUBSESSION, sessionName + "->lTSCH.hM", "_0", i, 0);
-            verifyContinueEventResult(sessionName + "->" + "lTSCH.hM", "lTSH.hM", "_0_0", i, 0);
-            verifyMethodCall(sessionName + "->lTSCH.hM", "lTSH.hM", i, "_0_0", TEST_ENTER_METHOD1,
-                    0);
-            verifyEventResult(Session.END_SUBSESSION, sessionName + "->lTSCH.hM->lTSH.hM", "_0_0",
-                    i, 0);
-            verifyEndEventResult(sessionName, "", i, 0);
-        }
-
-        assertEquals(Log.sSessionMapper.size(), 0);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-    }
-
-    @MediumTest
-    public void testCancelSubsession() throws Exception {
-        String sessionName = "LT.tCS";
-        Log.startSession(sessionName);
-        Session subsession = Log.createSubsession();
-        Log.cancelSubsession(subsession);
-        Log.endSession();
-
-        verifyEventResult(Session.START_SESSION, sessionName, "", 0, 0);
-        verifyEventResult(Session.CREATE_SUBSESSION, sessionName, "", 0, 0);
-        verifyEventResult(Session.END_SUBSESSION, sessionName, "", 0, 0);
-        verifyEndEventResult(sessionName, "", 0, 0);
-
-        assertEquals(Log.sSessionMapper.size(), 0);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-    }
-
-    @MediumTest
-    public void testInternalExternalCallToMethod() throws Exception {
-        String sessionName = "LT.tIECTM";
-        Log.startSession(sessionName);
-        internalExternalMethod();
-        Log.endSession();
-
-        verifyEventResult(Session.START_SESSION, sessionName, "", 0, 0);
-        verifyEventResult(Session.CREATE_SUBSESSION, sessionName, "", 0, 0);
-        verifyContinueEventResult(sessionName, "", "", 0, 0);
-        verifyEventResult(Session.END_SUBSESSION, sessionName, "", 0, 0);
-        verifyMethodCall("", sessionName, 0, "", TEST_ENTER_METHOD4, 0);
-        verifyEventResult(Session.END_SUBSESSION, sessionName, "", 0, 0);
-        verifyEndEventResult(sessionName, "", 0, 0);
-
-        assertEquals(Log.sSessionMapper.size(), 0);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-    }
-
-    @MediumTest
-    public void testGarbageCollectionWithTimeout() throws Exception {
-        String sessionName = "LT.tGCWT";
-
-        // Don't end session (Oops!)
-        Log.startSession(sessionName);
-        internalDanglingMethod();
-        Log.sSessionCleanupHandler.postDelayed(new java.lang.Runnable() {
-            @Override
-            public void run() {
-                android.util.Log.i(TESTING_TAG, "Running Test SessionCleanupHandler method.");
-                Log.cleanupStaleSessions(1000);
-            }
-        }, 1000);
-
-        verifyEventResult(Session.START_SESSION, sessionName, "", 0, 0);
-        verifyEventResult(Session.CREATE_SUBSESSION, sessionName, "", 0, 0);
-        verifyContinueEventResult(sessionName, "", "", 0, 0);
-        verifyMethodCall("", sessionName, 0, "", TEST_ENTER_METHOD4, 0);
-
-        // Verify the session is still active in sSessionMapper
-        assertEquals(Log.sSessionMapper.size(), 1);
-        assertEquals(true, mTestSystemLogger.isMessagesEmpty());
-
-        // Keep a weak reference to the object to check if it eventually gets garbage collected.
-        int threadId = Log.getCallingThreadId();
-        WeakReference<Session> sessionRef = new WeakReference<>(
-                Log.sSessionMapper.get(threadId));
-
-        Thread.sleep(1100);
-        assertEquals(0, Log.sSessionMapper.size());
-        // "Suggest" that the GC collects the now isolated Session and subsession and wait for it
-        // to occur. "System.gc()" was previously used, but it does not always perform GC, so the
-        // internal method is now called.
-        Runtime.getRuntime().gc();
-        Thread.sleep(1000);
-        assertEquals(null, sessionRef.get());
-    }
-
-    @SmallTest
-    public void testEventRecordTiming() throws Exception {
-        Call call = mock(Call.class);
-        Analytics.CallInfo mockCallInfo = mock(Analytics.CallInfo.class);
-        when(call.getAnalytics()).thenReturn(mockCallInfo);
-        int minWaitTime = 40;
-        Log.event(call, Log.Events.REQUEST_ACCEPT);
-        Thread.sleep(minWaitTime);
-        Log.event(call, Log.Events.SET_ACTIVE);
-
-        ArgumentCaptor<Log.CallEventRecord> captor =
-                ArgumentCaptor.forClass(Log.CallEventRecord.class);
-        verify(mockCallInfo).setCallEvents(captor.capture());
-        List<Log.CallEventRecord.EventTiming> eventTimings =
-                captor.getValue().extractEventTimings();
-        eventTimings.stream()
-                .filter(timing -> timing.name.equals("accept"))
-                .forEach(timing -> assertTrue(timing.time > minWaitTime));
-    }
-
-    private void verifyMethodCall(String parentSessionName, String methodName, int sessionId,
-            String subsession, String shortMethodName, int timeoutMs) {
-        if (!parentSessionName.isEmpty()){
-            parentSessionName += "->";
-        }
-        boolean isMessageReceived = mTestSystemLogger.didReceiveMessage(timeoutMs,
-                buildExpectedResult(parentSessionName + methodName, sessionId, subsession,
-                        shortMethodName));
-
-        assertEquals(true, isMessageReceived);
-    }
-
-    private String buildExpectedSession(String shortMethodName, int sessionId) {
-        return shortMethodName + "@" + Log.getBase64Encoding(sessionId);
-    }
-
-    private String buildExpectedResult(String shortMethodName, int sessionId,
-            String subsessionId, String logText) {
-        return TEST_CLASS_NAME + ": " +  logText + ": " +
-                buildExpectedSession(shortMethodName, sessionId) + subsessionId;
-    }
-
-    private void verifyContinueEventResult(String shortOldMethodName, String shortNewMethodName,
-                String subsession, int sessionId, int timeoutMs) {
-        String expectedSession = buildExpectedSession(shortNewMethodName, sessionId);
-        if(!shortNewMethodName.isEmpty()) {
-            shortOldMethodName += "->";
-        }
-        boolean isMessageReceived = mTestSystemLogger.didReceiveMessage(timeoutMs,
-                Session.CONTINUE_SUBSESSION + ": " + shortOldMethodName + expectedSession +
-                        subsession);
-        assertEquals(true, isMessageReceived);
-    }
-
-    private void verifyEventResult(String event, String shortMethodName,  String subsession,
-            int sessionId, int timeoutMs) {
-        String expectedSession = buildExpectedSession(shortMethodName, sessionId);
-        boolean isMessageReceived = mTestSystemLogger.didReceiveMessage(timeoutMs,event + ": "  +
-                expectedSession + subsession);
-        assertEquals(true, isMessageReceived);
-    }
-
-    private void verifyEndEventResult(String shortMethodName, String subsession, int sessionId,
-            int timeoutMs) {
-        String expectedSession = buildExpectedSession(shortMethodName, sessionId);
-        boolean isMessageReceived = mTestSystemLogger.didReceiveMessage(timeoutMs,
-                Session.END_SESSION + ": " + expectedSession + subsession);
-        assertEquals(true, isMessageReceived);
-    }
-
-    private void internalExternalMethod() {
-        Log.startSession("LT.iEM");
-        Log.i(TEST_CLASS_NAME, TEST_ENTER_METHOD4);
-        Log.endSession();
-    }
-
-    private void internalDanglingMethod() {
-        Log.startSession("LT.iEM");
-        Log.i(TEST_CLASS_NAME, TEST_ENTER_METHOD4);
-    }
-
-    private void sleepyCallerMethod(int timeToSleepMs) {
-        Log.i(TEST_CLASS_NAME, TEST_ENTER_METHOD2);
-        try {
-            Thread.sleep(timeToSleepMs);
-            sleepyMethod(rng.nextInt(TEST_SLEEP_TIME_MS));
-        } catch (InterruptedException e) {
-            // This should not happen
-            Assert.fail("Thread sleep interrupted: " + e.getMessage());
-        }
-
-    }
-
-    private void sleepyMultipleMethod() {
-        Log.i(TEST_CLASS_NAME, TEST_ENTER_METHOD3);
-        Session subsession = Log.createSubsession();
-        SomeArgs args = SomeArgs.obtain();
-        args.arg1 = subsession;
-        mSleepyHandler.obtainMessage(EVENT_START_TEST_SLEEPY_METHOD, args).sendToTarget();
-        try {
-            Thread.sleep(TEST_SLEEP_TIME_MS);
-        } catch (InterruptedException e) {
-            // This should not happen
-            Assert.fail("Thread sleep interrupted: " + e.getMessage());
-        }
-    }
-
-    private void sleepyMethod(int timeToSleepMs) {
-        Log.i(TEST_CLASS_NAME, TEST_ENTER_METHOD1);
-        try {
-            Thread.sleep(timeToSleepMs);
-        } catch (InterruptedException e) {
-            // This should not happen
-            Assert.fail("Thread sleep interrupted: " + e.getMessage());
-        }
-    }
-}
\ No newline at end of file
diff --git a/tests/src/com/android/server/telecom/tests/MissedCallNotifierImplTest.java b/tests/src/com/android/server/telecom/tests/MissedCallNotifierImplTest.java
index 24c59ff..13a85af 100644
--- a/tests/src/com/android/server/telecom/tests/MissedCallNotifierImplTest.java
+++ b/tests/src/com/android/server/telecom/tests/MissedCallNotifierImplTest.java
@@ -20,24 +20,33 @@
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.ComponentName;
+import android.content.ContentProvider;
 import android.content.Context;
+import android.content.IContentProvider;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
+import android.database.Cursor;
 import android.net.Uri;
+import android.os.Handler;
+import android.os.ICancellationSignal;
+import android.os.Looper;
 import android.os.UserHandle;
+import android.provider.CallLog;
 import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccount.Builder;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.TelephonyManager;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.server.telecom.Call;
+import com.android.internal.telephony.CallerInfo;
+import com.android.server.telecom.CallerInfoLookupHelper;
 import com.android.server.telecom.Constants;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.MissedCallNotifier;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.PhoneNumberUtilsAdapterImpl;
 import com.android.server.telecom.TelecomBroadcastIntentProcessor;
+import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.components.TelecomBroadcastReceiver;
 import com.android.server.telecom.ui.MissedCallNotifierImpl;
 import com.android.server.telecom.ui.MissedCallNotifierImpl.NotificationBuilderFactory;
@@ -48,20 +57,65 @@
 
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 public class MissedCallNotifierImplTest extends TelecomTestCase {
 
+    private static class MockMissedCallCursorBuilder {
+        private class CallLogRow {
+            String number;
+            int presentation;
+            long date;
+
+            public CallLogRow(String number, int presentation, long date) {
+                this.number = number;
+                this.presentation = presentation;
+                this.date = date;
+            }
+        }
+
+        private List<CallLogRow> mRows;
+
+        MockMissedCallCursorBuilder() {
+            mRows = new LinkedList<>();
+            mRows.add(null);
+        }
+
+        public MockMissedCallCursorBuilder addEntry(String number, int presentation, long date) {
+            mRows.add(new CallLogRow(number, presentation, date));
+            return this;
+        }
+
+        public Cursor build() {
+            Cursor c = mock(Cursor.class);
+            when(c.moveToNext()).thenAnswer(unused -> {
+                mRows.remove(0);
+                return mRows.size() > 0;
+            });
+            when(c.getString(MissedCallNotifierImpl.CALL_LOG_COLUMN_NUMBER))
+                    .thenAnswer(unused -> mRows.get(0).number);
+            when(c.getInt(MissedCallNotifierImpl.CALL_LOG_COLUMN_NUMBER_PRESENTATION))
+                    .thenAnswer(unused -> mRows.get(0).presentation);
+            when(c.getLong(MissedCallNotifierImpl.CALL_LOG_COLUMN_DATE))
+                    .thenAnswer(unused -> mRows.get(0).date);
+            return c;
+        }
+    }
+
     private static final Uri TEL_CALL_HANDLE = Uri.parse("tel:+11915552620");
     private static final Uri SIP_CALL_HANDLE = Uri.parse("sip:testaddress@testdomain.com");
     private static final String CALLER_NAME = "Fake Name";
@@ -79,6 +133,7 @@
     private static final UserHandle PRIMARY_USER = UserHandle.of(0);
     private static final UserHandle SECONARY_USER = UserHandle.of(12);
     private static final int NO_CAPABILITY = 0;
+    private static final int TEST_TIMEOUT = 1000;
 
     @Mock
     private NotificationManager mNotificationManager;
@@ -89,6 +144,9 @@
     @Mock
     private TelecomManager mTelecomManager;
 
+    @Mock TelecomSystem mTelecomSystem;
+    @Mock private DefaultDialerCache mDefaultDialerCache;
+
     @Override
     public void setUp() throws Exception {
         super.setUp();
@@ -114,6 +172,12 @@
         mComponentContextFixture.setTelecomManager(mTelecomManager);
     }
 
+    @Override
+    public void tearDown() throws Exception {
+        TelecomSystem.setInstance(null);
+        when(mTelecomSystem.isBootComplete()).thenReturn(false);
+    }
+
     @SmallTest
     public void testCancelNotificationInPrimaryUser() {
         cancelNotificationTestInternal(PRIMARY_USER);
@@ -133,8 +197,8 @@
         MissedCallNotifier missedCallNotifier = makeMissedCallNotifier(fakeBuilderFactory,
                 PRIMARY_USER);
         PhoneAccount phoneAccount = makePhoneAccount(userHandle, NO_CAPABILITY);
-        Call fakeCall = makeFakeCall(TEL_CALL_HANDLE, CALLER_NAME, CALL_TIMESTAMP,
-                phoneAccount.getAccountHandle());
+        MissedCallNotifier.CallInfo fakeCall = makeFakeCallInfo(TEL_CALL_HANDLE, CALLER_NAME,
+                CALL_TIMESTAMP, phoneAccount.getAccountHandle());
 
         missedCallNotifier.showMissedCallNotification(fakeCall);
         missedCallNotifier.clearMissedCalls(userHandle);
@@ -160,14 +224,14 @@
         }
 
         PhoneAccount phoneAccount = makePhoneAccount(PRIMARY_USER, NO_CAPABILITY);
-        Call fakeCall = makeFakeCall(TEL_CALL_HANDLE, CALLER_NAME, CALL_TIMESTAMP,
-                phoneAccount.getAccountHandle());
+        MissedCallNotifier.CallInfo fakeCall = makeFakeCallInfo(TEL_CALL_HANDLE, CALLER_NAME,
+                CALL_TIMESTAMP, phoneAccount.getAccountHandle());
 
         MissedCallNotifierImpl.NotificationBuilderFactory fakeBuilderFactory =
                 makeNotificationBuilderFactory(builders);
 
         MissedCallNotifier missedCallNotifier = new MissedCallNotifierImpl(mContext,
-                mPhoneAccountRegistrar, new PhoneNumberUtilsAdapterImpl(), fakeBuilderFactory);
+                mPhoneAccountRegistrar, mDefaultDialerCache, fakeBuilderFactory);
 
         missedCallNotifier.showMissedCallNotification(fakeCall);
         missedCallNotifier.showMissedCallNotification(fakeCall);
@@ -254,8 +318,8 @@
         MissedCallNotifier missedCallNotifier = makeMissedCallNotifier(fakeBuilderFactory,
                 currentUser);
 
-        Call fakeCall = makeFakeCall(TEL_CALL_HANDLE, CALLER_NAME, CALL_TIMESTAMP,
-                phoneAccount.getAccountHandle());
+        MissedCallNotifier.CallInfo fakeCall = makeFakeCallInfo(TEL_CALL_HANDLE, CALLER_NAME,
+                CALL_TIMESTAMP, phoneAccount.getAccountHandle());
         missedCallNotifier.showMissedCallNotification(fakeCall);
 
         ArgumentCaptor<Notification> notificationArgumentCaptor = ArgumentCaptor.forClass(
@@ -316,11 +380,11 @@
                 makeNotificationBuilderFactory(builder1);
 
         MissedCallNotifier missedCallNotifier = new MissedCallNotifierImpl(mContext,
-                mPhoneAccountRegistrar, new PhoneNumberUtilsAdapterImpl(), fakeBuilderFactory);
+                mPhoneAccountRegistrar, mDefaultDialerCache, fakeBuilderFactory);
         PhoneAccount phoneAccount = makePhoneAccount(PRIMARY_USER, NO_CAPABILITY);
 
-        Call fakeCall =
-                makeFakeCall(SIP_CALL_HANDLE, CALLER_NAME, CALL_TIMESTAMP,
+        MissedCallNotifier.CallInfo fakeCall =
+                makeFakeCallInfo(SIP_CALL_HANDLE, CALLER_NAME, CALL_TIMESTAMP,
                 phoneAccount.getAccountHandle());
         missedCallNotifier.showMissedCallNotification(fakeCall);
 
@@ -344,6 +408,135 @@
                 smsIntent, PendingIntent.FLAG_NO_CREATE));
     }
 
+    @SmallTest
+    public void testLoadOneCallFromDb() throws Exception {
+        CallerInfoLookupHelper mockCallerInfoLookupHelper = mock(CallerInfoLookupHelper.class);
+        MissedCallNotifier.CallInfoFactory mockCallInfoFactory =
+                mock(MissedCallNotifier.CallInfoFactory.class);
+
+        Uri queryUri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI,
+                PRIMARY_USER.getIdentifier());
+        IContentProvider cp = getContentProviderForUser(PRIMARY_USER.getIdentifier());
+
+        Cursor mockMissedCallsCursor = new MockMissedCallCursorBuilder()
+                .addEntry(TEL_CALL_HANDLE.getSchemeSpecificPart(),
+                        CallLog.Calls.PRESENTATION_ALLOWED, CALL_TIMESTAMP)
+                .build();
+
+        when(cp.query(anyString(), eq(queryUri), any(String[].class), anyString(), any
+                (String[].class), anyString(), any(ICancellationSignal.class)))
+                .thenReturn(mockMissedCallsCursor);
+
+        PhoneAccount phoneAccount = makePhoneAccount(PRIMARY_USER, NO_CAPABILITY);
+        MissedCallNotifier.CallInfo fakeCallInfo = makeFakeCallInfo(TEL_CALL_HANDLE,
+                CALLER_NAME, CALL_TIMESTAMP, phoneAccount.getAccountHandle());
+        when(mockCallInfoFactory.makeCallInfo(any(CallerInfo.class),
+                any(PhoneAccountHandle.class), any(Uri.class), eq(CALL_TIMESTAMP)))
+                .thenReturn(fakeCallInfo);
+
+        Notification.Builder builder1 = makeNotificationBuilder("builder1");
+        MissedCallNotifierImpl.NotificationBuilderFactory fakeBuilderFactory =
+                makeNotificationBuilderFactory(builder1);
+
+        MissedCallNotifier missedCallNotifier = new MissedCallNotifierImpl(mContext,
+                mPhoneAccountRegistrar, mDefaultDialerCache, fakeBuilderFactory);
+
+        // AsyncQueryHandler used in reloadFromDatabase interacts poorly with the below
+        // timeout-verify, so run this in a new handler to mitigate that.
+        Handler h = new Handler(Looper.getMainLooper());
+        h.post(() -> missedCallNotifier.reloadFromDatabase(
+                mockCallerInfoLookupHelper, mockCallInfoFactory, PRIMARY_USER));
+        waitForHandlerAction(h, TEST_TIMEOUT);
+
+        // TelecomSystem.getInstance returns null in this test, so we expect that nothing will
+        // happen.
+        verify(mockCallerInfoLookupHelper, never()).startLookup(any(Uri.class),
+                any(CallerInfoLookupHelper.OnQueryCompleteListener.class));
+        // Simulate a boot-complete
+        TelecomSystem.setInstance(mTelecomSystem);
+        when(mTelecomSystem.isBootComplete()).thenReturn(true);
+        h.post(() -> missedCallNotifier.reloadAfterBootComplete(mockCallerInfoLookupHelper,
+                mockCallInfoFactory));
+        waitForHandlerAction(h, TEST_TIMEOUT);
+
+        Uri escapedHandle = Uri.fromParts(PhoneAccount.SCHEME_TEL,
+                TEL_CALL_HANDLE.getSchemeSpecificPart(), null);
+        ArgumentCaptor<CallerInfoLookupHelper.OnQueryCompleteListener> listenerCaptor =
+                ArgumentCaptor.forClass(CallerInfoLookupHelper.OnQueryCompleteListener.class);
+        verify(mockCallerInfoLookupHelper, timeout(TEST_TIMEOUT)).startLookup(eq(escapedHandle),
+                listenerCaptor.capture());
+
+        CallerInfo ci = new CallerInfo();
+        listenerCaptor.getValue().onCallerInfoQueryComplete(escapedHandle, ci);
+        verify(mockCallInfoFactory).makeCallInfo(eq(ci), isNull(PhoneAccountHandle.class),
+                eq(escapedHandle), eq(CALL_TIMESTAMP));
+    }
+
+    @SmallTest
+    public void testLoadTwoCallsFromDb() throws Exception {
+        TelecomSystem.setInstance(mTelecomSystem);
+        when(mTelecomSystem.isBootComplete()).thenReturn(true);
+        CallerInfoLookupHelper mockCallerInfoLookupHelper = mock(CallerInfoLookupHelper.class);
+        MissedCallNotifier.CallInfoFactory mockCallInfoFactory =
+                mock(MissedCallNotifier.CallInfoFactory.class);
+
+        Cursor mockMissedCallsCursor = new MockMissedCallCursorBuilder()
+                .addEntry(TEL_CALL_HANDLE.getSchemeSpecificPart(),
+                        CallLog.Calls.PRESENTATION_ALLOWED, CALL_TIMESTAMP)
+                .addEntry(SIP_CALL_HANDLE.getSchemeSpecificPart(),
+                        CallLog.Calls.PRESENTATION_ALLOWED, CALL_TIMESTAMP)
+                .build();
+
+        Uri queryUri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI,
+                PRIMARY_USER.getIdentifier());
+        IContentProvider cp = getContentProviderForUser(PRIMARY_USER.getIdentifier());
+
+        when(cp.query(anyString(), eq(queryUri), any(String[].class), anyString(), any
+                (String[].class), anyString(), any(ICancellationSignal.class)))
+                .thenReturn(mockMissedCallsCursor);
+
+        PhoneAccount phoneAccount = makePhoneAccount(PRIMARY_USER, NO_CAPABILITY);
+        MissedCallNotifier.CallInfo fakeCallInfo = makeFakeCallInfo(TEL_CALL_HANDLE,
+                CALLER_NAME, CALL_TIMESTAMP, phoneAccount.getAccountHandle());
+        when(mockCallInfoFactory.makeCallInfo(any(CallerInfo.class),
+                any(PhoneAccountHandle.class), any(Uri.class), eq(CALL_TIMESTAMP)))
+                .thenReturn(fakeCallInfo);
+
+        Notification.Builder builder1 = makeNotificationBuilder("builder1");
+        MissedCallNotifierImpl.NotificationBuilderFactory fakeBuilderFactory =
+                makeNotificationBuilderFactory(builder1);
+
+        MissedCallNotifier missedCallNotifier = new MissedCallNotifierImpl(mContext,
+                mPhoneAccountRegistrar, mDefaultDialerCache, fakeBuilderFactory);
+
+        // AsyncQueryHandler used in reloadFromDatabase interacts poorly with the below
+        // timeout-verify, so run this in a new handler to mitigate that.
+        Handler h = new Handler(Looper.getMainLooper());
+        h.post(() -> missedCallNotifier.reloadFromDatabase(
+                mockCallerInfoLookupHelper, mockCallInfoFactory, PRIMARY_USER));
+        waitForHandlerAction(h, TEST_TIMEOUT);
+
+        Uri escapedTelHandle = Uri.fromParts(PhoneAccount.SCHEME_TEL,
+                TEL_CALL_HANDLE.getSchemeSpecificPart(), null);
+        Uri escapedSipHandle = Uri.fromParts(PhoneAccount.SCHEME_SIP,
+                SIP_CALL_HANDLE.getSchemeSpecificPart(), null);
+
+        ArgumentCaptor<CallerInfoLookupHelper.OnQueryCompleteListener> listenerCaptor =
+                ArgumentCaptor.forClass(CallerInfoLookupHelper.OnQueryCompleteListener.class);
+        verify(mockCallerInfoLookupHelper, timeout(TEST_TIMEOUT)).startLookup(eq(escapedTelHandle),
+                listenerCaptor.capture());
+        verify(mockCallerInfoLookupHelper, timeout(TEST_TIMEOUT)).startLookup(eq(escapedSipHandle),
+                listenerCaptor.capture());
+
+        CallerInfo ci = new CallerInfo();
+        listenerCaptor.getAllValues().get(0).onCallerInfoQueryComplete(escapedTelHandle, ci);
+        listenerCaptor.getAllValues().get(1).onCallerInfoQueryComplete(escapedSipHandle, ci);
+
+        // Verify that two notifications were generated, both with the same id.
+        verify(mNotificationManager, times(2)).notifyAsUser(isNull(String.class), eq(1),
+                any(Notification.class), eq(PRIMARY_USER));
+    }
+
     private Notification.Builder makeNotificationBuilder(String label) {
         Notification.Builder builder = spy(new Notification.Builder(mContext));
         Notification notification = mock(Notification.class);
@@ -353,13 +546,14 @@
         return builder;
     }
 
-    private Call makeFakeCall(Uri handle, String name, long timestamp,
+    private MissedCallNotifier.CallInfo makeFakeCallInfo(Uri handle, String name, long timestamp,
             PhoneAccountHandle phoneAccountHandle) {
-        Call fakeCall = mock(Call.class);
+        MissedCallNotifier.CallInfo fakeCall = mock(MissedCallNotifier.CallInfo.class);
         when(fakeCall.getHandle()).thenReturn(handle);
+        when(fakeCall.getHandleSchemeSpecificPart()).thenReturn(handle.getSchemeSpecificPart());
         when(fakeCall.getName()).thenReturn(name);
         when(fakeCall.getCreationTimeMillis()).thenReturn(timestamp);
-        when(fakeCall.getTargetPhoneAccount()).thenReturn(phoneAccountHandle);
+        when(fakeCall.getPhoneAccountHandle()).thenReturn(phoneAccountHandle);
         return fakeCall;
     }
 
@@ -375,7 +569,7 @@
     private MissedCallNotifier makeMissedCallNotifier(
             NotificationBuilderFactory fakeBuilderFactory, UserHandle currentUser) {
         MissedCallNotifier missedCallNotifier = new MissedCallNotifierImpl(mContext,
-                mPhoneAccountRegistrar, new PhoneNumberUtilsAdapterImpl(), fakeBuilderFactory);
+                mPhoneAccountRegistrar, mDefaultDialerCache, fakeBuilderFactory);
         missedCallNotifier.setCurrentUserHandle(currentUser);
         return missedCallNotifier;
     }
@@ -391,4 +585,9 @@
                 .thenReturn(phoneAccount);
         return phoneAccount;
     }
+
+    private IContentProvider getContentProviderForUser(int userId) {
+        return mContext.getContentResolver().acquireProvider(userId + "@call_log");
+    }
+
 }
diff --git a/tests/src/com/android/server/telecom/tests/MockitoHelper.java b/tests/src/com/android/server/telecom/tests/MockitoHelper.java
index 3425b0e..a28dfb0 100644
--- a/tests/src/com/android/server/telecom/tests/MockitoHelper.java
+++ b/tests/src/com/android/server/telecom/tests/MockitoHelper.java
@@ -16,9 +16,8 @@
 
 package com.android.server.telecom.tests;
 
-import com.android.server.telecom.Log;
-
 import android.content.Context;
+import android.telecom.Log;
 
 /**
  * Helper for Mockito-based test cases.
diff --git a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
index 12d24c4..f2faf90 100644
--- a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
+++ b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
@@ -26,6 +26,7 @@
 import android.os.Parcel;
 import android.os.Process;
 import android.os.UserHandle;
+import android.telecom.Log;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -34,7 +35,7 @@
 
 import com.android.internal.telecom.IConnectionService;
 import com.android.internal.util.FastXmlSerializer;
-import com.android.server.telecom.Log;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.PhoneAccountRegistrar.DefaultPhoneAccountHandle;
 
@@ -52,13 +53,16 @@
 import java.util.Arrays;
 import java.util.Set;
 
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.when;
+
 public class PhoneAccountRegistrarTest extends TelecomTestCase {
 
     private static final int MAX_VERSION = Integer.MAX_VALUE;
     private static final String FILE_NAME = "phone-account-registrar-test-1223.xml";
     private PhoneAccountRegistrar mRegistrar;
-    @Mock
-    private TelecomManager mTelecomManager;
+    @Mock private TelecomManager mTelecomManager;
+    @Mock private DefaultDialerCache mDefaultDialerCache;
 
     @Override
     public void setUp() throws Exception {
@@ -69,9 +73,11 @@
                 mComponentContextFixture.getTestDouble().getApplicationContext().getFilesDir(),
                 FILE_NAME)
                 .delete();
+        when(mDefaultDialerCache.getDefaultDialerApplication(anyInt()))
+                .thenReturn("com.android.dialer");
         mRegistrar = new PhoneAccountRegistrar(
                 mComponentContextFixture.getTestDouble().getApplicationContext(),
-                FILE_NAME);
+                FILE_NAME, mDefaultDialerCache);
     }
 
     @Override
@@ -120,6 +126,16 @@
         assertPhoneAccountEquals(input, result);
     }
 
+    @MediumTest
+    public void testDefaultPhoneAccountHandleEmptyGroup() throws Exception {
+        DefaultPhoneAccountHandle input = new DefaultPhoneAccountHandle(Process.myUserHandle(),
+                makeQuickAccountHandle("i1"), "");
+        DefaultPhoneAccountHandle result = roundTripXml(this, input,
+                PhoneAccountRegistrar.sDefaultPhoneAcountHandleXml, mContext);
+
+        assertDefaultPhoneAccountHandleEquals(input, result);
+    }
+
     /**
      * Test to ensure non-supported values
      * @throws Exception
diff --git a/tests/src/com/android/server/telecom/tests/SessionManagerTest.java b/tests/src/com/android/server/telecom/tests/SessionManagerTest.java
new file mode 100644
index 0000000..2d9b0c6
--- /dev/null
+++ b/tests/src/com/android/server/telecom/tests/SessionManagerTest.java
@@ -0,0 +1,384 @@
+/*
+ * Copyright (C) 2016 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.server.telecom.tests;
+
+import android.telecom.Logging.Session;
+import android.telecom.Logging.SessionManager;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Unit tests for android.telecom.Logging.SessionManager
+ */
+
+public class SessionManagerTest extends TelecomTestCase {
+
+    private static final String TEST_PARENT_NAME = "testParent";
+    private static final int TEST_PARENT_THREAD_ID = 0;
+    private static final String TEST_CHILD_NAME = "testChild";
+    private static final int TEST_CHILD_THREAD_ID = 1;
+    private static final int TEST_DELAY_TIME = 100; // ms
+
+    private SessionManager mTestSessionManager;
+    // Used to verify sessionComplete callback
+    private long mfullSessionCompleteTime = Session.UNDEFINED;
+    private String mFullSessionMethodName = "";
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mTestSessionManager = new SessionManager();
+        mTestSessionManager.registerSessionListener(((sessionName, timeMs) -> {
+            mfullSessionCompleteTime = timeMs;
+            mFullSessionMethodName = sessionName;
+        }));
+        // Remove automatic stale session cleanup for testing
+        mTestSessionManager.mCleanStaleSessions = null;
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        mFullSessionMethodName = "";
+        mfullSessionCompleteTime = Session.UNDEFINED;
+        mTestSessionManager = null;
+        super.tearDown();
+    }
+
+    /**
+     * Starts a Session on the current thread and verifies that it exists in the HashMap
+     */
+    @SmallTest
+    public void testStartSession() {
+        assertTrue(mTestSessionManager.mSessionMapper.isEmpty());
+
+        // Set the thread Id to 0
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+
+        Session testSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        assertEquals(TEST_PARENT_NAME, testSession.getShortMethodName());
+        assertFalse(testSession.isSessionCompleted());
+        assertFalse(testSession.isStartedFromActiveSession());
+    }
+
+    /**
+     * Starts two sessions in the same thread. The first session will be parented to the second
+     * session and the second session will be attached to that thread ID.
+     */
+    @SmallTest
+    public void testStartInvisibleChildSession() {
+        assertTrue(mTestSessionManager.mSessionMapper.isEmpty());
+
+        // Set the thread Id to 0 for the parent
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        // Create invisible child session - same Thread ID as parent
+        mTestSessionManager.startSession(TEST_CHILD_NAME, null);
+
+        // There should only be one session in the mapper (the child)
+        assertEquals(1, mTestSessionManager.mSessionMapper.size());
+        Session testChildSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        assertEquals( TEST_CHILD_NAME, testChildSession.getShortMethodName());
+        assertTrue(testChildSession.isStartedFromActiveSession());
+        assertNotNull(testChildSession.getParentSession());
+        assertEquals(TEST_PARENT_NAME, testChildSession.getParentSession().getShortMethodName());
+        assertFalse(testChildSession.isSessionCompleted());
+        assertFalse(testChildSession.getParentSession().isSessionCompleted());
+    }
+
+    /**
+     * End the active Session and verify that it is completed and removed from mSessionMapper.
+     */
+    @SmallTest
+    public void testEndSession() {
+        assertTrue(mTestSessionManager.mSessionMapper.isEmpty());
+        // Set the thread Id to 0
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session testSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+
+        assertEquals(1, mTestSessionManager.mSessionMapper.size());
+        try {
+            // Make sure execution time is > 0
+            Thread.sleep(1);
+        } catch (InterruptedException ignored) {}
+        mTestSessionManager.endSession();
+
+        assertTrue(testSession.isSessionCompleted());
+        assertTrue(testSession.getLocalExecutionTime() > 0);
+        assertTrue(mTestSessionManager.mSessionMapper.isEmpty());
+    }
+
+    /**
+     * Ends an active invisible child session and verifies that the parent session is moved back
+     * into mSessionMapper.
+     */
+    @SmallTest
+    public void testEndInvisibleChildSession() {
+        assertTrue(mTestSessionManager.mSessionMapper.isEmpty());
+        // Set the thread Id to 0 for the parent
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        // Create invisible child session - same Thread ID as parent
+        mTestSessionManager.startSession(TEST_CHILD_NAME, null);
+        Session testChildSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+
+        mTestSessionManager.endSession();
+
+        // There should only be one session in the mapper (the parent)
+        assertEquals(1, mTestSessionManager.mSessionMapper.size());
+        Session testParentSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        assertEquals(TEST_PARENT_NAME, testParentSession.getShortMethodName());
+        assertFalse(testParentSession.isStartedFromActiveSession());
+        assertTrue(testChildSession.isSessionCompleted());
+        assertFalse(testParentSession.isSessionCompleted());
+    }
+
+    /**
+     * Creates a subsession (child Session) of the current session and prepares it to be continued
+     * in a different thread.
+     */
+    @SmallTest
+    public void testCreateSubsession() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+
+        Session testSession = mTestSessionManager.createSubsession();
+
+        assertEquals(1, mTestSessionManager.mSessionMapper.size());
+        Session parentSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        assertNotNull(testSession.getParentSession());
+        assertEquals(TEST_PARENT_NAME, testSession.getParentSession().getShortMethodName());
+        assertEquals(TEST_PARENT_NAME, parentSession.getShortMethodName());
+        assertTrue(parentSession.getChildSessions().contains(testSession));
+        assertFalse(testSession.isSessionCompleted());
+        assertFalse(testSession.isStartedFromActiveSession());
+        assertTrue(testSession.getChildSessions().isEmpty());
+    }
+
+    /**
+     * Cancels a subsession that was started before it was continued and verifies that it is
+     * marked as completed and never added to mSessionMapper.
+     */
+    @SmallTest
+    public void testCancelSubsession() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session parentSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        Session testSession = mTestSessionManager.createSubsession();
+
+        mTestSessionManager.cancelSubsession(testSession);
+
+        assertTrue(testSession.isSessionCompleted());
+        assertFalse(parentSession.isSessionCompleted());
+        assertEquals(Session.UNDEFINED, testSession.getLocalExecutionTime());
+        assertNull(testSession.getParentSession());
+    }
+
+
+    /**
+     * Continues a subsession in a different thread and verifies that both the new subsession and
+     * its parent are in mSessionMapper.
+     */
+    @SmallTest
+    public void testContinueSubsession() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session parentSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        Session testSession = mTestSessionManager.createSubsession();
+
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+        mTestSessionManager.continueSession(testSession, TEST_CHILD_NAME);
+
+        assertEquals(2, mTestSessionManager.mSessionMapper.size());
+        assertEquals(testSession, mTestSessionManager.mSessionMapper.get(TEST_CHILD_THREAD_ID));
+        assertEquals(parentSession, testSession.getParentSession());
+        assertFalse(parentSession.isStartedFromActiveSession());
+        assertFalse(parentSession.isSessionCompleted());
+        assertFalse(testSession.isSessionCompleted());
+        assertFalse(testSession.isStartedFromActiveSession());
+    }
+
+    /**
+     * Ends a subsession that exists in a different thread and verifies that it is completed and
+     * no longer exists in mSessionMapper.
+     */
+    @SmallTest
+    public void testEndSubsession() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session parentSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        Session testSession = mTestSessionManager.createSubsession();
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+        mTestSessionManager.continueSession(testSession, TEST_CHILD_NAME);
+
+        mTestSessionManager.endSession();
+
+        assertTrue(testSession.isSessionCompleted());
+        assertNull(mTestSessionManager.mSessionMapper.get(TEST_CHILD_THREAD_ID));
+        assertFalse(parentSession.isSessionCompleted());
+        assertEquals(parentSession, mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID));
+    }
+
+    /**
+     * When there are subsessions in multiple threads, the parent session may end before the
+     * subsessions themselves. When the subsession ends, we need to recursively clean up the parent
+     * sessions that are complete as well and note the completion time of the entire chain.
+     */
+    @SmallTest
+    public void testEndSubsessionWithParentComplete() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session parentSession = mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID);
+        Session childSession = mTestSessionManager.createSubsession();
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+        mTestSessionManager.continueSession(childSession, TEST_CHILD_NAME);
+        // Switch to the parent session ID and end the session.
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.endSession();
+        assertTrue(parentSession.isSessionCompleted());
+        assertFalse(childSession.isSessionCompleted());
+
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+        try {
+            Thread.sleep(TEST_DELAY_TIME);
+        } catch (InterruptedException ignored) {}
+        mTestSessionManager.endSession();
+
+        assertEquals(0, mTestSessionManager.mSessionMapper.size());
+        assertTrue(parentSession.getChildSessions().isEmpty());
+        assertNull(childSession.getParentSession());
+        assertTrue(childSession.isSessionCompleted());
+        assertEquals(TEST_PARENT_NAME, mFullSessionMethodName);
+        // Reduce flakiness by assuming that the true completion time is within a threshold of
+        // +-10 ms
+        assertTrue(mfullSessionCompleteTime >= TEST_DELAY_TIME - 10);
+        assertTrue(mfullSessionCompleteTime <= TEST_DELAY_TIME + 10);
+    }
+
+    /**
+     * Tests that starting an external session packages up the parent session information and
+     * correctly generates the child session.
+     */
+    @SmallTest
+    public void testStartExternalSession() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session.Info sessionInfo =
+                mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID).getInfo();
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+
+        mTestSessionManager.startExternalSession(sessionInfo, TEST_CHILD_NAME);
+
+        Session externalSession = mTestSessionManager.mSessionMapper.get(TEST_CHILD_THREAD_ID);
+        assertNotNull(externalSession);
+        assertFalse(externalSession.isSessionCompleted());
+        assertEquals(TEST_CHILD_NAME, externalSession.getShortMethodName());
+        // First subsession of the parent external Session, so the session will be _0.
+        assertEquals("0", externalSession.getSessionId());
+    }
+
+    /**
+     * Verifies that ending an external session tears down the session correctly and removes the
+     * external session from mSessionMapper.
+     */
+    @SmallTest
+    public void testEndExternalSession() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session.Info sessionInfo =
+                mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID).getInfo();
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+        mTestSessionManager.startExternalSession(sessionInfo, TEST_CHILD_NAME);
+        Session externalSession = mTestSessionManager.mSessionMapper.get(TEST_CHILD_THREAD_ID);
+
+        try {
+            // Make sure execution time is > 0
+            Thread.sleep(1);
+        } catch (InterruptedException ignored) {}
+        mTestSessionManager.endSession();
+
+        assertTrue(externalSession.isSessionCompleted());
+        assertTrue(externalSession.getLocalExecutionTime() > 0);
+        assertNull(mTestSessionManager.mSessionMapper.get(TEST_CHILD_THREAD_ID));
+    }
+
+    /**
+     * Verifies that the callback to inform that the top level parent Session has completed is not
+     * the external Session, but the one subsession underneath.
+     */
+    @SmallTest
+    public void testEndExternalSessionListenerCallback() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session.Info sessionInfo =
+                mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID).getInfo();
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+        mTestSessionManager.startExternalSession(sessionInfo, TEST_CHILD_NAME);
+
+        try {
+            // Make sure execution time is recorded correctly
+            Thread.sleep(TEST_DELAY_TIME);
+        } catch (InterruptedException ignored) {}
+        mTestSessionManager.endSession();
+
+        assertEquals(TEST_CHILD_NAME, mFullSessionMethodName);
+        assertTrue(mfullSessionCompleteTime >= TEST_DELAY_TIME - 10);
+        assertTrue(mfullSessionCompleteTime <= TEST_DELAY_TIME + 10);
+    }
+
+    /**
+     * Verifies that the recursive method for getting the full ID works correctly.
+     */
+    @SmallTest
+    public void testFullMethodPath() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        Session testSession = mTestSessionManager.createSubsession();
+        mTestSessionManager.mCurrentThreadId = () -> TEST_CHILD_THREAD_ID;
+        mTestSessionManager.continueSession(testSession, TEST_CHILD_NAME);
+
+        String fullId = mTestSessionManager.getSessionId();
+
+        assertTrue(fullId.contains(TEST_PARENT_NAME + Session.SUBSESSION_SEPARATION_CHAR
+                + TEST_CHILD_NAME));
+    }
+
+    /**
+     * Make sure that the cleanup timer runs correctly and the GC collects the stale sessions
+     * correctly to ensure that there are no dangling sessions.
+     */
+    @SmallTest
+    public void testStaleSessionCleanupTimer() {
+        mTestSessionManager.mCurrentThreadId = () -> TEST_PARENT_THREAD_ID;
+        mTestSessionManager.startSession(TEST_PARENT_NAME, null);
+        WeakReference<Session> sessionRef = new WeakReference<>(
+                mTestSessionManager.mSessionMapper.get(TEST_PARENT_THREAD_ID));
+        try {
+            // Make sure that the sleep time is always > delay time.
+            Thread.sleep(2 * TEST_DELAY_TIME);
+            mTestSessionManager.cleanupStaleSessions(TEST_DELAY_TIME);
+            Runtime.getRuntime().gc();
+            // Give it a second for GC to run.
+            Thread.sleep(1000);
+        } catch (InterruptedException ignored) {}
+
+        assertTrue(mTestSessionManager.mSessionMapper.isEmpty());
+        assertNull(sessionRef.get());
+    }
+}
diff --git a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
index 8de54bf..6baaf85 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
@@ -21,6 +21,7 @@
 import static android.Manifest.permission.READ_PHONE_STATE;
 import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
 
+import android.app.ActivityManager;
 import android.app.AppOpsManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -45,6 +46,7 @@
 import com.android.server.telecom.CallIntentProcessor;
 import com.android.server.telecom.CallState;
 import com.android.server.telecom.CallsManager;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.PhoneAccountRegistrar;
 import com.android.server.telecom.TelecomServiceImpl;
 import com.android.server.telecom.TelecomSystem;
@@ -53,7 +55,6 @@
 
 import org.mockito.ArgumentCaptor;
 import org.mockito.ArgumentMatcher;
-import org.mockito.Matchers;
 import org.mockito.Mock;
 import org.mockito.internal.matchers.VarargMatcher;
 
@@ -98,29 +99,6 @@
         }
     }
 
-    public static class DefaultDialerManagerAdapterFake
-            implements TelecomServiceImpl.DefaultDialerManagerAdapter {
-        @Override
-        public String getDefaultDialerApplication(Context context) {
-            return null;
-        }
-
-        @Override
-        public String getDefaultDialerApplication(Context context, int userId) {
-            return null;
-        }
-
-        @Override
-        public boolean setDefaultDialerApplication(Context context, String packageName) {
-            return false;
-        }
-
-        @Override
-        public boolean isDefaultOrSystemDialer(Context context, String packageName) {
-            return false;
-        }
-    }
-
     public static class SubscriptionManagerAdapterFake
             implements TelecomServiceImpl.SubscriptionManagerAdapter {
         @Override
@@ -157,8 +135,7 @@
     @Mock private TelecomManager mTelecomManager;
     private CallIntentProcessor.Adapter mCallIntentProcessorAdapter =
             spy(new CallIntentProcessAdapterFake());
-    private TelecomServiceImpl.DefaultDialerManagerAdapter mDefaultDialerManagerAdapter =
-            spy(new DefaultDialerManagerAdapterFake());
+    @Mock private DefaultDialerCache mDefaultDialerCache;
     private TelecomServiceImpl.SubscriptionManagerAdapter mSubscriptionManagerAdapter =
             spy(new SubscriptionManagerAdapterFake());
     @Mock private UserCallIntentProcessor mUserCallIntentProcessor;
@@ -198,7 +175,7 @@
                         return mUserCallIntentProcessor;
                     }
                 },
-                mDefaultDialerManagerAdapter,
+                mDefaultDialerCache,
                 mSubscriptionManagerAdapter,
                 mLock);
         mTSIBinder = telecomServiceImpl.getBinder();
@@ -209,13 +186,10 @@
         mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
         mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
 
-        doReturn(DEFAULT_DIALER_PACKAGE)
-                .when(mDefaultDialerManagerAdapter)
-                .getDefaultDialerApplication(any(Context.class));
-
-        doReturn(true)
-                .when(mDefaultDialerManagerAdapter)
-                .isDefaultOrSystemDialer(any(Context.class), eq(DEFAULT_DIALER_PACKAGE));
+        when(mDefaultDialerCache.getDefaultDialerApplication(anyInt()))
+                .thenReturn(DEFAULT_DIALER_PACKAGE);
+        when(mDefaultDialerCache.isDefaultOrSystemDialer(eq(DEFAULT_DIALER_PACKAGE), anyInt()))
+                .thenReturn(true);
     }
 
     @SmallTest
@@ -728,15 +702,14 @@
     @SmallTest
     public void testSetDefaultDialer() throws Exception {
         String packageName = "sample.package";
+        int currentUser = ActivityManager.getCurrentUser();
 
-        doReturn(true)
-                .when(mDefaultDialerManagerAdapter)
-                .setDefaultDialerApplication(any(Context.class), eq(packageName));
+        when(mDefaultDialerCache.setDefaultDialer(eq(packageName), eq(currentUser)))
+                .thenReturn(true);
 
         mTSIBinder.setDefaultDialer(packageName);
 
-        verify(mDefaultDialerManagerAdapter).setDefaultDialerApplication(any(Context.class),
-                eq(packageName));
+        verify(mDefaultDialerCache).setDefaultDialer(eq(packageName), eq(currentUser));
         ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
         verify(mContext).sendBroadcastAsUser(intentCaptor.capture(), any(UserHandle.class));
         Intent capturedIntent = intentCaptor.getValue();
@@ -768,8 +741,7 @@
             exceptionThrown = true;
         }
         assertTrue(exceptionThrown);
-        verify(mDefaultDialerManagerAdapter, never()).setDefaultDialerApplication(
-                any(Context.class), anyString());
+        verify(mDefaultDialerCache, never()).setDefaultDialer(anyString(), anyInt());
         verify(mContext, never()).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
     }
 
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index d1c0325..78d0fec 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -64,9 +64,10 @@
 import com.android.server.telecom.CallAudioManager;
 import com.android.server.telecom.CallAudioRouteStateMachine;
 import com.android.server.telecom.CallerInfoAsyncQueryFactory;
+import com.android.server.telecom.CallerInfoLookupHelper;
 import com.android.server.telecom.CallsManager;
 import com.android.server.telecom.CallsManagerListenerBase;
-import com.android.server.telecom.ContactsAsyncHelper;
+import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.HeadsetMediaButton;
 import com.android.server.telecom.HeadsetMediaButtonFactory;
 import com.android.server.telecom.InCallWakeLockController;
@@ -78,7 +79,6 @@
 import com.android.server.telecom.PhoneNumberUtilsAdapterImpl;
 import com.android.server.telecom.ProximitySensorManager;
 import com.android.server.telecom.ProximitySensorManagerFactory;
-import com.android.server.telecom.Runnable;
 import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.Timeouts;
 import com.android.server.telecom.callfiltering.AsyncBlockCheckFilter;
@@ -129,7 +129,7 @@
 
     public static class MissedCallNotifierFakeImpl extends CallsManagerListenerBase
             implements MissedCallNotifier {
-        List<com.android.server.telecom.Call> missedCallsNotified = new ArrayList<>();
+        List<CallInfo> missedCallsNotified = new ArrayList<>();
 
         @Override
         public void clearMissedCalls(UserHandle userHandle) {
@@ -137,16 +137,17 @@
         }
 
         @Override
-        public void showMissedCallNotification(com.android.server.telecom.Call call) {
+        public void showMissedCallNotification(CallInfo call) {
             missedCallsNotified.add(call);
         }
 
         @Override
-        public void reloadFromDatabase(TelecomSystem.SyncRoot lock, CallsManager callsManager,
-                ContactsAsyncHelper contactsAsyncHelper,
-                CallerInfoAsyncQueryFactory callerInfoAsyncQueryFactory, UserHandle userHandle) {
+        public void reloadAfterBootComplete(CallerInfoLookupHelper callerInfoLookupHelper,
+                CallInfoFactory callInfoFactory) { }
 
-        }
+        @Override
+        public void reloadFromDatabase(CallerInfoLookupHelper callerInfoLookupHelper,
+                CallInfoFactory callInfoFactory, UserHandle userHandle) { }
 
         @Override
         public void setCurrentUserHandle(UserHandle userHandle) {
@@ -186,7 +187,6 @@
             return "com.android.server.telecom";
         }
     }
-
     @Mock HeadsetMediaButton mHeadsetMediaButton;
     @Mock ProximitySensorManager mProximitySensorManager;
     @Mock InCallWakeLockController mInCallWakeLockController;
@@ -261,8 +261,7 @@
                     .setCapabilities(
                             PhoneAccount.CAPABILITY_CALL_PROVIDER |
                                     PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION |
-                                    PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS |
-                                    PhoneAccount.CAPABILITY_VIDEO_CALLING)
+                                    PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS)
                     .build();
 
     final PhoneAccount mPhoneAccountE1 =
@@ -275,8 +274,7 @@
                     .setCapabilities(
                             PhoneAccount.CAPABILITY_CALL_PROVIDER |
                                     PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION |
-                                    PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS |
-                                    PhoneAccount.CAPABILITY_VIDEO_CALLING)
+                                    PhoneAccount.CAPABILITY_PLACE_EMERGENCY_CALLS)
                     .build();
 
     ConnectionServiceFixture mConnectionServiceFixtureA;
@@ -329,6 +327,10 @@
 
     @Override
     public void tearDown() throws Exception {
+        mTelecomSystem.getCallsManager().getCallAudioManager()
+                .getCallAudioRouteStateMachine().quitNow();
+        mTelecomSystem.getCallsManager().getCallAudioManager()
+                .getCallAudioModeStateMachine().quitNow();
         mTelecomSystem = null;
         super.tearDown();
     }
@@ -382,7 +384,7 @@
                     @Override
                     public MissedCallNotifier makeMissedCallNotifierImpl(Context context,
                             PhoneAccountRegistrar phoneAccountRegistrar,
-                            PhoneNumberUtilsAdapter phoneNumberUtilsAdapter) {
+                            DefaultDialerCache defaultDialerCache) {
                         return mMissedCallNotifier;
                     }
                 },
@@ -620,6 +622,11 @@
         // called correctly in order to continue.
         verify(localAppContext).sendBroadcastAsUser(actionCallIntent, UserHandle.SYSTEM);
         mTelecomSystem.getCallIntentProcessor().processIntent(actionCallIntent);
+        // Wait for handler to start CallerInfo lookup.
+        waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
+        // Send the CallerInfo lookup reply.
+        mCallerInfoAsyncQueryFactoryFixture.mRequests.forEach(
+                CallerInfoAsyncQueryFactoryFixture.Request::reply);
 
         if (!hasInCallAdapter) {
             verify(mInCallServiceFixtureX.getTestDouble())
@@ -678,7 +685,7 @@
 
         verify(connectionServiceFixture.getTestDouble())
                 .createConnection(eq(phoneAccountHandle), anyString(), any(ConnectionRequest.class),
-                        eq(false)/*isIncoming*/, anyBoolean());
+                        eq(false)/*isIncoming*/, anyBoolean(), any());
         // Wait for handleCreateConnectionComplete
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
 
@@ -700,7 +707,7 @@
 
         verify(connectionServiceFixture.getTestDouble())
                 .createConnection(eq(phoneAccountHandle), anyString(), any(ConnectionRequest.class),
-                        eq(false)/*isIncoming*/, anyBoolean());
+                        eq(false)/*isIncoming*/, anyBoolean(), any());
         // Wait for handleCreateConnectionComplete
         waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
         // Wait for the callback in ConnectionService#onAdapterAttached to execute.
@@ -749,12 +756,13 @@
 
         verify(connectionServiceFixture.getTestDouble())
                 .createConnection(any(PhoneAccountHandle.class), anyString(),
-                        any(ConnectionRequest.class), eq(true), eq(false));
+                        any(ConnectionRequest.class), eq(true), eq(false), any());
 
-        for (CallerInfoAsyncQueryFactoryFixture.Request request :
-                mCallerInfoAsyncQueryFactoryFixture.mRequests) {
-            request.reply();
-        }
+        // Wait for the handler to start the CallerInfo lookup
+        waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
+        // Process the CallerInfo lookup reply
+        mCallerInfoAsyncQueryFactoryFixture.mRequests.forEach(
+                CallerInfoAsyncQueryFactoryFixture.Request::reply);
 
         IContentProvider blockedNumberProvider =
                 mSpyContext.getContentResolver().acquireProvider(BlockedNumberContract.AUTHORITY);
@@ -879,10 +887,10 @@
 
         if (!VideoProfile.isVideo(videoState)) {
             verify(connectionServiceFixture.getTestDouble())
-                    .answer(ids.mConnectionId);
+                    .answer(eq(ids.mConnectionId), any());
         } else {
             verify(connectionServiceFixture.getTestDouble())
-                    .answerVideo(ids.mConnectionId, videoState);
+                    .answerVideo(eq(ids.mConnectionId), eq(videoState), any());
         }
 
         connectionServiceFixture.sendSetActive(ids.mConnectionId);
diff --git a/tests/src/com/android/server/telecom/tests/TelecomTestCase.java b/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
index ed10e4b..b909a54 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
@@ -16,11 +16,10 @@
 
 package com.android.server.telecom.tests;
 
-import com.android.server.telecom.Log;
-
 import org.mockito.MockitoAnnotations;
 
 import android.os.Handler;
+import android.telecom.Log;
 import android.test.AndroidTestCase;
 
 import java.util.concurrent.CountDownLatch;
@@ -37,8 +36,7 @@
         Log.setTag(TESTING_TAG);
         mMockitoHelper.setUp(getContext(), getClass());
         mComponentContextFixture = new ComponentContextFixture();
-        Log.setContext(mComponentContextFixture.getTestDouble().getApplicationContext());
-        Log.sCleanStaleSessions = null;
+        Log.setSessionContext(mComponentContextFixture.getTestDouble().getApplicationContext());
         MockitoAnnotations.initMocks(this);
     }
 
@@ -46,7 +44,6 @@
     public void tearDown() throws Exception {
         mComponentContextFixture = null;
         mMockitoHelper.tearDown();
-        Log.setTag(com.android.server.telecom.Log.TAG);
     }
 
     protected final void waitForHandlerAction(Handler h, long timeoutMillis) {
diff --git a/tests/src/com/android/server/telecom/tests/VideoCallTests.java b/tests/src/com/android/server/telecom/tests/VideoCallTests.java
index 0319e81..4764e92 100644
--- a/tests/src/com/android/server/telecom/tests/VideoCallTests.java
+++ b/tests/src/com/android/server/telecom/tests/VideoCallTests.java
@@ -25,7 +25,6 @@
 
 import com.android.server.telecom.CallAudioModeStateMachine;
 import com.android.server.telecom.CallAudioRouteStateMachine;
-import com.android.server.telecom.Log;
 
 import java.util.List;
 
diff --git a/tests/src/com/android/server/telecom/tests/VideoProviderTest.java b/tests/src/com/android/server/telecom/tests/VideoProviderTest.java
index 993679e..cca6446 100644
--- a/tests/src/com/android/server/telecom/tests/VideoProviderTest.java
+++ b/tests/src/com/android/server/telecom/tests/VideoProviderTest.java
@@ -16,8 +16,6 @@
 
 package com.android.server.telecom.tests;
 
-import com.android.server.telecom.Log;
-
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.Mockito;
@@ -25,21 +23,13 @@
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Camera;
 import android.graphics.SurfaceTexture;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Looper;
-import android.telecom.Call;
-import android.telecom.CallAudioState;
-import android.telecom.Connection;
 import android.telecom.Connection.VideoProvider;
 import android.telecom.InCallService;
 import android.telecom.InCallService.VideoCall;
-import android.telecom.ParcelableCall;
-import android.telecom.TelecomManager;
 import android.telecom.VideoCallImpl;
 import android.telecom.VideoProfile;
 import android.telecom.VideoProfile.CameraCapabilities;
@@ -50,7 +40,6 @@
 
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.RunnableFuture;
 import java.util.concurrent.TimeUnit;
 
 import static android.test.MoreAsserts.assertEquals;