Merge "UX to switch to work profile for work sim"
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index db93b63..a755490 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -575,7 +575,7 @@
     <string name="fire_type_description" msgid="6565200468934914930">"حريق"</string>
     <string name="description_concat_format" msgid="2014471565101724088">"‏%1$s، ‏%2$s‏"</string>
     <string name="dialerKeyboardHintText" msgid="1115266533703764049">"استخدام لوحة المفاتيح للطلب"</string>
-    <string name="onscreenHoldText" msgid="4025348842151665191">"تعليق"</string>
+    <string name="onscreenHoldText" msgid="4025348842151665191">"انتظار"</string>
     <string name="onscreenEndCallText" msgid="6138725377654842757">"الانتهاء"</string>
     <string name="onscreenShowDialpadText" msgid="658465753816164079">"لوحة الاتصال"</string>
     <string name="onscreenMuteText" msgid="5470306116733843621">"كتم الصوت"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index b5e18fb..af2c4d8 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -575,7 +575,7 @@
     <string name="fire_type_description" msgid="6565200468934914930">"Bomberos"</string>
     <string name="description_concat_format" msgid="2014471565101724088">"%1$s, %2$s"</string>
     <string name="dialerKeyboardHintText" msgid="1115266533703764049">"Utilizar teclado para marcar"</string>
-    <string name="onscreenHoldText" msgid="4025348842151665191">"Retener"</string>
+    <string name="onscreenHoldText" msgid="4025348842151665191">"Pausar"</string>
     <string name="onscreenEndCallText" msgid="6138725377654842757">"Finalizar"</string>
     <string name="onscreenShowDialpadText" msgid="658465753816164079">"Teclado"</string>
     <string name="onscreenMuteText" msgid="5470306116733843621">"Silenciar"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 17ef040..f3f9884 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -47,7 +47,7 @@
     <string name="no_vm_number" msgid="6623853880546176930">"Үн почтасынын номери жок болуп жатат"</string>
     <string name="no_vm_number_msg" msgid="5165161462411372504">"SIM-картада сакталган үн почтасынын номери жок."</string>
     <string name="add_vm_number_str" msgid="7368168964435881637">"Номер кошуу"</string>
-    <string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"Үн почта жөндөөлөрүн алгачкы колдонуучу гана өзгөртө алат."</string>
+    <string name="voice_number_setting_primary_user_only" msgid="3394706575741912843">"Үн почта параметрлерин алгачкы колдонуучу гана өзгөртө алат."</string>
     <string name="puk_unlocked" msgid="4627340655215746511">"SIM картаңыз бөгөттөн чыгарылган. Телефонуңуздун кулпусу ачылууда…"</string>
     <string name="label_ndp" msgid="7617392683877410341">"SIM-карта тармагынын кулпусун ачуучу PIN код"</string>
     <string name="label_phoneid" msgid="8775611434123577808">"SIM-карта оператор үчүн кулпуланган"</string>
@@ -56,13 +56,13 @@
     <string name="requesting_unlock" msgid="930512210309437741">"Тармак кулпусун ачуу суралууда…"</string>
     <string name="unlock_failed" msgid="7103543844840661366">"Тармактын кулпусун ачуу өтүнүчү ишке ашкан жок."</string>
     <string name="unlock_success" msgid="32681089371067565">"Тармактын кулпусу ийгиликтүү ачылды."</string>
-    <string name="mobile_network_settings_not_available" msgid="8678168497517090039">"Бул колдонуучу мобилдик тармак жөндөөлөрүн колдоно албайт"</string>
-    <string name="labelGSMMore" msgid="7354182269461281543">"GSM чалуунун жөндөөлөрү"</string>
-    <string name="labelGsmMore_with_label" msgid="3206015314393246224">"GSM чалуунун жөндөөлөрү (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
-    <string name="labelCDMAMore" msgid="7937441382611224632">"CDMA чалуунун жөндөөлөрү"</string>
-    <string name="labelCdmaMore_with_label" msgid="7759692829160238152">"CDMA чалуунун жөндөөлөрү (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+    <string name="mobile_network_settings_not_available" msgid="8678168497517090039">"Бул колдонуучу мобилдик тармак параметрлерин колдоно албайт"</string>
+    <string name="labelGSMMore" msgid="7354182269461281543">"GSM чалуунун параметрлери"</string>
+    <string name="labelGsmMore_with_label" msgid="3206015314393246224">"GSM чалуунун параметрлери (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
+    <string name="labelCDMAMore" msgid="7937441382611224632">"CDMA чалуунун параметрлери"</string>
+    <string name="labelCdmaMore_with_label" msgid="7759692829160238152">"CDMA чалуунун параметрлери (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="apn_settings" msgid="1978652203074756623">"Туташуу түйүндөрү (APN)"</string>
-    <string name="settings_label" msgid="9101778088412567956">"Тармак жөндөөлөрү"</string>
+    <string name="settings_label" msgid="9101778088412567956">"Тармак параметрлери"</string>
     <string name="phone_accounts" msgid="1216879437523774604">"Чалуу аккаунттары"</string>
     <string name="phone_accounts_make_calls_with" msgid="16747814788918145">"Чалууларды төмөнкү менен жасоо"</string>
     <string name="phone_accounts_make_sip_calls_with" msgid="4691221006731847255">"SIP чалууларын төмөнкү менен жасоо"</string>
@@ -72,7 +72,7 @@
     <string name="phone_accounts_choose_accounts" msgid="4748805293314824974">"Аккаунттарды тандоо"</string>
     <string name="phone_accounts_selection_header" msgid="2945830843104108440">"Телефон каттоо эсептери"</string>
     <string name="phone_accounts_add_sip_account" msgid="1437634802033309305">"SIP аккаунтун кошуу"</string>
-    <string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Каттоо эсеп жөндөөлөрүн конфигурациялоо"</string>
+    <string name="phone_accounts_configure_account_settings" msgid="6622119715253196586">"Каттоо эсеп параметрлерин конфигурациялоо"</string>
     <string name="phone_accounts_all_calling_accounts" msgid="1609600743500618823">"Бардык чалуу каттоо эсептери"</string>
     <string name="phone_accounts_all_calling_accounts_summary" msgid="2214134955430107240">"Чалуулар жасала турган каттоо эсептерин тандаңыз"</string>
     <string name="wifi_calling" msgid="3650509202851355742">"Wi-Fi чалуу"</string>
@@ -85,18 +85,18 @@
     <string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"Бир номер жеткиликсиз болсо, чалууларды ар дайым башка номериңизге багыттоо"</string>
     <string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"Билдирмелер"</string>
     <string name="cell_broadcast_settings" msgid="8135324242541809924">"Өзгөчө кырдаал тууралуу кулактандыруу"</string>
