Merge "Add esos questionnaire button" into main
diff --git a/ecc/input/eccdata.txt b/ecc/input/eccdata.txt
index 3248179..c4edc9e 100644
--- a/ecc/input/eccdata.txt
+++ b/ecc/input/eccdata.txt
@@ -208,17 +208,14 @@
   eccs {
     phone_number: "122"
     types: POLICE
-    routing: NORMAL
   }
   eccs {
     phone_number: "124"
     types: AMBULANCE
-    routing: NORMAL
   }
   eccs {
     phone_number: "123"
     types: FIRE
-    routing: NORMAL
   }
   ecc_fallback: "112"
 }
@@ -521,7 +518,7 @@
   eccs {
     phone_number: "117"
     types: POLICE
-    routing: NORMAL
+    routing: EMERGENCY
   }
   eccs {
     phone_number: "144"
@@ -551,7 +548,6 @@
   eccs {
     phone_number: "1414"
     types: TYPE_UNSPECIFIED
-    routing: NORMAL
   }
   eccs {
     phone_number: "0800117117"
@@ -1201,46 +1197,6 @@
     types: FIRE
     routing: NORMAL
   }
-  eccs {
-    phone_number: "115"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "116000"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "191"
-    types: MOUNTAIN_RESCUE
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "196"
-    types: MARINE_GUARD
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "197"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "116117"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "119"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "116111"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
   ecc_fallback: "112"
 }
 countries {
@@ -1411,12 +1367,10 @@
   eccs {
     phone_number: "101"
     types: AMBULANCE
-    routing: NORMAL
   }
   eccs {
     phone_number: "102"
     types: FIRE
-    routing: NORMAL
   }
   ecc_fallback: "112"
 }
@@ -1435,28 +1389,6 @@
     types: FIRE
     routing: NORMAL
   }
-  eccs {
-    phone_number: "101"
-    types: FIRE
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "102"
-    types: AMBULANCE
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "103"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "108"
-    types: POLICE
-    types: AMBULANCE
-    types: FIRE
-    routing: NORMAL
-  }
   ecc_fallback: "112"
 }
 countries {
@@ -2428,86 +2360,6 @@
     types: AMBULANCE
     types: FIRE
   }
-  eccs {
-    phone_number: "984"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-    normal_routing_mncs: "01"
-    normal_routing_mncs: "06"
-  }
-  eccs {
-    phone_number: "985"
-    types: MOUNTAIN_RESCUE
-    routing: NORMAL
-    normal_routing_mncs: "01"
-    normal_routing_mncs: "06"
-  }
-  eccs {
-    phone_number: "997"
-    types: POLICE
-    routing: NORMAL
-    normal_routing_mncs: "01"
-    normal_routing_mncs: "06"
-  }
-  eccs {
-    phone_number: "998"
-    types: FIRE
-    routing: NORMAL
-    normal_routing_mncs: "01"
-    normal_routing_mncs: "06"
-  }
-  eccs {
-    phone_number: "999"
-    types: AMBULANCE
-    routing: NORMAL
-    normal_routing_mncs: "01"
-    normal_routing_mncs: "06"
-  }
-  eccs {
-    phone_number: "986"
-    types: POLICE
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "987"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "989"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "991"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "992"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "993"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "994"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "995"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "996"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
   ecc_fallback: "112"
 }
 countries {
@@ -2618,46 +2470,6 @@
     types: FIRE
     routing: NORMAL
   }
-  eccs {
-    phone_number: "115"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "116000"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "191"
-    types: MOUNTAIN_RESCUE
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "196"
-    types: MARINE_GUARD
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "197"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "116117"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "119"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
-  eccs {
-    phone_number: "116111"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
   ecc_fallback: "112"
 }
 countries {
@@ -2816,7 +2628,6 @@
     phone_number: "995"
     types: AMBULANCE
     types: FIRE
-    routing: NORMAL
   }
   ecc_fallback: "112"
 }
@@ -2841,11 +2652,6 @@
     types: AMBULANCE
     types: FIRE
   }
-  eccs {
-    phone_number: "113"
-    types: POLICE
-    routing: NORMAL
-  }
   ecc_fallback: "112"
 }
 countries {
@@ -2856,11 +2662,6 @@
     types: AMBULANCE
     types: FIRE
   }
-  eccs {
-    phone_number: "159"
-    types: TYPE_UNSPECIFIED
-    routing: NORMAL
-  }
   ecc_fallback: "112"
 }
 countries {
@@ -3183,13 +2984,11 @@
   eccs {
     phone_number: "110"
     types: POLICE
-    routing: NORMAL
   }
   eccs {
     phone_number: "119"
     types: AMBULANCE
     types: FIRE
-    routing: NORMAL
   }
   ecc_fallback: "112"
 }
diff --git a/ecc/output/eccdata b/ecc/output/eccdata
index b42de09..482ed79 100644
--- a/ecc/output/eccdata
+++ b/ecc/output/eccdata
Binary files differ
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index c15fa11..6694b97 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -56,7 +56,7 @@
     <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="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>
@@ -173,7 +173,7 @@
     <string name="vm_change_pin_error_invalid" msgid="5230002671175580674">"Шинэ ПИН-д буруу тэмдэгт агуулагдаж байна."</string>
     <string name="vm_change_pin_error_system_error" msgid="9116483527909681791">"ПИН-г өөрчлөх боломжгүй"</string>
     <string name="vvm_unsupported_message_format" msgid="4206402558577739713">"Дэмжигдээгүй мессежийн төрөл, сонсохын тулд <xliff:g id="NUMBER">%s</xliff:g> руу залгана уу."</string>
-    <string name="network_settings_title" msgid="7560807107123171541">"Мобайл сүлжээ"</string>
+    <string name="network_settings_title" msgid="7560807107123171541">"Хөдөлгөөнт холбооны сүлжээ"</string>
     <string name="label_available" msgid="1316084116670821258">"Боломжтой сүлжээнүүд"</string>
     <string name="load_networks_progress" msgid="4051433047717401683">"Хайж байна..."</string>
     <string name="empty_networks_list" msgid="9216418268008582342">"Сүлжээ олдсонгүй."</string>
@@ -305,7 +305,7 @@
     <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"үүрэн холбооны компани, esim, sim, euicc, үүрэн холбооны компани сэлгэх, үүрэн холбооны компани нэмэх"</string>
     <string name="carrier_settings_euicc_summary" msgid="2027941166597330117">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g> — <xliff:g id="PHONE_NUMBER">%2$s</xliff:g>"</string>
     <string name="mobile_data_settings_title" msgid="7228249980933944101">"Мобайл дата"</string>
