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">"<Коюлган эмес>"</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;