-    <string name="call_settings" msgid="3677282690157603818">"Чалуу жөндөөлөрү"</string>
+    <string name="call_settings" msgid="3677282690157603818">"Чалуу параметрлери"</string>
     <string name="additional_gsm_call_settings" msgid="1561980168685658846">"Кошумча жөндөөлөр"</string>
     <string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Кошумча жөндөөлөр (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
-    <string name="sum_gsm_call_settings" msgid="7964692601608878138">"GSM менен гана чалуунун кошумча жөндөөлөрү"</string>
-    <string name="additional_cdma_call_settings" msgid="2178016561980611304">"Кошумча CDMA чалуунун жөндөөлөрү"</string>
-    <string name="sum_cdma_call_settings" msgid="3185825305136993636">"CDMA менен гана чалуунун кошумча жөндөөлөрү"</string>
-    <string name="labelNwService" msgid="6015891883487125120">"Тармак кызматынын жөндөөлөрү"</string>
+    <string name="sum_gsm_call_settings" msgid="7964692601608878138">"GSM менен гана чалуунун кошумча параметрлери"</string>
+    <string name="additional_cdma_call_settings" msgid="2178016561980611304">"Кошумча CDMA чалуунун параметрлери"</string>
+    <string name="sum_cdma_call_settings" msgid="3185825305136993636">"CDMA менен гана чалуунун кошумча параметрлери"</string>
+    <string name="labelNwService" msgid="6015891883487125120">"Тармак кызматынын параметрлери"</string>
     <string name="labelCallerId" msgid="2090540744550903172">"Чалуучуну аныктоо"</string>
     <string name="sum_loading_settings" msgid="434063780286688775">"Параметрлер жүктөлүүдө…"</string>
     <string name="sum_hide_caller_id" msgid="131100328602371933">"Чыгуучу чалууларда номер жашырылган"</string>
     <string name="sum_show_caller_id" msgid="3571854755324664591">"Чыгуучу чалууларда көрсөтүлчү номер"</string>
-    <string name="sum_default_caller_id" msgid="1767070797135682959">"Кимдир-бирөөгө чалып жатканда ага номерим көрүнүшү үчүн байланыш операторунун стандарттуу жөндөөлөрү колдонулат."</string>
+    <string name="sum_default_caller_id" msgid="1767070797135682959">"Кимдир-бирөөгө чалып жатканда ага номерим көрүнүшү үчүн байланыш операторунун стандарттуу параметрлери колдонулат."</string>
     <string name="labelCW" msgid="8449327023861428622">"Чалууну кармап туруу"</string>
     <string name="sum_cw_enabled" msgid="3977308526187139996">"Бирөө менен сүйлөшүп жатканда сизге келген чалуулар жөнүндө эскертилет"</string>
     <string name="sum_cw_disabled" msgid="3658094589461768637">"Бирөө менен сүйлөшүп жатканда сизге келген чалуулар жөнүндө эскертилет"</string>
@@ -131,8 +131,8 @@
     <string name="disable_cdma_cw" msgid="7119290446496301734">"Баш тартуу"</string>
     <string name="cdma_call_waiting_in_ims_on" msgid="6390979414188659218">"IMS платформасында CDMA чалуу күтүүcү күйгүзүлгөн"</string>
     <string name="cdma_call_waiting_in_ims_off" msgid="1099246114368636334">"IMS платформасында CDMA чалуу күтүүcү өчүрүлгөн"</string>
-    <string name="updating_title" msgid="6130548922615719689">"Чалуу жөндөөлөрү"</string>
-    <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Чалуу жөндөөлөрүн администратор гана өзгөртө алат."</string>
+    <string name="updating_title" msgid="6130548922615719689">"Чалуу параметрлери"</string>
+    <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Чалуу параметрлерин администратор гана өзгөртө алат."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Параметрлер (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Чалуу жөндөөлөрүндө ката кетти"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Параметрлер окулууда…"</string>
@@ -328,7 +328,7 @@
     <string name="enable_disable_cell_bc_sms" msgid="4759958924031721350">"Уюлдук жөнөтүү SMS\'и"</string>
     <string name="cell_bc_sms_enable" msgid="2019708772024632073">"Уюлдук жөнөтүү SMS\'и иштетилген"</string>
     <string name="cell_bc_sms_disable" msgid="1214238639910875347">"Уюлдук жөнөтүү SMS\'и өчүрүлгөн"</string>
-    <string name="cb_sms_settings" msgid="6858093721831312036">"Уюлдук жөнөтүүлөрдүн SMS жөндөөлөрү"</string>
+    <string name="cb_sms_settings" msgid="6858093721831312036">"Уюлдук жөнөтүүлөрдүн SMS параметрлери"</string>
     <string name="enable_disable_emergency_broadcast" msgid="6325655044472196496">"Өзгөчө кырдаалдагы жөнөтүүлөр"</string>
     <string name="emergency_broadcast_enable" msgid="5759610647771102442">"Өзгөчө кырдаалдагы жөнөтүүлөр иштетилген"</string>
     <string name="emergency_broadcast_disable" msgid="2844904734469323266">"Өзгөчө кырдаалдагы жөнөтүүлөр өчүрүлгөн"</string>
@@ -650,7 +650,7 @@
     <string name="voicemail_provider" msgid="4158806657253745294">"Кызмат"</string>
     <string name="voicemail_settings" msgid="4451045613238972776">"Жөндөө"</string>
     <string name="voicemail_number_not_set" msgid="8831561283386938155">"&lt;Коюлган эмес&gt;"</string>
-    <string name="other_settings" msgid="8895088007393598447">"Башка чалуу жөндөөлөрү"</string>
+    <string name="other_settings" msgid="8895088007393598447">"Башка чалуу параметрлери"</string>
     <string name="calling_via_template" msgid="1791323450703751750">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> аркылуу чалуу"</string>
     <string name="contactPhoto" msgid="7885089213135154834">"байланыштын сүрөтү"</string>
     <string name="goPrivate" msgid="4645108311382209551">"купуя режимине өтүү"</string>
@@ -665,8 +665,8 @@
     <string name="preference_category_ringtone" msgid="8787281191375434976">"Рингтон жана Титирөө"</string>
     <string name="pstn_connection_service_label" msgid="9200102709997537069">"Кыналган SIM карталар"</string>
     <string name="enable_video_calling_title" msgid="7246600931634161830">"Видео чалууну күйгүзүү"</string>
-    <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"Видео чалууну күйгүзүү үчүн тармак жөндөөлөрүнөн Жакшыртылган 4G LTE режимин иштетишиңиз керек."</string>
-    <string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"Тармак жөндөөлөрү"</string>
+    <string name="enable_video_calling_dialog_msg" msgid="7141478720386203540">"Видео чалууну күйгүзүү үчүн тармак параметрлеринен Жакшыртылган 4G LTE режимин иштетишиңиз керек."</string>
+    <string name="enable_video_calling_dialog_settings" msgid="8697890611305307110">"Тармак параметрлери"</string>
     <string name="enable_video_calling_dialog_close" msgid="4298929725917045270">"Жабуу"</string>
     <string name="sim_label_emergency_calls" msgid="9078241989421522310">"Шашылыш чалуулар"</string>
     <string name="sim_description_emergency_calls" msgid="5146872803938897296">"Шашылыш чалуу гана"</string>
@@ -781,7 +781,7 @@
     <string name="call_barring_baicr_enabled" msgid="64774270234828175">"Роумингдеги эл аралык кирүүчү чалууларды бөгөттөө функциясы өчүрүлсүнбү?"</string>
     <string name="call_barring_baicr_disabled" msgid="3488129262744027262">"Роумингдеги эл аралык кирүүчү чалуу бөгөттөлсүнбү?"</string>
     <string name="call_barring_deactivate_all" msgid="7837931580047157328">"Баары өчүрүлсүн"</string>
-    <string name="call_barring_deactivate_all_description" msgid="4474119585042121604">"Чалууларга тыюу салуу функциясынын жөндөөлөрүн өчүрүү"</string>
+    <string name="call_barring_deactivate_all_description" msgid="4474119585042121604">"Чалууларга тыюу салуу функциясынын параметрлерин өчүрүү"</string>
     <string name="call_barring_deactivate_success" msgid="3545644320298275337">"Чалууларга тыюу салуу функциясы өчүрүлдү"</string>
     <string name="call_barring_change_pwd" msgid="1730691950940338387">"Сызсөздү өзгөртүү"</string>
     <string name="call_barring_change_pwd_description" msgid="1274245130382054227">"Чалууларга тыюу салуу функциясынын сырсөзүн өзгөртүү"</string>
@@ -793,7 +793,7 @@
     <string name="call_barring_new_pwd" msgid="2515524903813227732">"Жаңы сырсөз"</string>
     <string name="call_barring_confirm_pwd" msgid="7552526161616461858">"Сырсөздү ырастоо"</string>
     <string name="messageCallBarring" msgid="5537730400652466912">"Сырсөздү киргизиңиз"</string>
-    <string name="call_barring_settings" msgid="4616607285790258919">"Чалууларга тыюу салуу функциясынын жөндөөлөрү"</string>
+    <string name="call_barring_settings" msgid="4616607285790258919">"Чалууларга тыюу салуу функциясынын параметрлери"</string>
     <string name="callFailed_NetworkBusy" msgid="5437103975842913681">"Тармак бош эмес. Кийинчерээк кайра чалыңыз."</string>
     <string name="callFailed_NetworkCongested" msgid="6801283142342775380">"Тармак ашыкча жүктөлгөн. Жардам алуу үчүн мобилдик операторуңуз менен байланышыңыз."</string>
     <string name="supp_service_notification_call_deflected" msgid="4980942818105909813">"Чалуу кабыл алынган жок."</string>
@@ -818,10 +818,10 @@
     <string name="callFailed_already_ringing" msgid="2376603543544289303">"Чалуу аткарылбайт, анткени кирүүчү чалууга жооп берилген жок. Жаңы чалуу аткаруудан мурун кирүүчү чалууга жооп берип же четке кагыңыз."</string>
     <string name="callFailed_calling_disabled" msgid="5010992739401206283">"Чалуу аткарылбайт, анткени чалуу ro.telephony.disable-call тутуму аркылуу өчүрүлгөн."</string>
     <string name="callFailed_too_many_calls" msgid="2761754044990799580">"Чалуу аткарылбайт, анткени эки чалуу аткарылууда. Бир чалууну өчүрүңүз же аларды конференцияга бириктириңиз."</string>
-    <string name="supp_service_over_ut_precautions" msgid="2145018231396701311">"<xliff:g id="SUPP_SERVICE">%s</xliff:g> колдонуу үчүн мобилдик Интернет күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак жөндөөлөрүнөн өзгөртсөңүз болот."</string>
-    <string name="supp_service_over_ut_precautions_roaming" msgid="670342104569972327">"<xliff:g id="SUPP_SERVICE">%s</xliff:g> колдонуу үчүн мобилдик Интернет жана Интернет-роуминг күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак жөндөөлөрүнөн өзгөртсөңүз болот."</string>
-    <string name="supp_service_over_ut_precautions_dual_sim" msgid="5166866975550910474">"<xliff:g id="SUPP_SERVICE">%1$s</xliff:g> колдонуу үчүн <xliff:g id="SIM_NUMBER">%2$d</xliff:g> SIM-картасында мобилдик Интернет күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак жөндөөлөрүнөн өзгөртсөңүз болот."</string>
-    <string name="supp_service_over_ut_precautions_roaming_dual_sim" msgid="6627654855191817965">"<xliff:g id="SUPP_SERVICE">%1$s</xliff:g> колдонуу үчүн <xliff:g id="SIM_NUMBER">%2$d</xliff:g> SIM-картасында мобилдик Интернет жана Интернет-роуминг күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак жөндөөлөрүнөн өзгөртсөңүз болот."</string>
+    <string name="supp_service_over_ut_precautions" msgid="2145018231396701311">"<xliff:g id="SUPP_SERVICE">%s</xliff:g> колдонуу үчүн мобилдик Интернет күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак параметрлеринен өзгөртсөңүз болот."</string>
+    <string name="supp_service_over_ut_precautions_roaming" msgid="670342104569972327">"<xliff:g id="SUPP_SERVICE">%s</xliff:g> колдонуу үчүн мобилдик Интернет жана Интернет-роуминг күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак параметрлеринен өзгөртсөңүз болот."</string>
+    <string name="supp_service_over_ut_precautions_dual_sim" msgid="5166866975550910474">"<xliff:g id="SUPP_SERVICE">%1$s</xliff:g> колдонуу үчүн <xliff:g id="SIM_NUMBER">%2$d</xliff:g> SIM-картасында мобилдик Интернет күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак параметрлеринен өзгөртсөңүз болот."</string>
+    <string name="supp_service_over_ut_precautions_roaming_dual_sim" msgid="6627654855191817965">"<xliff:g id="SUPP_SERVICE">%1$s</xliff:g> колдонуу үчүн <xliff:g id="SIM_NUMBER">%2$d</xliff:g> SIM-картасында мобилдик Интернет жана Интернет-роуминг күйгүзүлгөнүн текшериңиз. Муну мобилдик тармак параметрлеринен өзгөртсөңүз болот."</string>
     <string name="supp_service_over_ut_precautions_dialog_dismiss" msgid="5934541487903081652">"Жабуу"</string>
     <string name="radio_info_data_connection_enable" msgid="6183729739783252840">"Мобилдик туташууну иштетүү"</string>
     <string name="radio_info_data_connection_disable" msgid="6404751291511368706">"Мобилдик туташууну өчүрүү"</string>
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 27e1606..d2c0e6b 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -1071,7 +1071,8 @@
         mSelectedNetworkOperatorName.remove(subId);
     }
 