-    <string name="mobile_data_settings_summary" msgid="5012570152029118471">"Мобайл сүлжээг ашиглан датанд хандах"</string>
+    <string name="mobile_data_settings_summary" msgid="5012570152029118471">"Хөдөлгөөнт холбооны сүлжээг ашиглан датанд хандах"</string>
     <string name="data_usage_disable_mobile" msgid="5669109209055988308">"Мобайл датаг унтраах уу?"</string>
     <string name="sim_selection_required_pref" msgid="6985901872978341314">"Сонгох шаардлагатай"</string>
     <string name="sim_change_data_title" msgid="9142726786345906606">"Дата SIM солих уу?"</string>
@@ -535,16 +535,16 @@
     <string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"Дуут шуудангийн дугаар тодорхойгүй"</string>
     <string name="notification_network_selection_title" msgid="255595526707809121">"Үйлчилгээ байхгүй"</string>
     <string name="notification_network_selection_text" msgid="553288408722427659">"Сонгосон <xliff:g id="OPERATOR_NAME">%s</xliff:g> сүлжээг ашиглах боломжгүй"</string>
-    <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Дуудлага хийхийн тулд мобайл сүлжээг асаах, нислэгийн горим буюу батарей хэмнэх горимыг идэвхгүй болгоно уу."</string>
+    <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Дуудлага хийхийн тулд хөдөлгөөнт холбооны сүлжээг асаах, нислэгийн горим буюу батарей хэмнэх горимыг идэвхгүй болгоно уу."</string>
     <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Дуудлага хийхийн тулд онгоцны горимыг унтраа."</string>
     <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Дуудлага хийхийн тулд онгоцны горимыг унтраа эсвэл утасгүй интернетэд холбогдоно уу."</string>
     <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Утас хэт халуун байна"</b>\n\n"Энэ дуудлагыг гүйцээх боломжгүй. Та утсаа хөрсөн үед дахин оролдоно уу.\n\nТа яаралтай дуудлага хийх боломжтой хэвээр байна."</string>
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Яаралтай түргэн тусламжийн бус дуудлага хийхийн тулд яаралтай түргэн тусламжийн callback горимоос гарна уу."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Сүлжээнд бүртгэгдээгүй."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Мобайль сүлжээ байхгүй."</string>
-    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Мобайл сүлжээ боломжгүй байна.\n\nДуудлага хийхийн тулд утасгүй сүлжээнд холбогдоно уу.\n\n2G-г энэ төхөөрөмж дээр идэвхгүй болгосон бөгөөд энэ нь таны холболтод нөлөөлж байж магадгүй. Үргэлжлүүлэхийн тулд Тохиргоо руу очоод, 2G-г зөвшөөрөхийг идэвхжүүлнэ үү."</string>
-    <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Мобайл сүлжээнд холбогдох боломжгүй байна. Дуудлага хийхийн тулд утасгүй интернетэд холбогдоно уу."</string>
-    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Мобайл сүлжээ боломжгүй байна.\n\nДуудлага хийхийн тулд утасгүй сүлжээнд холбогдоно уу.\n\n2G-г энэ төхөөрөмж дээр идэвхгүй болгосон бөгөөд энэ нь таны холболтод нөлөөлж байж магадгүй. Үргэлжлүүлэхийн тулд Тохиргоо руу очоод, 2G-г зөвшөөрөхийг идэвхжүүлнэ үү."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Хөдөлгөөнт холбооны сүлжээ боломжгүй байна.\n\nДуудлага хийхийн тулд утасгүй сүлжээнд холбогдоно уу.\n\n2G-г энэ төхөөрөмж дээр идэвхгүй болгосон бөгөөд энэ нь таны холболтод нөлөөлж байж магадгүй. Үргэлжлүүлэхийн тулд Тохиргоо руу очоод, 2G-г зөвшөөрөхийг идэвхжүүлнэ үү."</string>
+    <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Хөдөлгөөнт холбооны сүлжээнд холбогдох боломжгүй байна. Дуудлага хийхийн тулд утасгүй интернетэд холбогдоно уу."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Хөдөлгөөнт холбооны сүлжээ боломжгүй байна.\n\nДуудлага хийхийн тулд утасгүй сүлжээнд холбогдоно уу.\n\n2G-г энэ төхөөрөмж дээр идэвхгүй болгосон бөгөөд энэ нь таны холболтод нөлөөлж байж магадгүй. Үргэлжлүүлэхийн тулд Тохиргоо руу очоод, 2G-г зөвшөөрөхийг идэвхжүүлнэ үү."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Дуудлага хийхийн тулд хүчин төгөлдөр дугаар оруулна уу."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Дуудлага амжилтгүй болсон."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Дуудлагыг энэ удаад нэмэх боломжгүй. Та мессеж илгээн холбоо тогтоохыг оролдох боломжтой."</string>
@@ -717,7 +717,7 @@
     <string name="clh_card_title_call_ended_txt" msgid="5977978317527299698">"Дуудлага дууссан"</string>
     <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"Нислэгийн горим асаалттай"</string>
     <string name="clh_callFailed_simError_txt" msgid="5128538525762326413">"SIM картад хандах боломжгүй"</string>
-    <string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"Мобайл сүлжээ байхгүй"</string>
+    <string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"Хөдөлгөөнт холбооны сүлжээ байхгүй"</string>
     <string name="clh_callFailed_satelliteEnabled_txt" msgid="1675517238240377396">"Хиймэл дагуулын горим асаалттай байна"</string>
     <string name="clh_callFailed_unassigned_number_txt" msgid="141967660286695682">"Таны залгахыг оролдож буй утасны дугаарт асуудал байна. Алдааны код 1."</string>
     <string name="clh_callFailed_no_route_to_destination_txt" msgid="4805015149822352308">"Дуудлагыг гүйцээж чадсангүй. Алдааны код 3."</string>
@@ -824,10 +824,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>-г ашиглахын тулд SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>-д мобайл датаг асаасан эсэхээ шалгана уу. Та үүнийг мобайл сүлжээний тохиргоонд өөрчлөх боломжтой."</string>
-    <string name="supp_service_over_ut_precautions_roaming_dual_sim" msgid="6627654855191817965">"<xliff:g id="SUPP_SERVICE">%1$s</xliff:g>-г ашиглахын тулд SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>-д мобайл дата болон дата роуминг асаасан эсэхээ шалгана уу. Та эдгээрийг мобайл сүлжээний тохиргоонд өөрчлөх боломжтой."</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>-г ашиглахын тулд SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>-д мобайл датаг асаасан эсэхээ шалгана уу. Та үүнийг хөдөлгөөнт холбооны сүлжээний тохиргоонд өөрчлөх боломжтой."</string>
+    <string name="supp_service_over_ut_precautions_roaming_dual_sim" msgid="6627654855191817965">"<xliff:g id="SUPP_SERVICE">%1$s</xliff:g>-г ашиглахын тулд SIM <xliff:g id="SIM_NUMBER">%2$d</xliff:g>-д мобайл дата болон дата роуминг асаасан эсэхээ шалгана уу. Та эдгээрийг хөдөлгөөнт холбооны сүлжээний тохиргоонд өөрчлөх боломжтой."</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/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 4e077e9..6b85016 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -518,7 +518,9 @@
 
         ContentResolver resolver = getContentResolver();
 