-    private static long getTimeStamp() {
+    @VisibleForTesting
+    public long getTimeStamp() {
         return SystemClock.elapsedRealtime();
     }
 }
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 23abadb..b7dfb77 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -400,7 +400,6 @@
     private SharedPreferences mTelephonySharedPreferences;
     private PhoneConfigurationManager mPhoneConfigurationManager;
     private final RadioInterfaceCapabilityController mRadioInterfaceCapabilities;
-    private final Telephony2gUpdater mTelephony2gUpdater;
 
     /** User Activity */
     private AtomicBoolean mNotifyUserActivity;
@@ -2458,8 +2457,6 @@
         mRadioInterfaceCapabilities = RadioInterfaceCapabilityController.getInstance();
         mNotifyUserActivity = new AtomicBoolean(false);
         PropertyInvalidatedCache.invalidateCache(TelephonyManager.CACHE_KEY_PHONE_ACCOUNT_TO_SUBID);
-        mTelephony2gUpdater = new Telephony2gUpdater(mApp);
-        mTelephony2gUpdater.init();
         publish();
         CarrierAllowListInfo.loadInstance(mApp);
     }
diff --git a/src/com/android/phone/Telephony2gUpdater.java b/src/com/android/phone/Telephony2gUpdater.java
deleted file mode 100644
index baaa684..0000000
--- a/src/com/android/phone/Telephony2gUpdater.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2022 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.phone;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.UserManager;
-import android.telephony.RadioAccessFamily;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.RILConstants;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-
-/**
- * A {@link BroadcastReceiver} that ensures that user restrictions are correctly applied to
- * telephony.
- * This includes handling broadcasts from user restriction state changes, as well as ensuring that
- * SIM-specific settings are correctly applied when new subscriptions become active.
- *
- * <p>
- * Callers are expected to call {@code init()} and keep an instance of this class alive.
- * </p>
- */
-public class Telephony2gUpdater extends BroadcastReceiver {
-    private static final String TAG = "Telephony2gUpdater";
-
-    // We can't interact with the HAL on the main thread of the phone process (where
-    // receivers are run by default), so we execute our logic from a separate thread.
-    // The correctness of this implementation relies heavily on this executor ensuring
-    // tasks are serially executed i.e. ExecutorService.newSingleThreadExecutor()
-    private final Executor mExecutor;
-    private final Context mContext;
-    private final long mBaseAllowedNetworks;
-
-    private UserManager mUserManager;
-    private TelephonyManager mTelephonyManager;
-    private SubscriptionManager mSubscriptionManager;
-
-    // The current subscription ids
-    // Ensure this value is never accessed concurrently
-    private Set<Integer> mCurrentSubscriptions;
-    // We keep track of the last value to avoid updating when unrelated user restrictions change
-    // Ensure this value is never accessed concurrently
-    private boolean mDisallowCellular2gRestriction;
-
-    public Telephony2gUpdater(Context context) {
-        this(Executors.newSingleThreadExecutor(), context,
-                RadioAccessFamily.getRafFromNetworkType(RILConstants.PREFERRED_NETWORK_MODE));
-    }
-
-    @VisibleForTesting
-    public Telephony2gUpdater(Executor executor, Context context, long baseAllowedNetworks) {
-        mExecutor = executor;
-        mContext = context;
-        mBaseAllowedNetworks = baseAllowedNetworks;
-
-        mUserManager = mContext.getSystemService(UserManager.class);
-        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
-        mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
-
-        // All user restrictions are false by default
-        mDisallowCellular2gRestriction = false;
-        mCurrentSubscriptions = new HashSet<>();
-    }
-
-    /**
-     * Register the given instance as a {@link BroadcastReceiver} and a {@link
-     * SubscriptionManager.OnSubscriptionsChangedListener}.
-     */
-    public void init() {
-        mContext.getSystemService(SubscriptionManager.class).addOnSubscriptionsChangedListener(
-                mExecutor, new SubscriptionListener());
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
-        mContext.registerReceiver(this, filter);
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        if (context == null || intent == null) return;
-        Log.i(TAG, "Received callback for action " + intent.getAction());
-        final PendingResult result = goAsync();
-        mExecutor.execute(() -> {
-            boolean disallow2g = mUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G);
-            if (mDisallowCellular2gRestriction == disallow2g) {
-                Log.i(TAG, "No update to DISALLOW_CELLULAR_2G restriction.");
-                return;
-            }
-
-            mDisallowCellular2gRestriction = disallow2g;
-
-            Log.i(TAG, "Running handler for all subscriptions based on DISALLOW_CELLULAR_2G change."
-                    + " Restriction value: " + mDisallowCellular2gRestriction);
-            handleUserRestrictionsChanged(mCurrentSubscriptions);
-            if (result != null) {
-                result.finish();
-            }
-        });
-    }
-
-    /**
-     * Update subscriptions with allowed network types depending on the current state
-     * of the {@link UserManager#DISALLOW_CELLULAR_2G}.
-     *
-     * @param subIds A list of subIds to update.
-     */
-    private void handleUserRestrictionsChanged(Collection<Integer> subIds) {
-        final long twoGBitmask = TelephonyManager.NETWORK_CLASS_BITMASK_2G;
-
-        long allowedNetworkTypes = mBaseAllowedNetworks;
-
-        // 2G device admin controls are global
-        for (Integer subId : subIds) {
-            TelephonyManager telephonyManager = mTelephonyManager.createForSubscriptionId(subId);
-            if (mDisallowCellular2gRestriction) {
-                Log.i(TAG, "Disabling 2g based on user restriction for subId: " + subId);
-                allowedNetworkTypes &= ~twoGBitmask;
-            } else {
-                Log.i(TAG, "Enabling 2g based on user restriction for subId: " + subId);
-                allowedNetworkTypes |= twoGBitmask;
-            }
-            telephonyManager.setAllowedNetworkTypesForReason(
-                    TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS,
-                    allowedNetworkTypes);
-        }
-    }
-
-    private class SubscriptionListener extends SubscriptionManager.OnSubscriptionsChangedListener {
-        @Override
-        public void onSubscriptionsChanged() {
-            // Note that this entire callback gets invoked in the single threaded executor
-            List<SubscriptionInfo> allSubscriptions =
-                    mSubscriptionManager.getCompleteActiveSubscriptionInfoList();
-
-            HashSet<Integer> updatedSubIds = new HashSet<>(allSubscriptions.size());
-            List<Integer> newSubIds = new ArrayList<>();
-
-            for (SubscriptionInfo info : allSubscriptions) {
-                updatedSubIds.add(info.getSubscriptionId());
-                if (!mCurrentSubscriptions.contains(info.getSubscriptionId())) {
-                    newSubIds.add(info.getSubscriptionId());
-                }
-            }
-
-            mCurrentSubscriptions = updatedSubIds;
-
-            if (newSubIds.isEmpty()) {
-                Log.d(TAG, "No new subIds. Skipping update.");
-                return;
-            }
-
-            Log.i(TAG, "New subscriptions found. Running handler to update 2g restrictions with "
-                    + "subIds " + newSubIds.toString());
-            handleUserRestrictionsChanged(newSubIds);
-        }
-    }
-
-}
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 4a89bd6..09b9b6d 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -955,7 +955,8 @@
                 handle == null ? null : handle.getSchemeSpecificPart());
 
         if (mDomainSelectionResolver.isDomainSelectionSupported()) {
-            if (isEmergencyNumber) {
+            // Normal routing emergency number shall be handled by normal call domain selctor.
+            if (isEmergencyNumber && !isNormalRouting(phone, number)) {
                 final Connection resultConnection =
                         placeEmergencyConnection(phone,
                                 request, numberToDial, isTestEmergencyNumber,
@@ -1965,6 +1966,16 @@
                             }
                         }
                     }
+                    if (mDomainSelectionResolver.isDomainSelectionSupported()) {
+                        if (isNormalRouting(phone, number)
+                                    && handleOutgoingCallConnection(number, connection,
+                                            phone, videoState)) {
+                            /** Normal routing emergency number shall be handled
+                             * by normal call domain selctor.*/
+                            Log.i(this, "placeOutgoingConnection normal routing number");
+                            return;
+                        }
+                    }
                 } else if (handleOutgoingCallConnection(number, connection,
                         phone, videoState)) {
                     return;
@@ -2040,6 +2051,8 @@
                                         .setVideoState(videoState)
                                         .setIntentExtras(extras)
                                         .setRttTextStream(mNormalCallConnection.getRttTextStream())
+                                        .setIsWpsCall(NormalCallDomainSelectionConnection
+                                                .isWpsCall(number))
                                         .build(),
                                 mNormalCallConnection::registerForCallEvents);
 
@@ -2093,12 +2106,14 @@
         // If the number is both an MMI code and a supplementary service code,
         // it shall be treated as UT. In this case, domain selection is not performed.
         if (isMmiCode && isSuppServiceCode) {
+            Log.v(LOG_TAG, "UT code not handled by call domain selection.");
             return false;
         }
 
         // Check and select same domain as ongoing call on the same subscription (if exists)
         int activeCallDomain = getActiveCallDomain(phone.getSubId());
-        if (activeCallDomain != NetworkRegistrationInfo.DOMAIN_UNKNOWN) {
+        if (activeCallDomain != NetworkRegistrationInfo.DOMAIN_UNKNOWN
+                && !NormalCallDomainSelectionConnection.isWpsCall(number)) {
             Log.d(LOG_TAG, "Selecting same domain as ongoing call on same subId");
             mNormalCallConnection = connection;
             handleOutgoingCallConnectionByCallDomainSelection(
@@ -2115,6 +2130,7 @@
         SelectionAttributes selectionAttributes =
                 new SelectionAttributes.Builder(phone.getPhoneId(), phone.getSubId(),
                         SELECTOR_TYPE_CALLING)
+                        .setNumber(number)
                         .setEmergency(false)
                         .setVideoCall(VideoProfile.isVideo(videoState))
                         .build();
@@ -2282,7 +2298,7 @@
 
         if (reasonInfo != null
                 && reasonInfo.getCode() == ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL) {
-            onEmergencyRedial(c, c.getPhone());
+            onEmergencyRedial(c, c.getPhone().getDefaultPhone());
             return true;
         }
 
@@ -2317,7 +2333,7 @@
             if (future != null) {
                 future.thenAcceptAsync((result) -> {
                     Log.d(this, "reselectDomain-complete");
-                    onEmergencyRedialOnDomain(c, c.getPhone(), result);
+                    onEmergencyRedialOnDomain(c, c.getPhone().getDefaultPhone(), result);
                 }, mDomainSelectionMainExecutor);
                 return true;
             }
@@ -2331,6 +2347,17 @@
         return false;
     }
 
+    private boolean isNormalRouting(Phone phone, String number) {
+        if (phone.getEmergencyNumberTracker() != null) {
+            EmergencyNumber num = phone.getEmergencyNumberTracker().getEmergencyNumber(number);
+            if (num != null) {
+                return num.getEmergencyCallRouting()
+                        == EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL;
+            }
+        }
+        return false;
+    }
+
     private boolean maybeReselectDomainForNormalCall(
             final TelephonyConnection c, int callFailCause, ImsReasonInfo reasonInfo) {
 
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 8100e63..fa11a5d 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -747,7 +747,7 @@
 
         if ((regResult.getAccessNetwork() == EUTRAN)
                 && ((regResult.getDomain() & NetworkRegistrationInfo.DOMAIN_CS) > 0)) {
-            return UTRAN;
+            if (ratList.contains(UTRAN)) return UTRAN;
         }
 
         return UNKNOWN;
diff --git a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
index 146874c..3da0044 100644
--- a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
@@ -21,7 +21,10 @@
 import android.annotation.NonNull;
 import android.content.Context;
 import android.os.Looper;
+import android.os.PersistableBundle;
+import android.telecom.TelecomManager;
 import android.telephony.Annotation.DisconnectCauses;
+import android.telephony.CarrierConfigManager;
 import android.telephony.DisconnectCause;
 import android.telephony.DomainSelectionService.SelectionAttributes;
 import android.telephony.NetworkRegistrationInfo;
@@ -30,6 +33,8 @@
 import android.telephony.TransportSelectorCallback;
 import android.telephony.ims.ImsReasonInfo;
 
+import com.android.internal.telephony.domainselection.NormalCallDomainSelectionConnection;
+
 /**
  * Implements domain selector for outgoing non-emergency calls.
  */
@@ -131,14 +136,16 @@
 
     @Override
     public void onImsRegistrationStateChanged() {
-        logd("onImsRegistrationStateChanged");
+        logd("onImsRegistrationStateChanged. IsImsRegistered: "
+                + mImsStateTracker.isImsRegistered());
         mImsRegStateReceived = true;
         selectDomain();
     }
 
     @Override
     public void onImsMmTelCapabilitiesChanged() {
-        logd("onImsMmTelCapabilitiesChanged");
+        logd("onImsMmTelCapabilitiesChanged. ImsVoiceCap: " + mImsStateTracker.isImsVoiceCapable()
+                + " ImsVideoCap: " + mImsStateTracker.isImsVideoCapable());
         mMmTelCapabilitiesReceived = true;
         selectDomain();
     }
@@ -221,6 +228,54 @@
                 || mServiceState.getState() == ServiceState.STATE_EMERGENCY_ONLY);
     }
 
+    private boolean isWpsCallSupportedByIms() {
+        CarrierConfigManager configManager = mContext.getSystemService(CarrierConfigManager.class);
+
+        PersistableBundle config = null;
+        if (configManager != null) {
+            config = configManager.getConfigForSubId(mSelectionAttributes.getSubId());
+        }
+
+        return (config != null)
+                ? config.getBoolean(CarrierConfigManager.KEY_SUPPORT_WPS_OVER_IMS_BOOL) : false;
+    }
+
+    private void handleWpsCall() {
+        if (isWpsCallSupportedByIms()) {
+            logd("WPS call placed over PS");
+            notifyPsSelected();
+        } else {
+            if (isOutOfService()) {
+                loge("Cannot place call in current ServiceState: " + mServiceState.getState());
+                notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
+            } else {
+                logd("WPS call placed over CS");
+                notifyCsSelected();
+            }
+        }
+    }
+
+    private boolean isTtySupportedByIms() {
+        CarrierConfigManager configManager = mContext.getSystemService(CarrierConfigManager.class);
+
+        PersistableBundle config = null;
+        if (configManager != null) {
+            config = configManager.getConfigForSubId(mSelectionAttributes.getSubId());
+        }
+
+        return (config != null)
+                && config.getBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL);
+    }
+
+    private boolean isTtyModeEnabled() {
+        TelecomManager tm = mContext.getSystemService(TelecomManager.class);
+        if (tm == null) {
+            loge("isTtyModeEnabled: telecom not available");
+            return false;
+        }
+        return tm.getCurrentTtyMode() != TelecomManager.TTY_MODE_OFF;
+    }
+
     private synchronized void selectDomain() {
         if (mStopDomainSelection || mSelectionAttributes == null
                 || mTransportSelectorCallback == null) {
@@ -265,49 +320,71 @@
             return;
         }
 
-        if (mImsStateTracker.isMmTelFeatureAvailable()) {
-
-            if (!mImsRegStateReceived || !mMmTelCapabilitiesReceived) {
-                loge("Waiting for ImsState and MmTelCapabilities callbacks");
-                return;
+        if (!mImsStateTracker.isMmTelFeatureAvailable()) {
+            logd("MmTelFeatureAvailable unavailable");
+            if (isOutOfService()) {
+                loge("Cannot place call in current ServiceState: " + mServiceState.getState());
+                notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
+            } else {
+                notifyCsSelected();
             }
+            return;
+        }
 
-            if (!mImsStateTracker.isImsRegistered()) {
-                logd("IMS is NOT registered");
-                if (isOutOfService()) {
-                    loge("Cannot place call in current ServiceState: " + mServiceState.getState());
-                    notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
-                } else {
-                    notifyCsSelected();
-                }
-                return;
+        if (!mImsRegStateReceived || !mMmTelCapabilitiesReceived) {
+            loge("Waiting for ImsState and MmTelCapabilities callbacks");
+            return;
+        }
+
+        // Check IMS registration state.
+        if (!mImsStateTracker.isImsRegistered()) {
+            logd("IMS is NOT registered");
+            if (isOutOfService()) {
+                loge("Cannot place call in current ServiceState: " + mServiceState.getState());
+                notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
+            } else {
+                notifyCsSelected();
             }
+            return;
+        }
 
-            if (mSelectionAttributes.isVideoCall()) {
-                logd("It's a video call");
-                if (mImsStateTracker.isImsVideoCapable()) {
-                    logd("IMS is video capable");
-                    notifyPsSelected();
-                } else {
-                    logd("IMS is not video capable. Ending the call");
-                    notifySelectionTerminated(DisconnectCause.OUTGOING_FAILURE);
-                }
-            } else if (mImsStateTracker.isImsVoiceCapable()) {
-                logd("IMS is voice capable");
-                // Voice call over PS
+        // Check TTY
+        if (isTtyModeEnabled() && !isTtySupportedByIms()) {
+            if (isOutOfService()) {
+                loge("Cannot place call in current ServiceState: " + mServiceState.getState());
+                notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
+            } else {
+                notifyCsSelected();
+            }
+            return;
+        }
+
+        // Handle video call.
+        if (mSelectionAttributes.isVideoCall()) {
+            logd("It's a video call");
+            if (mImsStateTracker.isImsVideoCapable()) {
+                logd("IMS is video capable");
                 notifyPsSelected();
             } else {
-                logd("IMS is not voice capable");
-                // Voice call CS fallback
-                if (isOutOfService()) {
-                    loge("Cannot place call in current ServiceState: " + mServiceState.getState());
-                    notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
-                } else {
-                    notifyCsSelected();
-                }
+                logd("IMS is not video capable. Ending the call");
+                notifySelectionTerminated(DisconnectCause.OUTGOING_FAILURE);
+            }
+            return;
+        }
+
+        // Handle voice call.
+        if (mImsStateTracker.isImsVoiceCapable()) {
+            logd("IMS is voice capable");
+            // TODO(b/266175810) Remove this dependency.
+            if (NormalCallDomainSelectionConnection
+                    .isWpsCall(mSelectionAttributes.getNumber())) {
+                handleWpsCall();
+            } else {
+                notifyPsSelected();
             }
         } else {
-            logd("IMS is not registered or unavailable");
+            logd("IMS is not voice capable");
+            // Voice call CS fallback
             if (isOutOfService()) {
                 loge("Cannot place call in current ServiceState: " + mServiceState.getState());
                 notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
diff --git a/tests/src/com/android/phone/NotificationMgrTest.java b/tests/src/com/android/phone/NotificationMgrTest.java
index 3e8cf28..e009446 100644
--- a/tests/src/com/android/phone/NotificationMgrTest.java
+++ b/tests/src/com/android/phone/NotificationMgrTest.java
@@ -44,8 +44,10 @@
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -58,6 +60,7 @@
 import android.content.res.Resources;
 import android.os.Build;
 import android.os.PersistableBundle;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.telecom.TelecomManager;
@@ -89,6 +92,7 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.Collections;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Unit Test for NotificationMgr
@@ -128,6 +132,7 @@
 
     private Phone[] mPhones;
     private NotificationMgr mNotificationMgr;
+    private TestableLooper mTestableLooper;
 
     @Before
     public void setUp() throws Exception {
@@ -182,7 +187,10 @@
         when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
         when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
 
-        mNotificationMgr = new NotificationMgr(mApp);
+        mTestableLooper = TestableLooper.get(this);
+        // Spy it only to avoid sleep for SystemClock.elapsedRealtime()
+        mNotificationMgr = spy(new NotificationMgr(mApp));
+        mTestableLooper.processAllMessages();
     }
 
     @Test
@@ -278,10 +286,7 @@
         prepareResourcesForNetworkSelection();
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(2000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(2 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -298,12 +303,11 @@
         config.putBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL, true);
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
+        // update to OOS as base state
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        // TODO: use effective TestLooper time eclipse instead of sleeping
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        // 10 seconds later
+        moveTimeForward(10 /* seconds */);
+        // verify the behavior on new request
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verifyNotificationSentWithChannelId(NotificationChannelController.CHANNEL_ID_ALERT);
@@ -322,10 +326,7 @@
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE,
                 INVALID_SUBSCRIPTION_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE,
                 INVALID_SUBSCRIPTION_ID);
 
@@ -339,10 +340,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(null);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -362,10 +360,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -386,10 +381,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -410,10 +402,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -439,10 +428,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -469,10 +455,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -500,10 +483,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verifyNotificationSentWithChannelId(NotificationChannelController.CHANNEL_ID_ALERT);
@@ -524,10 +504,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verifyNotificationSentWithChannelId(NotificationChannelController.CHANNEL_ID_ALERT);
@@ -549,10 +526,7 @@
         when(mCarrierConfigManager.getConfigForSubId(TEST_SUB_ID)).thenReturn(config);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verifyNotificationSentWithChannelId(NotificationChannelController.CHANNEL_ID_ALERT);
@@ -572,10 +546,7 @@
         when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA);
 
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ignored) {
-        }
+        moveTimeForward(10 /* seconds */);
         mNotificationMgr.updateNetworkSelection(ServiceState.STATE_OUT_OF_SERVICE, TEST_SUB_ID);
 
         verify(mNotificationManager, never()).notify(any(), anyInt(), any());
@@ -661,4 +632,11 @@
         when(mApp.getString(R.string.mobile_network_settings_class)).thenReturn(
                 MOBILE_NETWORK_SELECTION_CLASS);
     }
+
+    private void moveTimeForward(long seconds) {
+        final long millis = TimeUnit.SECONDS.toMillis(seconds);
+        mTestableLooper.moveTimeForward(millis);
+        mTestableLooper.processAllMessages();
+        doReturn(SystemClock.elapsedRealtime() + millis).when(mNotificationMgr).getTimeStamp();
+    }
 }
diff --git a/tests/src/com/android/phone/Telephony2gUpdaterTest.java b/tests/src/com/android/phone/Telephony2gUpdaterTest.java
deleted file mode 100644
index 3684f30..0000000
--- a/tests/src/com/android/phone/Telephony2gUpdaterTest.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (C) 2022 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.phone;
-
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
-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;
-
-import android.content.Intent;
-import android.os.UserManager;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.TelephonyTestBase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(AndroidJUnit4.class)
-public class Telephony2gUpdaterTest extends TelephonyTestBase {
-    private static final long DRAIN_TIMEOUT = 10;
-    private Telephony2gUpdater mTelephony2gUpdater;
-    private SubscriptionManager.OnSubscriptionsChangedListener mChangedListener;
-    private Executor mExecutor;
-    private CountDownLatch mLatch;
-
-    private UserManager mMockUserManager;
-    private TelephonyManager mMockTelephonyManager;
-    private SubscriptionManager mMockSubscriptionManager;
-
-    // Set up to be returned from mMockSubscriptionManager.getCompleteActiveSubscriptionInfoList()
-    // Updates will be reflected in subsequent calls to the mock method.
-    private List<SubscriptionInfo> mCurrentSubscriptions;
-
-    // 2G Bitmask is 0b10000000_01001011
-    private static final long BASE_NETWORK = 0b11111111_11111111;
-    private static final long EXPECTED_DISABLED = 0b01111111_10110100;
-    private static final long EXPECTED_ENABLED = 0b11111111_11111111;
-
-
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-
-        mMockTelephonyManager = mContext.getSystemService(TelephonyManager.class);
-        mMockUserManager = mContext.getSystemService(UserManager.class);
-        mMockSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
-
-        mCurrentSubscriptions = new ArrayList<>();
-        setupMutableSubscriptionInfoMock();
-
-        mExecutor = Executors.newSingleThreadExecutor();
-        mTelephony2gUpdater = new Telephony2gUpdater(mExecutor, getTestContext(), BASE_NETWORK);
-        mTelephony2gUpdater.init();
-        ArgumentCaptor<SubscriptionManager.OnSubscriptionsChangedListener> argument =
-                ArgumentCaptor.forClass(SubscriptionManager.OnSubscriptionsChangedListener.class);
-        verify(mMockSubscriptionManager).addOnSubscriptionsChangedListener(any(Executor.class),
-                argument.capture());
-        mChangedListener = argument.getValue();
-    }
-
-    @Test
-    public void onSubscriptionsChanged_noSubscriptions_noAllowedNetworksChanged() {
-        triggerOnSubscriptionChangedAndWait();
-        verify(mMockTelephonyManager, never()).setAllowedNetworkTypesForReason(anyInt(), anyInt());
-    }
-
-    @Test
-    public void onSubscriptionsChanged_oneSubscription_allowedNetworksUpdated() {
-        TelephonyManager tmSubscription1 = addSubscriptionAndGetMock(1001);
-        triggerOnSubscriptionChangedAndWait();
-
-        verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-    }
-
-    @Test
-    public void onSubscriptionsChanged_manySubscriptionsDisallow2g_allowedNetworkUpdated() {
-        // 2g is disallowed
-        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
-                true);
-        triggerBroadcastReceiverAndWait();
-
-        TelephonyManager tmSubscription1 = addSubscriptionAndGetMock(1001);
-        TelephonyManager tmSubscription2 = addSubscriptionAndGetMock(1002);
-
-        triggerOnSubscriptionChangedAndWait();
-
-        verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-        verify(tmSubscription2, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-    }
-
-    @Test
-    public void onSubscriptionsChanged_noNewSubscriptions_noAllowedNetworksChanged() {
-        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
-                true);
-        triggerBroadcastReceiverAndWait();
-
-        TelephonyManager tmSubscription1 = addSubscriptionAndGetMock(1001);
-
-        triggerOnSubscriptionChangedAndWait();
-        triggerOnSubscriptionChangedAndWait();
-
-        // subscriptions were updated twice, but we have no new subIds so we only expect one update
-        verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-    }
-
-    @Test
-    public void onSubscriptionsChanged_removeSubscription_noAdditionalNetworkChanges() {
-        // We start with 2 subIds
-        TelephonyManager tmSubscription1 = addSubscriptionAndGetMock(1001);
-        TelephonyManager tmSubscription2 = addSubscriptionAndGetMock(1002);
-
-        triggerOnSubscriptionChangedAndWait();
-
-        // 2g is still enabled since the default is to not set the user restriction
-        verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription2, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-
-
-        mCurrentSubscriptions.remove(1);
-        triggerOnSubscriptionChangedAndWait();
-
-        // Subscriptions have changed, but we've only removed a subscription so there should be no
-        // extra updates to allowed network types
-        verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription2, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-    }
-
-    @Test
-    public void onSubscriptionsChanged_removeSubscriptionAndReAdd() {
-        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
-                true);
-        triggerBroadcastReceiverAndWait();
-
-        TelephonyManager tmSubscription1 = addSubscriptionAndGetMock(1001);
-        triggerOnSubscriptionChangedAndWait();
-        mCurrentSubscriptions.remove(0);
-        triggerOnSubscriptionChangedAndWait();
-        mCurrentSubscriptions.add(getSubInfo(1001));
-        triggerOnSubscriptionChangedAndWait();
-
-        // subscriptions were updated thrice, but one of those updates removed a subscription
-        // such that the sub list was empty, so we only expect an update on the first and last
-        // updates.
-        verify(tmSubscription1, times(2)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-    }
-
-    @Test
-    public void onSubscriptionsChanged_addSubscription_updateAllowedNetworks() {
-        // We start with 2 subIds and update subscriptions
-        TelephonyManager tmSubscription1 = addSubscriptionAndGetMock(1001);
-        TelephonyManager tmSubscription2 = addSubscriptionAndGetMock(1002);
-        triggerOnSubscriptionChangedAndWait();
-
-        // Then add a subId and update subscriptions again
-        TelephonyManager tmSubscription3 = addSubscriptionAndGetMock(1003);
-        triggerOnSubscriptionChangedAndWait();
-
-        // we only need to update the new subscription
-        verify(tmSubscription1, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription2, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription3, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-    }
-
-    @Test
-    public void onUserRestrictionUnchanged_noChangeToRestriction_noAllowedNetworksUpdated() {
-        TelephonyManager tmSubscription = addSubscriptionAndGetMock(1001);
-        triggerOnSubscriptionChangedAndWait();
-        // precondition: we've updated allowed networks to the default (2g enabled)
-        verify(tmSubscription, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription, never()).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-
-        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
-                true);
-        triggerBroadcastReceiverAndWait();
-        triggerBroadcastReceiverAndWait();
-
-        // expect we only updated once even though we got two broadcasts for user restriction
-        // updates
-        verify(tmSubscription, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-        // extra check to ensure we haven't also somehow updated back to enabled along the way
-        verify(tmSubscription, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-    }
-
-    @Test
-    public void onUserRestrictionChanged_restrictionChanged_allowedNetworksUpdated() {
-        // precondition: we've updated allowed networks to the default (2g enabled)
-        TelephonyManager tmSubscription = addSubscriptionAndGetMock(1001);
-        triggerOnSubscriptionChangedAndWait();
-        verify(tmSubscription, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription, never()).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-
-        // update the user restriction to disallow 2g
-        reset(tmSubscription);
-        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
-                true);
-        triggerBroadcastReceiverAndWait();
-        verify(tmSubscription, never()).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-
-
-        // update the user restriction to allow 2g again
-        reset(tmSubscription);
-        when(mMockUserManager.hasUserRestriction(UserManager.DISALLOW_CELLULAR_2G)).thenReturn(
-                false);
-        triggerBroadcastReceiverAndWait();
-        verify(tmSubscription, times(1)).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_ENABLED);
-        verify(tmSubscription, never()).setAllowedNetworkTypesForReason(
-                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_USER_RESTRICTIONS, EXPECTED_DISABLED);
-
-    }
-
-    private SubscriptionInfo getSubInfo(int id) {
-        return new SubscriptionInfo(id, "890126042XXXXXXXXXXX", 0, "T-mobile", "T-mobile", 0, 255,
-                "12345", 0, null, "310", "260", "156", false, null, null);
-    }
-
-    private void triggerOnSubscriptionChangedAndWait() {
-        mExecutor.execute(() -> mChangedListener.onSubscriptionsChanged());
-        drainSingleThreadedExecutor();
-    }
-
-    private void triggerBroadcastReceiverAndWait() {
-        mTelephony2gUpdater.onReceive(mContext, new Intent());
-        drainSingleThreadedExecutor();
-    }
-
-    /**
-     * Wait for all tasks on executor up to the point of invocation to drain, then return.
-     *
-     * This helper takes advantage of the fact that we're using an immutable single threaded
-     * executor that guarantees tasks are executed in the order they are enqueued. It enqueues a
-     * task that decrements a latch and then waits on that task to finish. By definition, once the
-     * test task finishes, all previously enqueued tasks will have also completed.
-     */
-    private void drainSingleThreadedExecutor() {
-        resetExecutorLatch();
-        mExecutor.execute(() -> mLatch.countDown());
-        try {
-            mLatch.await(DRAIN_TIMEOUT, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            fail(e.getMessage());
-        }
-    }
-
-    private void resetExecutorLatch() {
-        mLatch = new CountDownLatch(1);
-    }
-
-    /**
-     * Helper that allows you to update subInfo and have that change reflected on subsequent calls
-     * to {@link SubscriptionManager#getCompleteActiveSubscriptionInfoList()}
-     */
-    private void setupMutableSubscriptionInfoMock() {
-        var answer = new Answer<List<SubscriptionInfo>>() {
-            @Override
-            public List<SubscriptionInfo> answer(InvocationOnMock invocation) throws Throwable {
-                return mCurrentSubscriptions;
-            }
-        };
-        when(mMockSubscriptionManager.getCompleteActiveSubscriptionInfoList()).thenAnswer(answer);
-    }
-
-    private TelephonyManager addSubscriptionAndGetMock(int subId) {
-        mCurrentSubscriptions.add(getSubInfo(subId));
-        TelephonyManager tmSubscription = mock(TelephonyManager.class);
-        when(mMockTelephonyManager.createForSubscriptionId(subId)).thenReturn(tmSubscription);
-        return tmSubscription;
-    }
-
-}
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index a1d7405..8aa5923 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -1518,6 +1518,40 @@
     }
 
     @Test
+    public void testDomainSelectionNormalRoutingEmergencyNumber() throws Exception {
+        setupForCallTest();
+        int selectedDomain = DOMAIN_PS;
+
+        EmergencyNumber emergencyNumber = new EmergencyNumber(TEST_EMERGENCY_NUMBER, "", "",
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED,
+                Collections.emptyList(),
+                EmergencyNumber.EMERGENCY_NUMBER_SOURCE_DATABASE,
+                EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL);
+
+        setupForDialForDomainSelection(mPhone0, selectedDomain, false);
+        doReturn(true).when(mTelephonyManagerProxy).isCurrentEmergencyNumber(anyString());
+        doReturn(emergencyNumber).when(mEmergencyNumberTracker).getEmergencyNumber(anyString());
+
+        mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
+                        TEST_EMERGENCY_NUMBER, TELECOM_CALL_ID1));
+
+        verify(mDomainSelectionResolver)
+                .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(false));
+        verify(mNormalCallDomainSelectionConnection).createNormalConnection(any(), any());
+
+        ArgumentCaptor<DialArgs> argsCaptor = ArgumentCaptor.forClass(DialArgs.class);
+
+        verify(mPhone0).dial(anyString(), argsCaptor.capture(), any());
+        DialArgs dialArgs = argsCaptor.getValue();
+        assertNotNull("DialArgs param is null", dialArgs);
+        assertNotNull("intentExtras is null", dialArgs.intentExtras);
+        assertTrue(dialArgs.intentExtras.containsKey(PhoneConstants.EXTRA_DIAL_DOMAIN));
+        assertEquals(
+                selectedDomain, dialArgs.intentExtras.getInt(PhoneConstants.EXTRA_DIAL_DOMAIN, -1));
+    }
+
+    @Test
     public void testDomainSelectionNormalToEmergencyCs() throws Exception {
         setupForCallTest();
 
@@ -1527,9 +1561,10 @@
         int selectedDomain = DOMAIN_CS;
 
         setupForDialForDomainSelection(mPhone0, selectedDomain, true);
+        doReturn(mPhone0).when(mImsPhone).getDefaultPhone();
 
         TestTelephonyConnection c = setupForReDialForDomainSelection(
-                mPhone0, selectedDomain, preciseDisconnectCause, disconnectCause, false);
+                mImsPhone, selectedDomain, preciseDisconnectCause, disconnectCause, false);
         c.setEmergencyServiceCategory(eccCategory);
         c.setAddress(TEST_ADDRESS, TelecomManager.PRESENTATION_ALLOWED);
 