-        if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()) {
+        if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
+                && !getResources().getBoolean(
+                    com.android.internal.R.bool.config_force_phone_globals_creation)) {
             if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
                 Log.v(LOG_TAG, "onCreate()... but not defined FEATURE_TELEPHONY");
                 return;
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index e22f51a..e6a143b 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -13930,6 +13930,32 @@
     }
 
     /**
+     * This API can be used by only CTS to set the cache whether satellite communication is allowed.
+     *
+     * @param state a state indicates whether satellite access allowed state should be cached and
+     * the allowed state.
+     * @return {@code true} if the setting is successful, {@code false} otherwise.
+     */
+    public boolean setIsSatelliteCommunicationAllowedForCurrentLocationCache(String state) {
+        if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+            Log.d(LOG_TAG, "setIsSatelliteCommunicationAllowedForCurrentLocationCache: "
+                    + "oemEnabledSatelliteFlag is disabled");
+            return false;
+        }
+
+        Log.d(LOG_TAG, "setIsSatelliteCommunicationAllowedForCurrentLocationCache: "
+                + "state=" + state);
+        TelephonyPermissions.enforceShellOnly(
+                Binder.getCallingUid(),
+                "setIsSatelliteCommunicationAllowedForCurrentLocationCache");
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp,
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID,
+                "setIsSatelliteCommunicationAllowedForCurrentLocationCache");
+        return mSatelliteAccessController.setIsSatelliteCommunicationAllowedForCurrentLocationCache(
+                state);
+    }
+
+    /**
      * Sets the service defined in ComponentName to be bound.
      *
      * This should only be used for testing.
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index 9f67c75..6969275 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -207,6 +207,8 @@
             "set-oem-enabled-satellite-provision-status";
     private static final String SET_SHOULD_SEND_DATAGRAM_TO_MODEM_IN_DEMO_MODE =
             "set-should-send-datagram-to-modem-in-demo-mode";
+    private static final String SET_IS_SATELLITE_COMMUNICATION_ALLOWED_FOR_CURRENT_LOCATION_CACHE =
+            "set-is-satellite-communication-allowed-for-current-location-cache";
 
     private static final String DOMAIN_SELECTION_SUBCOMMAND = "domainselection";
     private static final String DOMAIN_SELECTION_SET_SERVICE_OVERRIDE = "set-dss-override";
@@ -418,6 +420,8 @@
                 return handleSetCountryCodes();
             case SET_OEM_ENABLED_SATELLITE_PROVISION_STATUS:
                 return handleSetOemEnabledSatelliteProvisionStatus();
+            case SET_IS_SATELLITE_COMMUNICATION_ALLOWED_FOR_CURRENT_LOCATION_CACHE:
+                return handleSetIsSatelliteCommunicationAllowedForCurrentLocationCache();
             default: {
                 return handleDefaultCommands(cmd);
             }
@@ -3699,6 +3703,61 @@
         return 0;
     }
 
+    private int handleSetIsSatelliteCommunicationAllowedForCurrentLocationCache() {
+        PrintWriter errPw = getErrPrintWriter();
+        String opt;
+        String state;
+
+        if ((opt = getNextArg()) == null) {
+            errPw.println(
+                    "adb shell cmd phone set-is-satellite-communication-allowed-for-current"
+                            + "-location-cache :"
+                            + " Invalid Argument");
+            return -1;
+        } else {
+            switch (opt) {
+                case "-a": {
+                    state = "cache_allowed";
+                    break;
+                }
+                case "-n": {
+                    state = "cache_clear_and_not_allowed";
+                    break;
+                }
+                case "-c": {
+                    state = "clear_cache_only";
+                    break;
+                }
+                default:
+                    errPw.println(
+                            "adb shell cmd phone set-is-satellite-communication-allowed-for-current"
+                                    + "-location-cache :"
+                                    + " Invalid Argument");
+                    return -1;
+            }
+        }
+
+        Log.d(LOG_TAG, "handleSetIsSatelliteCommunicationAllowedForCurrentLocationCache("
+                + state + ")");
+
+        try {
+            boolean result = mInterface.setIsSatelliteCommunicationAllowedForCurrentLocationCache(
+                    state);
+            if (VDBG) {
+                Log.v(LOG_TAG, "setIsSatelliteCommunicationAllowedForCurrentLocationCache "
+                        + "returns: "
+                        + result);
+            }
+            getOutPrintWriter().println(result);
+        } catch (RemoteException e) {
+            Log.w(LOG_TAG, "setIsSatelliteCommunicationAllowedForCurrentLocationCache("
+                    + state + "), error = " + e.getMessage());
+            errPw.println("Exception: " + e.getMessage());
+            return -1;
+        }
+        return 0;
+    }
+
     /**
      * Sample inputStr = "US,UK,CA;2,1,3"
      * Sample output: {[US,2], [UK,1], [CA,3]}
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index 9bea4a4..97a170b 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -76,6 +76,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -208,6 +209,10 @@
     @GuardedBy("mSatelliteCommunicationAllowStateLock")
     private boolean mCurrentSatelliteAllowedState = false;
 
+    private static final long NANOS_IN_DAY = Duration.ofDays(1).toNanos();
+    private boolean mLatestSatelliteCommunicationAllowed;
+    private long mLatestSatelliteCommunicationAllowedSetTime;
+
     /**
      * Create a SatelliteAccessController instance.
      *
@@ -279,8 +284,10 @@
         if (sInstance == null) {
             HandlerThread handlerThread = new HandlerThread("SatelliteAccessController");
             handlerThread.start();
+            LocationManager lm = context.createAttributionContext("telephony")
+                    .getSystemService(LocationManager.class);
             sInstance = new SatelliteAccessController(context, featureFlags,
-                    handlerThread.getLooper(), context.getSystemService(LocationManager.class),
+                    handlerThread.getLooper(), lm,
                     context.getSystemService(TelecomManager.class), null, null);
         }
         return sInstance;
@@ -788,7 +795,7 @@
                         sendSatelliteAllowResultToReceivers(resultCode, bundle, false);
                     } else {
                         logd("Satellite is provisioned");
-                        checkSatelliteAccessRestrictionForCurrentLocation();
+                        checkSatelliteAccessRestrictionUsingGPS();
                     }
                 } else {
                     loge("KEY_SATELLITE_PROVISIONED does not exist.");
@@ -839,6 +846,55 @@
     }
 
     /**
+     * Telephony-internal logic to verify if satellite access is restricted from the location query.
+     */
+    private void checkSatelliteAccessRestrictionUsingGPS() {
+        logv("checkSatelliteAccessRestrictionUsingGPS:");
+        if (isInEmergency()) {
+            executeLocationQuery();
+        } else {
+            if (mLocationManager.isLocationEnabled()) {
+                logd("location query is allowed");
+                if (isCommunicationAllowedCacheValid()) {
+                    Bundle bundle = new Bundle();
+                    bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED,
+                            mLatestSatelliteCommunicationAllowed);
+                    sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+                            mLatestSatelliteCommunicationAllowed);
+                } else {
+                    executeLocationQuery();
+                }
+            } else {
+                logv("location query is not allowed");
+                Bundle bundle = new Bundle();
+                bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle, false);
+            }
+        }
+    }
+
+    /* returns true,if the latest query was executed in 24Hr, or returns false. */
+    private boolean isCommunicationAllowedCacheValid() {
+        if (mLatestSatelliteCommunicationAllowedSetTime > 0) {
+            long currentTime = SystemClock.elapsedRealtimeNanos();
+            if ((currentTime - mLatestSatelliteCommunicationAllowedSetTime) <= NANOS_IN_DAY) {
+                logv("isCommunicationAllowedCacheValid: cache is valid");
+                return true;
+            }
+        }
+        logv("isCommunicationAllowedCacheValid: cache is expired");
+        return false;
+    }
+
+    private void executeLocationQuery() {
+        logv("executeLocationQuery");
+        synchronized (mLock) {
+            mFreshLastKnownLocation = getFreshLastKnownLocation();
+            checkSatelliteAccessRestrictionUsingOnDeviceData();
+        }
+    }
+
+    /**
      * This function synchronously checks if satellite is allowed at current location using cached
      * country codes.
      */
@@ -915,7 +971,18 @@
             if (location != null) {
                 checkSatelliteAccessRestrictionForLocation(location);
             } else {
-                checkSatelliteAccessRestrictionUsingCachedCountryCodes();
+                logd("current location is not available");
+                Bundle bundle = new Bundle();
+                if (isCommunicationAllowedCacheValid()) {
+                    logd("onCurrentLocationAvailable: 24Hr cache is still valid, using it");
+                    bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED,
+                            mLatestSatelliteCommunicationAllowed);
+                    sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+                            mLatestSatelliteCommunicationAllowed);
+                } else {
+                    bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                    sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle, false);
+                }
             }
         }
     }
@@ -933,7 +1000,10 @@
                 } else {
                     if (!initSatelliteOnDeviceAccessController()) {
                         loge("Failed to init SatelliteOnDeviceAccessController");
-                        checkSatelliteAccessRestrictionUsingCachedCountryCodes();
+                        Bundle bundle = new Bundle();
+                        bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                        sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+                                false);
                         return;
                     }
                     satelliteAllowed = mSatelliteOnDeviceAccessController
@@ -944,11 +1014,23 @@
                 bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, satelliteAllowed);
                 sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
                         satelliteAllowed);
+                mLatestSatelliteCommunicationAllowed = satelliteAllowed;
+                mLatestSatelliteCommunicationAllowedSetTime = SystemClock.elapsedRealtimeNanos();
             } catch (Exception ex) {
                 loge("checkSatelliteAccessRestrictionForLocation: ex=" + ex);
                 reportAnomaly(UUID_ON_DEVICE_LOOKUP_EXCEPTION,
                         "On-device satellite lookup exception");
-                checkSatelliteAccessRestrictionUsingCachedCountryCodes();
+                Bundle bundle = new Bundle();
+                if (isCommunicationAllowedCacheValid()) {
+                    bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED,
+                            mLatestSatelliteCommunicationAllowed);
+                    logd("checkSatelliteAccessRestrictionForLocation: 24Hr cache is still valid, "
+                            + "using it");
+                } else {
+                    bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                }
+                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+                        mLatestSatelliteCommunicationAllowed);
             }
         }
     }
@@ -1324,6 +1406,49 @@
         mSatelliteCommunicationAllowedStateChangedListeners.remove(callback.asBinder());
     }
 
+    /**
+     * This API can be used by only CTS to set the cache whether satellite communication is allowed.
+     *
+     * @param state a state indicates whether satellite access allowed state should be cached and
+     * the allowed state.
+     * @return {@code true} if the setting is successful, {@code false} otherwise.
+     */
+    public boolean setIsSatelliteCommunicationAllowedForCurrentLocationCache(String state) {
+        if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+            logd("setIsSatelliteCommunicationAllowedForCurrentLocationCache: "
+                    + "oemEnabledSatelliteFlag is disabled");
+            return false;
+        }
+
+        if (!isMockModemAllowed()) {
+            logd("setIsSatelliteCommunicationAllowedForCurrentLocationCache: "
+                    + "mock modem not allowed.");
+            return false;
+        }
+
+        logd("setIsSatelliteCommunicationAllowedForCurrentLocationCache: state=" + state);
+
+        synchronized (mSatelliteCommunicationAllowStateLock) {
+            if ("cache_allowed".equalsIgnoreCase(state)) {
+                mLatestSatelliteCommunicationAllowedSetTime = SystemClock.elapsedRealtimeNanos();
+                mLatestSatelliteCommunicationAllowed = true;
+                mCurrentSatelliteAllowedState = true;
+            } else if ("cache_clear_and_not_allowed".equalsIgnoreCase(state)) {
+                mLatestSatelliteCommunicationAllowedSetTime = 0;
+                mLatestSatelliteCommunicationAllowed = false;
+                mCurrentSatelliteAllowedState = false;
+            } else if ("clear_cache_only".equalsIgnoreCase(state)) {
+                mLatestSatelliteCommunicationAllowedSetTime = 0;
+                mLatestSatelliteCommunicationAllowed = false;
+            } else {
+                loge("setIsSatelliteCommunicationAllowedForCurrentLocationCache: invalid state="
+                        + state);
+                return false;
+            }
+        }
+        return true;
+    }
+
     private void notifySatelliteCommunicationAllowedStateChanged(boolean allowState) {
         logd("notifySatelliteCommunicationAllowedStateChanged: allowState=" + allowState);
 
@@ -1352,4 +1477,8 @@
     private static void loge(@NonNull String log) {
         Rlog.e(TAG, log);
     }
+
+    private static void logv(@NonNull String log) {
+        Rlog.v(TAG, log);
+    }
 }
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 5c651da..daa4b4e 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -1057,8 +1057,8 @@
                 + ", lastNetworkType=" + accessNetworkTypeToString(mLastNetworkType));
 
         if (mLastRegResult != null
-                && !SubscriptionManager.isValidSubscriptionId(getSubId())
-                && sPreferGeranWhenSimAbsent.contains(mLastRegResult.getCountryIso())) {
+                && sPreferGeranWhenSimAbsent.contains(mLastRegResult.getCountryIso())
+                && !isSimReady()) {
             logi("getNextPreferredNetworks preferGeran");
             preferredNetworks.add(GERAN);
             preferredNetworks.add(UTRAN);
diff --git a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
index 31a1cc2..8d49634 100644
--- a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
@@ -108,7 +108,7 @@
             mSelectorState = SelectorState.INACTIVE;
             loge("Subscription-ids doesn't match. This instance is associated with sub-id:"
                     + getSubId() + ", requested sub-id:" + subId);
-            // TODO: Throw anamoly here. This condition should never occur.
+            // TODO: Throw anomaly here. This condition should never occur.
         }
     }
 