@@ -1566,9 +1601,10 @@
         int selectedDomain = DOMAIN_PS;
 
         setupForDialForDomainSelection(mPhone0, selectedDomain, true);
+        doReturn(mPhone0).when(mImsPhone).getDefaultPhone();
 
         TestTelephonyConnection c = setupForReDialForDomainSelection(
-                mPhone0, selectedDomain, preciseDisconnectCause, disconnectCause, false);
+                mImsPhone, selectedDomain, preciseDisconnectCause, disconnectCause, false);
         c.setEmergencyServiceCategory(eccCategory);
         c.setAddress(TEST_ADDRESS, TelecomManager.PRESENTATION_ALLOWED);
 
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index aedfe9e..c50c6b5 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -316,6 +316,28 @@
     }
 
     @Test
+    public void testNoCsCombinedImsNotRegisteredSelectPs() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
+                new int[0]);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
+                true, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+    }
+
+    @Test
     public void testDefaultCombinedImsNotRegisteredBarredSelectCs() throws Exception {
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(true);
diff --git a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
index 890ca34..8780f1f 100644
--- a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
@@ -31,7 +31,10 @@
 import android.os.CancellationSignal;
 import android.os.HandlerThread;
 import android.os.Looper;
+import android.os.PersistableBundle;
+import android.telecom.TelecomManager;
 import android.telephony.AccessNetworkConstants;
+import android.telephony.CarrierConfigManager;
 import android.telephony.DisconnectCause;
 import android.telephony.DomainSelectionService;
 import android.telephony.DomainSelector;
@@ -75,18 +78,32 @@
     private NormalCallDomainSelector mNormalCallDomainSelector;
 
     @Mock private Context mMockContext;
+    @Mock private CarrierConfigManager mMockCarrierConfigMgr;
     @Mock private ImsManager mMockImsManager;
     @Mock private ImsMmTelManager mMockMmTelManager;
     @Mock private ImsStateTracker mMockImsStateTracker;
     @Mock private DomainSelectorBase.DestroyListener mMockDestroyListener;
+    @Mock private TelecomManager mMockTelecomManager;
 
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+
         doReturn(Context.TELEPHONY_IMS_SERVICE).when(mMockContext)
                 .getSystemServiceName(ImsManager.class);
         doReturn(mMockImsManager).when(mMockContext)
                 .getSystemService(Context.TELEPHONY_IMS_SERVICE);
+
+        doReturn(Context.CARRIER_CONFIG_SERVICE).when(mMockContext)
+                .getSystemServiceName(CarrierConfigManager.class);
+        doReturn(mMockCarrierConfigMgr).when(mMockContext)
+                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
+
+        doReturn(Context.TELECOM_SERVICE).when(mMockContext)
+                .getSystemServiceName(TelecomManager.class);
+        doReturn(mMockTelecomManager).when(mMockContext)
+                .getSystemService(Context.TELECOM_SERVICE);
+
         doReturn(mMockMmTelManager).when(mMockImsManager).getImsMmTelManager(SUB_ID_1);
         doReturn(mMockMmTelManager).when(mMockImsManager).getImsMmTelManager(SUB_ID_2);
         doNothing().when(mMockImsStateTracker).removeServiceStateListener(any());
@@ -310,6 +327,90 @@
         assertTrue(transportSelectorCallback.verifyOnWlanSelected());
     }
 