@@ -314,6 +314,7 @@
     private synchronized void selectDomain() {
         if (mSelectorState != SelectorState.ACTIVE || mSelectionAttributes == null
                 || mTransportSelectorCallback == null) {
+            mSelectorState = SelectorState.INACTIVE;
             logd("Domain Selection is stopped.");
             return;
         }
@@ -429,7 +430,7 @@
     }
 
     @VisibleForTesting
-    public SelectorState getSelectorState() {
+    protected SelectorState getSelectorState() {
         return mSelectorState;
     }
 }
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
index d79240e..b5b781c 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
@@ -36,6 +36,7 @@
 import android.telephony.satellite.stub.SatelliteModemState;
 import android.telephony.satellite.stub.SatelliteResult;
 import android.telephony.satellite.stub.SatelliteService;
+import android.telephony.satellite.stub.SystemSelectionSpecifier;
 import android.util.Log;
 
 import com.android.internal.util.FunctionalUtils;
@@ -434,6 +435,23 @@
         mIsRequestIsSatelliteEnabledForCarrier = true;
     }
 
+    @Override
+    public void updateSatelliteSubscription(@NonNull String iccId,
+            @NonNull IIntegerConsumer resultCallback) {
+        logd("updateSatelliteSubscription: iccId=" + iccId + " mErrorCode=" + mErrorCode);
+        runWithExecutor(() -> resultCallback.accept(mErrorCode));
+    }
+
+    @Override
+    public void updateSystemSelectionChannels(
+            @NonNull List<SystemSelectionSpecifier> systemSelectionSpecifiers,
+            @NonNull IIntegerConsumer resultCallback) {
+        logd(" updateSystemSelectionChannels: "
+                + "systemSelectionSpecifiers=" + systemSelectionSpecifiers
+                + " mErrorCode=" + mErrorCode);
+        runWithExecutor(() -> resultCallback.accept(mErrorCode));
+    }
+
     public void setLocalSatelliteListener(@NonNull ILocalSatelliteListener listener) {
         logd("setLocalSatelliteListener: listener=" + listener);
         mLocalListener = listener;
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index 62d9d8c..f2427b1 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -323,22 +323,11 @@
                 mSatelliteAllowedSemaphore, 1));
         assertEquals(SATELLITE_RESULT_MODEM_ERROR, mQueriedSatelliteAllowedResultCode);
 
-        // Network country codes are available.
-        setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
-        setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
-        clearAllInvocations();
-        when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(listOf("US", "CA"));
-        mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
-                SUB_ID, mSatelliteAllowedReceiver);
-        mTestableLooper.processAllMessages();
-        assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
-                mSatelliteAllowedSemaphore, 1));
-        assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
-        assertTrue(mQueriedSatelliteAllowed);
-
         // Network country codes are not available. TelecomManager.isInEmergencyCall() returns true.
         // On-device access controller will be used. Last known location is available and fresh.
         clearAllInvocations();
+        setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+        setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
         when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(EMPTY_STRING_LIST);
         when(mMockTelecomManager.isInEmergencyCall()).thenReturn(true);
         mSatelliteAccessControllerUT.elapsedRealtimeNanos = TEST_LOCATION_FRESH_DURATION_NANOS + 1;
@@ -424,12 +413,11 @@
         assertFalse(mSatelliteAccessControllerUT.isWaitForCurrentLocationTimerStarted());
         verify(mMockSatelliteOnDeviceAccessController, never()).isSatCommunicationAllowedAtLocation(
                 any(SatelliteOnDeviceAccessController.LocationToken.class));
-        verifyCountryDetectorApisCalled();
         assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
                 mSatelliteAllowedSemaphore, 1));
         assertEquals(SATELLITE_RESULT_SUCCESS,
                 mQueriedSatelliteAllowedResultCode);
-        assertFalse(mQueriedSatelliteAllowed);
+        assertTrue(mQueriedSatelliteAllowed);
 
         // Network country codes are not available. TelecomManager.isInEmergencyCall() returns
         // false. No phone is in ECM. Last known location is not fresh. Cached country codes should
@@ -452,43 +440,11 @@
                 any(Consumer.class));
         verify(mMockSatelliteOnDeviceAccessController, never()).isSatCommunicationAllowedAtLocation(
                 any(SatelliteOnDeviceAccessController.LocationToken.class));
-        verifyCountryDetectorApisCalled();
         assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
                 mSatelliteAllowedSemaphore, 1));
         assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
         assertFalse(mQueriedSatelliteAllowed);
 
-        // Network country codes are not available. TelecomManager.isInEmergencyCall() returns
-        // false. No phone is in ECM. Last known location is not fresh. Cached country codes should
-        // be used for verifying satellite allow. Cached country codes are available.
-        clearAllInvocations();
-        when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(EMPTY_STRING_LIST);
-        when(mMockCountryDetector.getCachedLocationCountryIsoInfo())
-                .thenReturn(new Pair<>("US", 5L));
-        Map<String, Long> cachedNetworkCountryCodes = new HashMap<>();
-        cachedNetworkCountryCodes.put("UK", 1L);
-        cachedNetworkCountryCodes.put("US", 3L);
-        when(mMockCountryDetector.getCachedNetworkCountryIsoInfo())
-                .thenReturn(cachedNetworkCountryCodes);
-        when(mMockTelecomManager.isInEmergencyCall()).thenReturn(false);
-        when(mMockPhone.isInEcm()).thenReturn(false);
-        when(mMockPhone2.isInEcm()).thenReturn(false);
-        mSatelliteAccessControllerUT.elapsedRealtimeNanos = TEST_LOCATION_FRESH_DURATION_NANOS + 1;
-        when(mMockLocation0.getElapsedRealtimeNanos()).thenReturn(0L);
-        when(mMockLocation1.getElapsedRealtimeNanos()).thenReturn(0L);
-        mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
-                SUB_ID, mSatelliteAllowedReceiver);
-        mTestableLooper.processAllMessages();
-        verify(mMockLocationManager, never()).getCurrentLocation(anyString(),
-                any(LocationRequest.class), any(CancellationSignal.class), any(Executor.class),
-                any(Consumer.class));
-        verify(mMockSatelliteOnDeviceAccessController, never()).isSatCommunicationAllowedAtLocation(
-                any(SatelliteOnDeviceAccessController.LocationToken.class));
-        verifyCountryDetectorApisCalled();
-        assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
-                mSatelliteAllowedSemaphore, 1));
-        assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
-        assertTrue(mQueriedSatelliteAllowed);
     }
 
     @Test
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 5062b32..f783a12 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -3971,7 +3971,7 @@
     }
 
     @Test
-    public void testAdjustCsRatPreference() throws Exception {
+    public void testInvalidSubscriptionAdjustCsRatPreference() throws Exception {
         doReturn(new String[] {"us"}).when(mResources).getStringArray(
                 eq(R.array.config_countries_prefer_geran_when_sim_absent));
 
@@ -3998,6 +3998,34 @@
     }
 
     @Test
+    public void testSimNotReadyAdjustCsRatPreference() throws Exception {
+        doReturn(new String[] {"us"}).when(mResources).getStringArray(
+                eq(R.array.config_countries_prefer_geran_when_sim_absent));
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+        // SIM state is not ready.
+        doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
+                .when(mTelephonyManager).getSimState(anyInt());
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN, 0, false, true, 0, 0, "", "", "us");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify adjusted RAT preference
+        verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, GERAN);
+    }
+
+    @Test
     public void testNotAdjustCsRatPreferenceCountryNotIdentified() throws Exception {
         doReturn(new String[] {"us"}).when(mResources).getStringArray(
                 eq(R.array.config_countries_prefer_geran_when_sim_absent));
diff --git a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
index 6e438bf..309418e 100644
--- a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
@@ -48,6 +48,7 @@
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsMmTelManager;
 import android.telephony.ims.ImsReasonInfo;
+import android.testing.TestableLooper;
 import android.util.Log;
 
 import androidx.test.runner.AndroidJUnit4;
@@ -60,7 +61,6 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.List;
-import java.util.concurrent.Executors;
 import java.util.function.Consumer;
 
 /**
@@ -79,7 +79,7 @@
 
     private HandlerThread mHandlerThread;
     private NormalCallDomainSelector mNormalCallDomainSelector;
-
+    private TestableLooper mTestableLooper;
     @Mock private Context mMockContext;
     @Mock private CarrierConfigManager mMockCarrierConfigMgr;
     @Mock private ImsManager mMockImsManager;
@@ -124,6 +124,12 @@
 
         mNormalCallDomainSelector = new NormalCallDomainSelector(mMockContext, SLOT_ID, SUB_ID_1,
                 mHandlerThread.getLooper(), mMockImsStateTracker, mMockDestroyListener);
+
+        try {
+            setUpTestableLooper();
+        } catch (Exception e) {
+            fail(e.toString());
+        }
     }
 
     @After
@@ -131,6 +137,23 @@
         if (mHandlerThread != null) {
             mHandlerThread.quit();
         }
+
+        if (mTestableLooper != null) {
+            mTestableLooper.destroy();
+            mTestableLooper = null;
+        }
+    }
+
+    private void setUpTestableLooper() throws Exception {
+        mTestableLooper = new TestableLooper(mNormalCallDomainSelector.getLooper());
+    }
+
+    private void processAllMessages() {
+        Log.d(TAG, "processAllMessages - start");
+        while (!mTestableLooper.getLooper().getQueue().isIdle()) {
+            mTestableLooper.processAllMessages();
+        }
+        Log.d(TAG, "processAllMessages - end");
     }
 
     private void initialize(ServiceState serviceState, boolean isImsRegistered,
@@ -154,22 +177,22 @@
 
     @Test
     public void testInitialState() {
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
     @Test
     public void testDestroyedState() {
         mNormalCallDomainSelector.destroy();
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.DESTROYED);
+        assertEquals(NormalCallDomainSelector.SelectorState.DESTROYED,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
     @Test
     public void testDestroyedDuringActiveState() {
-        MockTransportSelectorCallback transportSelectorCallback =
-                new MockTransportSelectorCallback(mNormalCallDomainSelector);
+        TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
 
         DomainSelectionService.SelectionAttributes attributes =
                 new DomainSelectionService.SelectionAttributes.Builder(
@@ -183,19 +206,19 @@
 
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.ACTIVE);
+        assertEquals(NormalCallDomainSelector.SelectorState.ACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         mNormalCallDomainSelector.destroy();
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.DESTROYED);
+        assertEquals(NormalCallDomainSelector.SelectorState.DESTROYED,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
     @Test
     public void testSelectDomainInputParams() {
-        MockTransportSelectorCallback transportSelectorCallback =
-                new MockTransportSelectorCallback(mNormalCallDomainSelector);
+        TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
 
         DomainSelectionService.SelectionAttributes attributes =
                 new DomainSelectionService.SelectionAttributes.Builder(
@@ -208,8 +231,8 @@
                         .build();
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.ACTIVE);
+        assertEquals(NormalCallDomainSelector.SelectorState.ACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 1: null inputs
         try {
@@ -218,8 +241,8 @@
             fail("Invalid input params not handled." + e.getMessage());
         }
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 2: null TransportSelectorCallback
         try {
@@ -228,8 +251,8 @@
             fail("Invalid params (SelectionAttributes) not handled." + e.getMessage());
         }
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 3: null SelectionAttributes
         transportSelectorCallback.mSelectionTerminated = false;
@@ -239,11 +262,10 @@
             fail("Invalid params (SelectionAttributes) not handled." + e.getMessage());
         }
 
-        assertTrue(transportSelectorCallback
-                .verifyOnSelectionTerminated(DisconnectCause.OUTGOING_FAILURE));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.DESTROYED);
+        assertTrue(transportSelectorCallback.mSelectionTerminated);
+        assertEquals(transportSelectorCallback.mCauseCode, DisconnectCause.OUTGOING_FAILURE);
+        assertEquals(NormalCallDomainSelector.SelectorState.DESTROYED,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 4: Invalid Subscription-id
         attributes = new DomainSelectionService.SelectionAttributes.Builder(
@@ -260,11 +282,10 @@
             fail("Invalid params (SelectionAttributes) not handled." + e.getMessage());
         }
 
-        assertTrue(transportSelectorCallback
-                .verifyOnSelectionTerminated(DisconnectCause.OUTGOING_FAILURE));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.DESTROYED);
+        assertTrue(transportSelectorCallback.mSelectionTerminated);
+        assertEquals(transportSelectorCallback.mCauseCode, DisconnectCause.OUTGOING_FAILURE);
+        assertEquals(NormalCallDomainSelector.SelectorState.DESTROYED,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 5: Invalid SELECTOR_TYPE
         attributes =
@@ -282,11 +303,10 @@
             fail("Invalid params (SelectionAttributes) not handled." + e.getMessage());
         }
 
-        assertTrue(transportSelectorCallback
-                .verifyOnSelectionTerminated(DisconnectCause.OUTGOING_FAILURE));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.DESTROYED);
+        assertTrue(transportSelectorCallback.mSelectionTerminated);
+        assertEquals(transportSelectorCallback.mCauseCode, DisconnectCause.OUTGOING_FAILURE);
+        assertEquals(NormalCallDomainSelector.SelectorState.DESTROYED,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 6: Emergency Call
         attributes = new DomainSelectionService.SelectionAttributes.Builder(
@@ -303,44 +323,52 @@
             fail("Invalid params (SelectionAttributes) not handled." + e.getMessage());
         }
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.DESTROYED);
-
-        assertTrue(transportSelectorCallback
-                .verifyOnSelectionTerminated(DisconnectCause.OUTGOING_FAILURE));
+        assertTrue(transportSelectorCallback.mSelectionTerminated);
+        assertEquals(transportSelectorCallback.mCauseCode, DisconnectCause.OUTGOING_FAILURE);
+        assertEquals(NormalCallDomainSelector.SelectorState.DESTROYED,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
     @Test
     public void testOutOfService() {
-        MockTransportSelectorCallback transportSelectorCallback =
-                new MockTransportSelectorCallback(mNormalCallDomainSelector);
-        DomainSelectionService.SelectionAttributes attributes =
-                new DomainSelectionService.SelectionAttributes.Builder(
-                        SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
-                        .setAddress(TEST_URI)
-                        .setCallId(TEST_CALLID)
-                        .setEmergency(false)
-                        .setVideoCall(true)
-                        .setExitedFromAirplaneMode(false)
-                        .build();
+        final TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
+        mNormalCallDomainSelector.post(() -> {
 
-        ServiceState serviceState = new ServiceState();
-        serviceState.setStateOutOfService();
-        initialize(serviceState, false, false, false, false);
+            DomainSelectionService.SelectionAttributes attributes =
+                    new DomainSelectionService.SelectionAttributes.Builder(
+                            SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                            .setAddress(TEST_URI)
+                            .setCallId(TEST_CALLID)
+                            .setEmergency(false)
+                            .setVideoCall(true)
+                            .setExitedFromAirplaneMode(false)
+                            .build();
 
-        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+            ServiceState serviceState = new ServiceState();
+            serviceState.setStateOutOfService();
+            initialize(serviceState, false, false, false, false);
 
-        assertTrue(transportSelectorCallback
-                .verifyOnSelectionTerminated(DisconnectCause.OUT_OF_SERVICE));
+            mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        });
 
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.DESTROYED);
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mSelectionTerminated);
+        assertEquals(DisconnectCause.OUT_OF_SERVICE, transportSelectorCallback.mCauseCode);
+
+        assertEquals(NormalCallDomainSelector.SelectorState.DESTROYED,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
     @Test
     public void testDomainSelection() {
-        MockTransportSelectorCallback transportSelectorCallback =
-                new MockTransportSelectorCallback(mNormalCallDomainSelector);
+        final TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
+
+        final ServiceState serviceState = new ServiceState();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        initialize(serviceState, true, true, true, true);
+        transportSelectorCallback.reset();
         DomainSelectionService.SelectionAttributes attributes =
                 new DomainSelectionService.SelectionAttributes.Builder(
                         SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
@@ -352,34 +380,17 @@
                         .build();
 
         // Case 1: WLAN
-        ServiceState serviceState = new ServiceState();
-        serviceState.setState(ServiceState.STATE_IN_SERVICE);
-        initialize(serviceState, true, true, true, true);
-
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertTrue(transportSelectorCallback.verifyOnWlanSelected());
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWlanSelected);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 2: 5G
-        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
-
+        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));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
-
-        // Case 3: PS -> CS redial
-        ImsReasonInfo imsReasonInfo = new ImsReasonInfo();
-        imsReasonInfo.mCode = ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED;
+        transportSelectorCallback.reset();
         attributes = new DomainSelectionService.SelectionAttributes.Builder(
                 SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
                 .setAddress(TEST_URI)
@@ -387,54 +398,89 @@
                 .setEmergency(false)
                 .setVideoCall(false)
                 .setExitedFromAirplaneMode(false)
-                .setPsDisconnectCause(imsReasonInfo)
+                .build();
+
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWwanSelected);
+        assertEquals(NetworkRegistrationInfo.DOMAIN_PS, transportSelectorCallback.mSelectedDomain);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+
+
+        // Case 3: PS -> CS redial
+        final ImsReasonInfo imsReasonInfoCsRetry = new ImsReasonInfo(
+                ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED, 0, null);
+        transportSelectorCallback.reset();
+        attributes = new DomainSelectionService.SelectionAttributes.Builder(
+                SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCallId(TEST_CALLID)
+                .setEmergency(false)
+                .setVideoCall(false)
+                .setExitedFromAirplaneMode(false)
+                .setPsDisconnectCause(imsReasonInfoCsRetry)
                 .build();
 
         mNormalCallDomainSelector.reselectDomain(attributes);
 
-        assertTrue(transportSelectorCallback
-                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_CS));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_CS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         // Case 4: CS call
+        transportSelectorCallback.reset();
+        initialize(serviceState, false, false, false, false);
         NetworkRegistrationInfo nwRegistrationInfo = new NetworkRegistrationInfo(
                 NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                 NetworkRegistrationInfo.REGISTRATION_STATE_HOME,
                 AccessNetworkConstants.AccessNetworkType.UTRAN, 0, false,
                 null, null, null, false, 0, 0, 0);
         serviceState.addNetworkRegistrationInfo(nwRegistrationInfo);
+        attributes = new DomainSelectionService.SelectionAttributes.Builder(
+                SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCallId(TEST_CALLID)
+                .setEmergency(false)
+                .setVideoCall(false)
+                .setExitedFromAirplaneMode(false)
+                .setPsDisconnectCause(imsReasonInfoCsRetry)
+                .build();
 
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        initialize(serviceState, false, false, false, false);
-        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
-
-        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
-
-        assertTrue(transportSelectorCallback
-                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_CS));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_CS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         //Case 5: Backup calling
         serviceState.setStateOutOfService();
+        transportSelectorCallback.reset();
+        attributes = new DomainSelectionService.SelectionAttributes.Builder(
+                SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCallId(TEST_CALLID)
+                .setEmergency(false)
+                .setVideoCall(false)
+                .setExitedFromAirplaneMode(false)
+                .setPsDisconnectCause(imsReasonInfoCsRetry)
+                .build();
         initialize(serviceState, true, true, true, true);
-
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertTrue(transportSelectorCallback.verifyOnWlanSelected());
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.ACTIVE);
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWlanSelected);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
     @Test
     public void testWPSCallDomainSelection() {
-        MockTransportSelectorCallback transportSelectorCallback =
-                new MockTransportSelectorCallback(mNormalCallDomainSelector);
+        TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
         DomainSelectionService.SelectionAttributes attributes =
                 new DomainSelectionService.SelectionAttributes.Builder(
                         SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
@@ -457,46 +503,43 @@
 
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
-
-        assertTrue(transportSelectorCallback
-                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_CS));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWwanSelected);
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_CS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         //Case 2: WPS supported by IMS and WLAN registered
+        transportSelectorCallback.reset();
         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());
-
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWlanSelected);
         assertEquals(mNormalCallDomainSelector.getSelectorState(),
                 NormalCallDomainSelector.SelectorState.INACTIVE);
 
         //Case 2: WPS supported by IMS and LTE registered
+        transportSelectorCallback.reset();
         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));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_PS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
     @Test
     public void testTtyCallDomainSelection() {
-        MockTransportSelectorCallback transportSelectorCallback =
-                new MockTransportSelectorCallback(mNormalCallDomainSelector);
+        TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
         DomainSelectionService.SelectionAttributes attributes =
                 new DomainSelectionService.SelectionAttributes.Builder(
                         SLOT_ID, SUB_ID_1, SELECTOR_TYPE_CALLING)
@@ -520,42 +563,34 @@
 
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
-
-        assertTrue(transportSelectorCallback
-                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_CS));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWwanSelected);
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_CS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         //Case 2: TTY supported by IMS and TTY enabled
+        transportSelectorCallback.reset();
         config.putBoolean(CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true);
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
-
-        assertTrue(transportSelectorCallback
-                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_PS));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_PS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
 
         //Case 3: TTY supported by IMS and TTY disabled
+        transportSelectorCallback.reset();
         doReturn(TelecomManager.TTY_MODE_OFF).when(mMockTelecomManager).getCurrentTtyMode();
         mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
 
-        assertTrue(transportSelectorCallback.verifyOnWwanSelected());
-
-        assertTrue(transportSelectorCallback
-                .verifyOnDomainSelected(NetworkRegistrationInfo.DOMAIN_PS));
-
-        assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                NormalCallDomainSelector.SelectorState.INACTIVE);
+        processAllMessages();
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_PS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
     }
 
-
-
-    static class MockTransportSelectorCallback implements TransportSelectorCallback,
+    static class TestTransportSelectorCallback implements TransportSelectorCallback,
             WwanSelectorCallback {
         public boolean mCreated;
         public boolean mWlanSelected;
@@ -566,8 +601,9 @@
         int mSelectedDomain;
         NormalCallDomainSelector mNormalCallDomainSelector;
 
-        MockTransportSelectorCallback(NormalCallDomainSelector normalCallDomainSelector) {
+        TestTransportSelectorCallback(NormalCallDomainSelector normalCallDomainSelector) {
             mNormalCallDomainSelector = normalCallDomainSelector;
+            mCauseCode = DisconnectCause.NOT_VALID;
         }
 
         @Override
@@ -575,50 +611,21 @@
             Log.d(TAG, "onCreated");
             mCreated = true;
 
-            assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                    NormalCallDomainSelector.SelectorState.INACTIVE);
-
-            notifyAll();
-        }
-
-        public boolean verifyOnCreated() {
-            mCreated = false;
-            Log.d(TAG, "verifyOnCreated");
-            waitForCallback(mCreated);
-            return mCreated;
+            assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                    mNormalCallDomainSelector.getSelectorState());
         }
 
         @Override
         public synchronized void onWlanSelected(boolean useEmergencyPdn) {
             Log.d(TAG, "onWlanSelected");
             mWlanSelected = true;
-
-            assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                    NormalCallDomainSelector.SelectorState.INACTIVE);
-
-            notifyAll();
-        }
-
-        public boolean verifyOnWlanSelected() {
-            Log.d(TAG, "verifyOnWlanSelected");
-            waitForCallback(mWlanSelected);
-            return mWlanSelected;
         }
 
         @Override
         public void onWwanSelected(final Consumer<WwanSelectorCallback> consumer) {
+            Log.d(TAG, "onWwanSelected");
             mWwanSelected = true;
-            Executors.newSingleThreadExecutor().execute(() -> {
-                consumer.accept(this);
-            });
-
-            assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                    NormalCallDomainSelector.SelectorState.INACTIVE);
-        }
-
-        public boolean verifyOnWwanSelected() {
-            waitForCallback(mWwanSelected);
-            return mWwanSelected;
+            consumer.accept(this);
         }
 
         @Override
@@ -627,31 +634,12 @@
             mCauseCode = cause;
             mSelectionTerminated = true;
 
-            assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                    NormalCallDomainSelector.SelectorState.INACTIVE);
+            assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                    mNormalCallDomainSelector.getSelectorState());
 
             notifyAll();
         }
 
-        public boolean verifyOnSelectionTerminated(int cause) {
-            Log.i(TAG, "verifyOnSelectionTerminated - called");
-            waitForCallback(mSelectionTerminated);
-            return (mSelectionTerminated && cause == mCauseCode);
-        }
-
-        private synchronized void waitForCallback(boolean condition) {
-            long now = System.currentTimeMillis();
-            long deadline = now + 1000;
-            try {
-                while (!condition && now < deadline) {
-                    wait(deadline - now);
-                    now = System.currentTimeMillis();
-                }
-            } catch (Exception e) {
-                Log.i(TAG, e.getMessage());
-            }
-        }
-
         @Override
         public void onRequestEmergencyNetworkScan(@NonNull List<Integer> preferredNetworks,
                 int scanType,
@@ -668,17 +656,19 @@
             mSelectedDomain = domain;
             mDomainSelected = true;
 
-            assertEquals(mNormalCallDomainSelector.getSelectorState(),
-                    NormalCallDomainSelector.SelectorState.INACTIVE);
+            assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                    mNormalCallDomainSelector.getSelectorState());
 
             notifyAll();
         }
-
-        public boolean verifyOnDomainSelected(int domain) {
-            Log.i(TAG, "verifyOnDomainSelected - called");
+        public void reset() {
+            mCreated = false;
+            mWlanSelected = false;
+            mWwanSelected = false;
+            mSelectionTerminated = false;
             mDomainSelected = false;
-            waitForCallback(mDomainSelected);
-            return (domain == mSelectedDomain);
+            mCauseCode = DisconnectCause.NOT_VALID;
+            mSelectedDomain = NetworkRegistrationInfo.DOMAIN_UNKNOWN;
         }
     }
 }