+    @Test
+    public void testWPSCallDomainSelection() {
+        MockTransportSelectorCallback transportSelectorCallback =
+                new MockTransportSelectorCallback();
+        DomainSelectionService.SelectionAttributes attributes =
+                new DomainSelectionService.SelectionAttributes.Builder(
+                        SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                        .setNumber("*272121")
+                        .setCallId(TEST_CALLID)
+                        .setEmergency(false)
+                        .setVideoCall(false)
+                        .setExitedFromAirplaneMode(false)
+                        .build();
+
+        //Case 1: WPS not supported by IMS
+        PersistableBundle config = new PersistableBundle();
+        config.putBoolean(CarrierConfigManager.KEY_SUPPORT_WPS_OVER_IMS_BOOL, false);
+        doReturn(config).when(mMockCarrierConfigMgr).getConfigForSubId(SUB_ID_1);
+        ServiceState serviceState = new ServiceState();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        initialize(serviceState, true, true, true, true);
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
+        assertTrue(transportSelectorCallback
+                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_CS));
+
+        //Case 2: WPS supported by IMS and WLAN registered
+        config.putBoolean(CarrierConfigManager.KEY_SUPPORT_WPS_OVER_IMS_BOOL, true);
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        initialize(serviceState, true, true, true, true);
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(transportSelectorCallback.verifyOnWlanSelected());
+
+        //Case 2: WPS supported by IMS and LTE registered
+        config.putBoolean(CarrierConfigManager.KEY_SUPPORT_WPS_OVER_IMS_BOOL, true);
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        initialize(serviceState, true, false, true, true);
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
+        assertTrue(transportSelectorCallback
+                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_PS));
+    }
+
+    @Test
+    public void testTtyCallDomainSelection() {
+        MockTransportSelectorCallback transportSelectorCallback =
+                new MockTransportSelectorCallback();
+        DomainSelectionService.SelectionAttributes attributes =
+                new DomainSelectionService.SelectionAttributes.Builder(
+                        SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                        .setCallId(TEST_CALLID)
+                        .setEmergency(false)
+                        .setVideoCall(false)
+                        .setExitedFromAirplaneMode(false)
+                        .build();
+
+        //Case 1: TTY not supported by IMS and TTY enabled
+        doReturn(TelecomManager.TTY_MODE_FULL).when(mMockTelecomManager).getCurrentTtyMode();
+        PersistableBundle config = new PersistableBundle();
+        config.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
+        doReturn(config).when(mMockCarrierConfigMgr).getConfigForSubId(SUB_ID_1);
+        ServiceState serviceState = new ServiceState();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        initialize(serviceState, true, false, true, true);
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
+        assertTrue(transportSelectorCallback
+                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_CS));
+
+        //Case 2: TTY supported by IMS and TTY enabled
+        config.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true);
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
+        assertTrue(transportSelectorCallback
+                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_PS));
+
+        //Case 3: TTY supported by IMS and TTY disabled
+        doReturn(TelecomManager.TTY_MODE_OFF).when(mMockTelecomManager).getCurrentTtyMode();
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
+        assertTrue(transportSelectorCallback
+                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_PS));
+    }
+
     static class MockTransportSelectorCallback implements TransportSelectorCallback,
             WwanSelectorCallback {
         public boolean mCreated;