Merge "Make java_sdk_library dependencies explicit" into main am: 8da9f9abcd

Original change: https://android-review.googlesource.com/c/platform/packages/services/Telephony/+/3248007

Change-Id: I571ee953271c35bc97d57836c38beef7be4f0039
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/Android.bp b/Android.bp
index 64c1857..2c41fb9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -45,10 +45,10 @@
         "modules-utils-os",
         "nist-sip",
         "service-entitlement",
-        "telephony_flags_core_java_lib",
-        "android.permission.flags-aconfig-java",
+        "android.permission.flags-aconfig-java-export",
         "satellite-s2storage-ro",
         "s2-geometry-library-java",
+        "dropbox_flags_lib",
     ],
 
     srcs: [
@@ -101,3 +101,4 @@
     name: "TeleService-platform-compat-config",
     src: ":TeleService",
 }
+
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 1190d38..09258a4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -119,6 +119,7 @@
     <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
     <uses-permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST" />
     <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
+    <uses-permission android:name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER" />
     <!-- Needed to block messages. -->
     <uses-permission android:name="android.permission.READ_BLOCKED_NUMBERS" />
     <!-- Needed for emergency contact notification. -->
@@ -270,7 +271,7 @@
 
         <activity android:name="GsmUmtsCallOptions"
                 android:label="@string/gsm_umts_options"
-                android:exported="true"
+                android:exported="false"
                 android:theme="@style/DialerSettingsLight">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -279,7 +280,7 @@
 
         <activity android:name="CdmaCallOptions"
                 android:label="@string/cdma_options"
-                android:exported="true"
+                android:exported="false"
                 android:theme="@style/DialerSettingsLight">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -329,7 +330,7 @@
         <!-- fdn setting -->
         <activity android:name="com.android.phone.settings.fdn.FdnSetting"
                 android:label="@string/fdn"
-                android:exported="true"
+                android:exported="false"
                 android:theme="@style/CallSettingsWithoutDividerTheme">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/assets/CarrierRestrictionOperatorDetails.json b/assets/CarrierRestrictionOperatorDetails.json
index 8602d4e..a088f94 100644
--- a/assets/CarrierRestrictionOperatorDetails.json
+++ b/assets/CarrierRestrictionOperatorDetails.json
@@ -1,6 +1,10 @@
 {
-  "_comment": "Operator should register with its application package name, carrierId and all the corresponding  SHAIDs",
-  "_comment": "Example format :: << \"packageName\" : {\"carrierId\":<int>, \"callerSHA1Id\":[<SHAID1>, <SHAID2>]} >>",
-  "com.vzw.hss.myverizon":{"carrierId":1839,"callerSHA1Id":["C58EE7871896786F8BF70EBDB137DE10074043E9","AE23A03436DF07B0CD70FE881CDA2EC1D21215D7B7B0CC68E67B67F5DF89526A"]},
-  "com.google.android.apps.tycho":{"carrierId":1989,"callerSHA1Id":["B9CFCE1C47A6AC713442718F15EF55B00B3A6D1A6D48CB46249FA8EB51465350","4C36AF4A5BDAD97C1F3D8B283416D244496C2AC5EAFE8226079EF6F676FD1859"]}
+  "_comment": "Operator should register with its application package name, carrierId and all the corresponding  SHA256IDs",
+  "_comment": "Example format :: << \"packageName\" : {\"carrierId\":[<int>], \"callerSHA256Ids\":[<SHAID1>, <SHAID2>]} >>",
+  "com.vzw.hss.myverizon":{"carrierIds":[1839],"callerSHA256Ids":["AE23A03436DF07B0CD70FE881CDA2EC1D21215D7B7B0CC68E67B67F5DF89526A"]},
+  "com.google.android.apps.tycho":{"carrierIds":[1989],"callerSHA256Ids":["B9CFCE1C47A6AC713442718F15EF55B00B3A6D1A6D48CB46249FA8EB51465350","4C36AF4A5BDAD97C1F3D8B283416D244496C2AC5EAFE8226079EF6F676FD1859"]},
+  "com.comcast.mobile.mxs":{"carrierIds": [2032,2532,2556],"callerSHA256Ids":["914C26403B57D2D482359FC235CC825AD00D52B0121C18EF2B2B9D4DDA4B8996"]},
+  "com.xfinity.digitalhome": {"carrierIds": [2032,2532,2556],"callerSHA256Ids":["31b4c17315c2269040d535f7b6a79cf4d11517c664d9de8f1ddf4f8a785aad47"]},
+  "com.xfinity.digitalhome.debug":{"carrierIds": [2032,2532,2556],"callerSHA256Ids":["c9133e8168f97573c8c567f46777dff74ade0c015ecf2c5e91be3e4e76ddcae2"]},
+  "com.xfinity.dh.xm.app": {"carrierIds": [2032,2532,2556],"callerSHA256Ids":["c9133e8168f97573c8c567f46777dff74ade0c015ecf2c5e91be3e4e76ddcae2"]}
 }
\ No newline at end of file
diff --git a/assets/google_us_san_sat_s2.dat b/assets/google_us_san_sat_s2.dat
index 60b00df..4d99f86 100644
--- a/assets/google_us_san_sat_s2.dat
+++ b/assets/google_us_san_sat_s2.dat
Binary files differ
diff --git a/proguard.flags b/proguard.flags
index 8eafd30..c572e1b 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -12,4 +12,6 @@
 -keep class com.android.phone.callcomposer.** {
  *;
 }
+# Keep the FakeFeatureFlagsImpl
+-keep class com.android.internal.telephony.flags.FakeFeatureFlagsImpl { *; }
 -verbose
\ No newline at end of file
diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml
index ffe63de..f18eda0 100644
--- a/res/layout/radio_info.xml
+++ b/res/layout/radio_info.xml
@@ -20,6 +20,7 @@
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:paddingTop="40dp"
     android:layoutDirection="locale"
     android:textDirection="locale">
 
@@ -185,6 +186,12 @@
             <TextView android:id="@+id/network_slicing_config" style="@style/info_value" />
         </LinearLayout>
 
+        <!-- eUICC info -->
+        <LinearLayout style="@style/RadioInfo_entry_layout" android:orientation="horizontal">
+            <TextView android:id="@+id/euicc_info_label" android:text="@string/radio_info_euicc_info" style="@style/info_label" />
+            <TextView android:id="@+id/euicc_info" style="@style/info_value" />
+        </LinearLayout>
+
         <!-- Horizontal Rule -->
         <View
             android:layout_width="fill_parent"
@@ -204,6 +211,22 @@
                  android:layout_height="wrap_content"
                 />
 
+        <!-- Mock signal strength -->
+        <LinearLayout style="@style/RadioInfo_entry_layout">
+            <TextView android:text="@string/radio_info_signal_strength_label" style="@style/info_label" />
+            <Spinner android:id="@+id/signalStrength"
+                 android:layout_width="match_parent"
+                 android:layout_height="wrap_content"/>
+        </LinearLayout>
+
+       <!-- Mock data network type -->
+       <LinearLayout style="@style/RadioInfo_entry_layout">
+            <TextView android:text="@string/radio_info_data_network_type_label" style="@style/info_label" />
+            <Spinner android:id="@+id/dataNetworkType"
+                 android:layout_width="match_parent"
+                 android:layout_height="wrap_content"/>
+         </LinearLayout>
+
         <!-- Horizontal Rule -->
         <View
             android:layout_width="fill_parent"
@@ -226,6 +249,24 @@
                 android:layout_height="wrap_content"
                 android:text="@string/simulate_out_of_service_string"/>
 
+        <!-- Simulate this SIM to be satellite -->
+        <Switch android:id="@+id/mock_carrier_roaming_satellite"
+                android:textSize="14sp"
+                android:layout_marginTop="8dip"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/mock_carrier_roaming_satellite_string"/>
+
+        <!-- ESOS -->
+        <Button android:id="@+id/esos_questionnaire"
+                android:textSize="14sp"
+                android:layout_marginTop="8dip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAllCaps="false"
+                android:text="@string/esos_satellite_string"
+        />
+
         <!-- VoLTE provisioned -->
         <Switch android:id="@+id/volte_provisioned_switch"
                 android:textSize="14sp"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 277fb42..2827cf9 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Belinstellings"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Oproepinstellings kan net deur die administrateur verander word."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Net die admin of werkgebruiker kan foonrekeninginstellings verander."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Die toesteleienaar het die vermoë om selnetwerkinstellings te verander, beperk."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Instellings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Oproepinstellingsfout"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Lees tans instellings…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Verlaat noodterugbelmodus om \'n nienoodoproep te maak."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Nie geregistreer op netwerk nie."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiele netwerk nie beskikbaar nie."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Selnetwerk is nie beskikbaar nie.\n\nVerbind met ’n draadlose netwerk om ’n oproep te maak.\n\n2G is gedeaktiveer op hierdie toestel, wat dalk jou konnektiwiteit kan beïnvloed. Gaan na Instellings en aktiveer Laat 2G toe om voort te gaan."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobiele netwerk is nie beskikbaar nie. Koppel aan \'n draadlose netwerk om \'n oproep te maak."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Selnetwerk is nie beskikbaar nie.\n\nVerbind met ’n draadlose netwerk om ’n oproep te maak.\n\n2G is gedeaktiveer op hierdie toestel, wat jou konnektiwiteit kan beïnvloed. Gaan na Instellings en aktiveer Laat 2G toe om voort te gaan."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Voer \'n geldige nommer in om \'n oproep te maak."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Oproep het misluk."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Oproep kan nie op die oomblik bygevoeg word nie. Jy kan probeer in verbinding tree deur \'n boodskap te stuur."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Kan nie oproepe aanhou nie."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Koppel aan \'n draadlose netwerk om \'n oproep te maak."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktiveer Wi-Fi-oproepe om \'n oproep te maak."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Deaktiveer satellietmodus om ’n oproep te maak."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Om ’n oproep te maak, moet jy eers die satellietverbinding beëindig."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Jy kan boodskappe stuur en ontvang sonder ’n selfoon- of wi-fi-netwerk."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Noodinligting"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Eienaar"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tik weer om inligting te bekyk"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Stel Verwyderbare-e-SIM as Verstek"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobieleradiokrag"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simuleer is nie beskikbaar nie (Slegs ontfoutingbou)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satellietmodus van skyndiensverskaffer (net ontfoutingsbou)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Toets regte satelliet-eSOS-modus (net ontfoutingsbou)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Bekyk SIM-adresboek"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Kyk na vaste skakelnommers"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Bekyk skakeldiensnommers"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 95437d5..96ef7ac 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"የጥሪ ቅንብሮች"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"የጥሪ ቅንብሮች በአስተዳዳሪ ተጠቃሚው ብቻ ነው ሊለወጡ የሚችሉት።"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"የስልክ የመለያ ቅንብሮች መለወጥ የሚችሉት በአስተዳዳሪ ወይም በሥራ ተጠቃሚ ብቻ ነው።"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"የመሣሪያው ባለቤት የተንቀሳቃሽ ስልክ የአውታረ መረብ ቅንብሮችን የመለወጥ ችሎታን ገድበዋል።"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"አስቸኳይ ያልሆነ ጥሪ ለማድረግ ከአስቸኳይ መልሰህ ደውል ሁነታ ይውጡ።"</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_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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ጥሪዎችን መያዝ አልተቻለም።"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ጥሪ ለማድረግ ወደ ሽቦ አልባ አውታረ መረብ ያገናኙ።"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ጥሪ ለማድረግ Wi-Fi ጥሪን ያንቁ።"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ጥሪ ለማድረግ የመንኩራኩር ሁነታን ያሰናክሉ።"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ጥሪ ለማድረግ፣ በመጀመሪያ የሳተላይት ግንኙነቱን ያብቁ።"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"ያለ ሞባይል ወይም የWi-Fi አውታረ መረብ መልዕክቶችን መላክ እና መቀበል ይችላሉ።"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"የአደጋ ጊዜ መረጃ"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ባለቤት"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"መረጃ ለማየት እንደገና መታ ያድርጉ"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"የሚወገድን ኢሲም ነባሪ በሚል አቀናብር"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"የሞባይል ሬዲዮ ኃይል"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ከአገልግሎት ውጭን አስመስል (የስህተት ማረሚያ ግንብ ብቻ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier Satellite Mode (የስህተት ማረሚያ ግንባታ ብቻ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"የእውነተኛ ሳተላይት eSOS ሁነታን ይሞክሩ (የስህተት ማረሚያ ግንብ ብቻ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"የሲም አድራሻ ደብተር አሳይ"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"በቋሚነት የሚደወልባቸው ቁጥሮች"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"የአገልግሎት መደወያ ቁጥሮችን ተመልከት"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 54eeb24..97020a6 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"إعدادات الاتصال"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"لا يمكن تغيير إعدادات المكالمات إلا بواسطة المستخدم الإداري."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"لا يمكن تغيير إعدادات حساب الهاتف إلا من قِبل المشرف أو مستخدم حساب العمل."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"حظر مالك الجهاز إمكانية تغيير إعدادات شبكة الجوّال."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"ينبغي الخروج من وضع معاودة الاتصال بالطوارئ لإجراء مكالمة غير طارئة."</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\nتم إيقاف شبكة الجيل الثاني على هذا الجهاز، ما قد يؤثر في إمكانية الاتصال بالإنترنت. انتقِل إلى \"الإعدادات\" وفعِّل خيار \"السماح بشبكة الجيل الثاني\" للمتابعة."</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\nتم إيقاف شبكة الجيل الثاني على هذا الجهاز، ما قد يؤثر في إمكانية الاتصال بالإنترنت. انتقِل إلى \"الإعدادات\" وفعِّل خيار \"السماح بشبكة الجيل الثاني\" للمتابعة."</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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"يتعذر وضع المكالمات قيد الانتظار."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"اتصل بشبكة لاسلكية لإجراء مكالمة."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"‏يمكنك تفعيل اتصال Wi-Fi لإجراء مكالمة."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"يجب إيقاف وضع القمر الصناعي لإجراء مكالمة."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"لإجراء مكالمة، عليك أولاً إنهاء اتصال القمر الصناعي."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"‏يمكنك إرسال الرسائل واستلامها بدون شبكة الجوّال أو شبكة Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"معلومات الطوارئ"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"المالك"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"انقر مجددًا لعرض المعلومات."</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‏ضبط شريحة eSIM القابلة للإزالة كشريحة تلقائية"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"طاقة اللاسلكي للجوّال"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"محاكاة الخطأ \"خارج الخدمة\" (الإصدار المخصص لتصحيح الأخطاء فقط)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"وضع القمر الصناعي التجريبي لمشغّل شبكة الجوّال (إصدار مخصّص لتصحيح الأخطاء فقط)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"‏اختبار وضع القمر الصناعي الحقيقي لنظام eSOS (إصدار مخصّص لتصحيح الأخطاء فقط)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‏عرض دفتر عناوين SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"عرض أرقام الطلب الثابت"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"عرض أرقام طلب الخدمة"</string>
@@ -929,6 +935,6 @@
     <string name="send_from_work_profile_title" msgid="7044759579507604732">"لا يمكن إرسال رسائل من تطبيق شخصي"</string>
     <string name="send_from_work_profile_description" msgid="2174402508727161974">"تسمح لك مؤسستك بإرسال الرسائل من تطبيقات العمل فقط."</string>
     <string name="send_from_work_profile_cancel" msgid="177746511030381711">"إلغاء"</string>
-    <string name="send_from_work_profile_action_str" msgid="6892775562934243337">"التبديل إلى الملف الشخصي للعمل"</string>
+    <string name="send_from_work_profile_action_str" msgid="6892775562934243337">"التبديل إلى ملف العمل"</string>
     <string name="install_messages_on_work_profile_action_str" msgid="3773440996395152903">"تثبيت تطبيق لرسائل العمل"</string>
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index b68f32b..987d5dd 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"কল ছেটিংসমূহ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"কেৱল প্ৰশাসকে কল ছেটিংসমূহ সলনি কৰিব পাৰে।"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ফ’ন একাউণ্টৰ ছেটিং কেৱল প্ৰশাসক অথবা কৰ্মস্থানৰ ব্যৱহাৰকাৰীয়েহে সলনি কৰিব পাৰে।"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ডিভাইচৰ গৰাকীয়ে ম’বাইল নেটৱৰ্কৰ ছেটিং সলনি কৰাৰ ক্ষমতা সীমিত কৰিছে।"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"সাধাৰণ কল কৰিবৰ কাৰণে জৰুৰীকালীন কলবেক ম\'ডৰ পৰা বাহিৰ হওক।"</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\nএই ডিভাইচটোত 2G অক্ষম কৰা হৈছে, যিটোৱে আপোনাৰ সংযোগত প্ৰভাৱ পেলাব পাৰে। অব্যাহত ৰাখিবলৈ ছেটিঙলৈ গৈ 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\nএই ডিভাইচটোত 2G অক্ষম কৰা হৈছে, যিটোৱে আপোনাৰ সংযোগত প্ৰভাৱ পেলাব পাৰে। অব্যাহত ৰাখিবলৈ ছেটিঙলৈ গৈ 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"কলসমূহ হ\'ল্ডত ৰাখিব নোৱাৰি।"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"কল কৰিবলৈ কোনো বেতাঁৰ নেটৱৰ্কৰ সৈতে সংযোগ কৰক।"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"কল কৰিবৰ কাৰণে ৱাই-ফাই কলিং সুবিধা সক্ষম কৰক।"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"কল কৰিবলৈ উপগ্ৰহ ম’ডটো অক্ষম কৰক।"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"কল কৰিবলৈ, প্ৰথমে উপগ্ৰহৰ সংযোগ বন্ধ কৰক।"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"আপুনি কোনো ম’বাইল বা ৱাই-ফাই নেটৱৰ্ক নোহোৱাকৈ বাৰ্তা পঠিয়াব আৰু লাভ কৰিব পাৰে।"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"জৰুৰীকালীন তথ্য"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"গৰাকী"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"তথ্য চাবলৈ পুনৰ টিপক"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"আঁতৰাব পৰা ই-ছিম ডিফ’ল্ট হিচাপে ছেট কৰক"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ম’বাইলৰ ৰেডিঅ’ পাৱাৰ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"সেৱাত নাই ছিমুলে’ট কৰক (কেৱল ডিবাগ বিল্ড)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"নকল বাহক উপগ্ৰহ ম’ড (কেৱল ডিবাগ বিল্ড)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"বাস্তৱিক উপগ্ৰহৰ eSOS ম’ড পৰীক্ষা কৰক (কেৱল ডিবাগ বিল্ড)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ছিম ঠিকনা সূচী চাওক"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ফিক্সড্ ডায়েলিং নম্বৰসমূহ চাওক"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"সেৱা ডায়েলিং নম্বৰসমূহ চাওক"</string>
@@ -895,7 +901,7 @@
     <string name="radio_info_voice_network_type_label" msgid="2395347336419593265">"ভইচ নেটৱৰ্কৰ প্ৰকাৰ:"</string>
     <string name="radio_info_data_network_type_label" msgid="8886597029237501929">"ডেটা নেটৱৰ্কৰ প্ৰকাৰ:"</string>
     <string name="radio_info_override_network_type_label" msgid="4176280017221092005">"নেটৱৰ্ক প্ৰকাৰ অ’ভাৰৰাইড কৰক:"</string>
-    <string name="radio_info_voice_raw_registration_state_label" msgid="2822988327145825128">"কণ্ঠস্বৰৰ অসম্পাদিত পঞ্জীয়নৰ স্থিতি:"</string>
+    <string name="radio_info_voice_raw_registration_state_label" msgid="2822988327145825128">"ভইচৰ অসম্পাদিত পঞ্জীয়নৰ স্থিতি:"</string>
     <string name="radio_info_data_raw_registration_state_label" msgid="2895895513822604539">"ডেটাৰ অসম্পাদিত পঞ্জীয়নৰ স্থিতি:"</string>
     <string name="radio_info_wlan_data_raw_registration_state_label" msgid="6396894835757296612">"WLAN ডেটাৰ অসম্পাদিত পঞ্জীয়নৰ স্থিতি:"</string>
     <string name="phone_index_label" msgid="6222406512768964268">"ফ’নৰ ইনডেক্স বাছনি কৰক"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 38a8f9f..5e925a5 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Zəng ayarları"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Zəng parametrləri yalnız admin olan istifadəçi tərəfindən dəyişdirilə bilər."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Telefon hesabı ayarlarını yalnız admin və ya işçi dəyişə bilər."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Cihaz sahibi mobil şəbəkə ayarlarını dəyişmək imkanını məhdudlaşdırıb."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Ayarlar ( <xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g> )"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Zəng parametrləri xətası"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Oxuma ayarları..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Qeyri-fövqəladə zəng etmək üçün fövqəladə zəng rejimindən çıxın."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Şəbəkədə qeydə alınmayıb."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobil şəbəkə əlçatımlı deyil."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobil şəbəkə əlçatan deyil.\n\nZəng etmək üçün simsiz şəbəkəyə qoşulun.\n\nBu cihazda 2G deaktiv edilib, bu da bağlantınıza təsir edə bilər. Davam etmək üçün Ayarlara keçib \"2G-yə icazə verin\" seçimini aktiv edin."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobil şəbəkə əlçatmazdır. Zəng etmək üçün Wi-Fi şəbəkəsinə qoşulun."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobil şəbəkə əlçatan deyil.\n\nZəng etmək üçün simsiz şəbəkəyə qoşulun.\n\nBu cihazda 2G deaktiv edilib, bu da bağlantınıza təsir edə bilər. Davam etmək üçün Ayarlara keçib \"2G-yə icazə verin\" seçimini aktiv edin."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Zəngi yerləşdirmək üçün düzgün nömrə daxil edin."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Zəng alınmadı."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Hazırda zəngi əlavə etmək mümkün deyil. Mesaj göndərərək təkrar əlaqə saxlaya bilərsiniz."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Zənglər saxlanıla bilməz."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Zəng etmək üçün Wi-Fi şəbəkəsinə qoşulun."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Zəng etmək üçün Wi-Fi zəngini dəyişdirin."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Zəng etmək üçün peyk rejimini deaktiv edin."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Zəng etmək üçün əvvəlcə peyk bağlantısını sonlandırın."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Mobil və ya Wi-Fi şəbəkəsi olmadan mesaj göndərə və ala bilərsiniz."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Təcili məlumat"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Sahib"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Məlumata baxmaq üçün yenidən klikləyin"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Çıxarıla bilən eSIM\'i Defolt olaraq təyin edin"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobil Radio Enerjisi"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"Xidmətdənkənar\" Simulyasiyası (yalnız Debaq Versiyası)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Sınaq Daşıyıcı Peyk Rejimi (yalnız sazlama versiyası)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Real peyk eSOS rejimini sınaqdan keçirin (yalnız sazlama versiyası)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM Ünvan Kitabçasına Baxın"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Sabit Yığım Nömrələrinə Baxın"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Xidmət Yığım Nömrələrinə Baxın"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 69a0f7b..bd20dfa 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Podešavanja poziva"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Samo korisniku sa administratorskim pravima je dozvoljeno da menja podešavanja poziva."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Podešavanja naloga telefona može da promeni samo administrator ili poslovni korisnik."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Vlasnik uređaja je ograničio mogućnost promene podešavanja mobilne mreže."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Podešavanja (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Greška u podešavanjima poziva"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Podešavanja se učitavaju…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Izađite iz režima hitnog povratnog poziva da biste uputili poziv koji nije hitan."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Nije registrovano na mreži."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilna mreža nije dostupna."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilna mreža nije dostupna.\n\nPovežite se na bežičnu mrežu da biste uputili poziv.\n\n2G je onemogućen na ovom uređaju, što može da utiče na povezivanje. Idite u Podešavanja i omogućite opciju Dozvoli 2G da biste nastavili."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilna mreža nije dostupna. Povežite se na bežičnu da biste uputili poziv."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilna mreža nije dostupna.\n\nPovežite se na bežičnu mrežu da biste uputili poziv.\n\n2G je onemogućen na ovom uređaju, što može da utiče na povezivanje. Idite u Podešavanja i omogućite opciju Dozvoli 2G da biste nastavili."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Da biste uputili poziv, unesite važeći broj."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Poziv nije uspeo."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Dodavanje poziva trenutno nije moguće. Možete da pokušate da ostvarite kontakt pomoću poruke."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Nije moguće stavljati pozive na čekanje."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Povežite se na bežičnu mrežu da biste uputili poziv."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Omogućite pozivanje preko WiFi-a da biste uputili poziv."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Onemogućite satelitski režim da biste uputili poziv."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Da biste uputili poziv, prvo završite satelitsku vezu."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Možete da šaljete i primate poruke bez mobilne ili WiFi mreže."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informacije za hitne slučajeve"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Vlasnik"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Dodirnite ponovo da biste videli informacije"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Podesi prenosivi eSIM kao podrazumevani"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Napajanje za radio na mobilnim uređajima"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija ne funkcioniše (samo verzija sa otklonjenim greškama)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni režim mobilnog operatera za slanje preko satelita (samo verzija za otklanjanje grešaka)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testirajte stvarni satelitski eSOS režim (samo verzija sa otklonjenim greškama)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži adresar SIM-a"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Prikaži brojeve za fiksno biranje"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Prikaži brojeve za servisno biranje"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 0f7f46a..5e1a28e 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Налады выклікаў"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Налады выклікаў можа мяняць толькі адміністратар."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Налады ўліковага запісу на тэлефоне можа мяняць толькі адміністратар ці карыстальнік працоўнага профілю."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Уладальнік прылады забараніў змяняць налады мабільнай сеткі."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Каб зрабіць звычайны выклік, выйдзіце з рэжыму экстранных зваротных выклікаў."</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\nНа гэтай прыладзе адключана перадача даных у рэжыме 2G, што можа ўплываць на магчымасць падключэння. Каб працягнуць, перайдзіце ў налады і ўключыце параметр \"Дазволіць 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\nНа гэтай прыладзе адключана перадача даных у рэжыме 2G, што можа ўплываць на магчымасць падключэння. Каб працягнуць, перайдзіце ў налады і ўключыце параметр \"Дазволіць 2G\"."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Каб зрабіць выклік, увядзіце сапраўдны нумар."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Збой выклiку."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Немагчыма зараз дадаць выклік. Можна выйсці на сувязь, адправіўшы паведамленне."</string>
@@ -551,13 +554,14 @@
     <string name="incall_error_supp_service_resume" msgid="1276861499306817035">"Не ўдалося ўзнавіць выклік."</string>
     <string name="incall_error_supp_service_separate" msgid="8932660028965274353">"Немагчыма аддзяліць выклік."</string>
     <string name="incall_error_supp_service_transfer" msgid="8211925891867334323">"Немагчыма перадаць выклік."</string>
-    <string name="incall_error_supp_service_conference" msgid="27578082433544702">"Не ўдалося аб\'яднаць выклікі."</string>
+    <string name="incall_error_supp_service_conference" msgid="27578082433544702">"Не ўдалося аб’яднаць выклікі."</string>
     <string name="incall_error_supp_service_reject" msgid="3044363092441655912">"Немагчыма адхіліць выклік."</string>
     <string name="incall_error_supp_service_hangup" msgid="836524952243836735">"Немагчыма скончыць выклік(і)."</string>
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Немагчыма ўтрымліваць выклікі."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Падлучыцеся да бесправадной сеткі, каб зрабіць выклік."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Дазволіць выклік па Wi-Fi-тэлефаніі."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Адключыце рэжым спадарожніка, каб зрабіць выклік."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Каб зрабіць выклік, завяршыце спадарожнікавае падключэнне."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Вы можаце адпраўляць і атрымліваць паведамленні без доступу да мабільнай сеткі або Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Даныя для экстранных сітуацый"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Уладальнік"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Каб паглядзець інфармацыю, націсніце яшчэ раз"</string>
@@ -568,7 +572,7 @@
     <string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"Уключэнне радыё..."</string>
     <string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"Не абслугоўваецца. Паўтор спробы..."</string>
     <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"Немагчыма ўвайсцi ў рэжым палёту падчас экстранага выклiку"</string>
-    <string name="dial_emergency_error" msgid="825822413209026039">"Выклік немагчымы. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не з\'яўляецца нумарам экстраннай службы."</string>
+    <string name="dial_emergency_error" msgid="825822413209026039">"Выклік немагчымы. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не з’яўляецца нумарам экстраннай службы."</string>
     <string name="dial_emergency_empty_error" msgid="2785803395047793634">"Выклік немагчымы. Набраць нумар экстраннай службы."</string>
     <string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"Экстранныя выклікі недаступныя"</string>
     <string name="pin_puk_system_user_only" msgid="1045147220686867922">"Толькі ўладальнік прылады можа ўводзіць PIN-код ці PUK-код."</string>
@@ -582,7 +586,7 @@
     <string name="onscreenShowDialpadText" msgid="658465753816164079">"Кнопкі набору"</string>
     <string name="onscreenMuteText" msgid="5470306116733843621">"Выключыць гук"</string>
     <string name="onscreenAddCallText" msgid="9075675082903611677">"Дадаць выклік"</string>
-    <string name="onscreenMergeCallsText" msgid="3692389519611225407">"Аб\'яднаць выклікі"</string>
+    <string name="onscreenMergeCallsText" msgid="3692389519611225407">"Аб’яднаць выклікі"</string>
     <string name="onscreenSwapCallsText" msgid="2682542150803377991">"Пераключыць"</string>
     <string name="onscreenManageCallsText" msgid="1162047856081836469">"Кіраваць выклікамі"</string>
     <string name="onscreenManageConferenceText" msgid="4700574060601755137">"Кірав. канферэнцыяй"</string>
@@ -820,7 +824,7 @@
     <string name="callFailed_already_dialing" msgid="7250591188960691086">"Немагчыма зрабіць выклік, паколькі зараз ідзе выходны выклік."</string>
     <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="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">"Уключыце перадачу мабільных даных на SIM-карце <xliff:g id="SIM_NUMBER">%2$d</xliff:g> для выкарыстання сэрвісу <xliff:g id="SUPP_SERVICE">%1$s</xliff:g>. Гэта можна зрабіць у наладах мабільнай сеткі."</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Зрабіць здымную eSIM-карту стандартнай"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Магутнасць радыёсігналу"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Мадэляванне знаходжання па-за сеткай (толькі ў зборцы для адладкі)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Імітацыя рэжыму спадарожніка з SIM-картай ад аператара (толькі ў зборцы для адладкі)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Тэсціраванне рэальнага рэжыму спадарожнікавага падключэння eSOS (толькі ў зборцы для адладкі)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Праглядзець адрасную кнігу на SIM-карце"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Прагляд фіксаваных нумароў"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Паглядзець сэрвісныя нумары"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 97f086f..fb7264e 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Настройки за обаждане"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Само администраторът може да променя настройките за обаждане."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Настройките на профилите в телефона могат да се променят само от администратора или служебния потребител."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Собственикът на устройството е ограничил възможността за промяна на настройките за мобилната мрежа."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Излезте от режима на обратно обаждане при спешност, за да можете да извършвате обаждания, които не са спешни."</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\nУслугата 2G е деактивирана на това устройство, което може да влияе на свързаността ви. За да продължите, отворете настройките и активирайте „Разрешаване на 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\nУслугата 2G е деактивирана на това устройство, което може да влияе на свързаността ви. За да продължите, отворете настройките и активирайте „Разрешаване на 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Не може да се извършват обаждания."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Свържете се с безжична мрежа, за да осъществите обаждане."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"За да извършите обаждане, активирайте обажданията през Wi-Fi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Деактивирайте сателитния режим, за да извършите обаждане."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"За да извършите обаждане, първо прекратете сателитната връзка."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Можете да изпращате и получавате съобщения без мобилна или Wi-Fi мрежа."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Информация за спешни случаи"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Собственик"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Докоснете отново, за да видите информация"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Задаване на електронната SIM карта с изваждащ се чип като основна"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мощност на мобилното радио"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Симулиране на липса на услуга (само в компилацията за отстраняване на грешки)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Симулиран сателитен режим от оператора (само в компилацията за отстраняване на грешки)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Тестване на режим на истински сателитен eSOS (само в компилацията за отстраняване на грешки)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Преглед на указателя на SIM картата"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Преглед на номера за фиксирано набиране"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Преглед на номера за набиране на услуги"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index f1fefbc..8f47094 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"কল সেটিংস"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"কেবলমাত্র প্রশাসক ব্যবহারকারী কল সেটিংস পরিবর্তন করতে পারবেন৷"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"শুধুমাত্র অ্যাডমিন বা অফিস প্রোফাইল ব্যবহারকারী ফোনের অ্যাকাউন্ট সেটিংস পরিবর্তন করতে পারবেন।"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ডিভাইসের মালিক, মোবাইল নেটওয়ার্ক সেটিংস পরিবর্তন করার সুবিধা সীমাবদ্ধ করে রেখেছেন।"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"একটি সাধারণ কল করতে জরুরি কলব্যাক মোডের বাইরে আসুন৷"</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\nএই ডিভাইসে 2G পরিষেবা বন্ধ করে দেওয়া হয়েছে, যার ফলে হয়ত আপনার কানেক্টিভিটি প্রভাবিত হচ্ছে। সেটিংসে যান এবং চালিয়ে যেতে \'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\nএই ডিভাইসে 2G পরিষেবা বন্ধ করে দেওয়া হয়েছে, যার ফলে হয়ত আপনার কানেক্টিভিটি প্রভাবিত হচ্ছে। সেটিংসে যান এবং চালিয়ে যেতে \'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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"কলগুলি ধরে রাখা যাবে না।"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"একটি কল করতে কোনো ওয়্যারলেস নেটওয়ার্কে সংযোগ করুন৷"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"কোনো কল করতে Wi-Fi কলিং সক্ষম করুন৷"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"কল করার জন্য \'উপগ্রহ\' মোড বন্ধ করুন।"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"কল করতে, প্রথমে স্যাটেলাইট কানেকশন বন্ধ করুন।"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"আপনি কোনও মেবাইল বা ওয়াই-ফাই নেটওয়ার্ক ছাড়াই মেসেজ পাঠাতে ও পেতে পারবেন।"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"জরুরি তথ্য"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"মালিক"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"তথ্য দেখার জন্য আবার ট্যাপ করুন"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"সরিয়ে দেওয়া যায় এমন eSIM ডিফল্ট হিসেবে সেট করুন"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"মোবাইল রেডিওর গুণমান"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"আউট-অফ-সার্ভিস সিমুলেট করা (শুধুমাত্র ডিবাগ বিল্ডের জন্য)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"নকল পরিষেবা প্রদানকারী উপগ্রহ মোড (শুধুমাত্র ডিবাগ বিল্ড)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"রিয়েল স্যাটেলাইট eSOS মোড পরীক্ষা করুন (শুধুমাত্র ডিবাগ বিল্ড)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"সিম অ্যাড্রেস বুক দেখুন"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"স্থায়ী ডায়াল নম্বরগুলি দেখুন"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"সার্ভিস ডায়াল নম্বরগুলি দেখুন"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 992f1b2..2fd44d8 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Postavke poziva"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Postavke poziva može promijeniti samo administrator."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Postavke računa na telefonu može promijeniti samo administrator ili poslovni korisnik."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Vlasnik uređaja je ograničio mogućnost promjene postavki mobilne mreže."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Postavke (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Greška u postavkama poziva"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Čitanje postavki…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Izađite iz načina rada za hitni povratni poziv da uputite poziv koji nije hitan."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Nije registrirano na mreži."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilna mreža nije dostupna."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilna mreža nije dostupna.\n\nPovežite se s bežičnom mrežom da uputite poziv.\n\n2G je onemogućen na uređaju, što može uticati na povezivost. Da nastavite, idite u Postavke i omogućite Dozvoli 2G."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilna mreža nije dostupna. Povežite se na bežičnu mrežu da pozovete."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilna mreža nije dostupna.\n\nPovežite se s bežičnom mrežom da uputite poziv.\n\n2G je onemogućen na uređaju, što može uticati na povezivost. Da nastavite, idite u Postavke i omogućite Dozvoli 2G."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Da uputite poziv, upišite važeći broj."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Poziv nije uspio."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Trenutno nije moguće dodati poziv. Možete pokušati poslati poruku."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Nije moguće staviti pozive na čekanje."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Povežite se na bežičnu mrežu da pozovete."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Omogućite pozivanje putem WiFi-ja da pozovete."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Onemogućite način rada putem satelita da uputite poziv."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Da uputite poziv, prvo završite satelitsku vezu."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Možete slati i primati poruke bez mobilne ili WiFi mreže."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informacije za hitne slučajeve"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Vlasnik"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Dodirnite ponovo da pogledate informacije"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Postavljanje uklonjive eSim kartice kao zadane"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Snaga mobilnog radija"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija ne radi (samo verzija za otklanjanje grešaka)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni način rada operatera za slanje putem satelita (samo verzija za otklanjanje grešaka)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testiraj stvarni način rada satelitskog eSOS-a (samo verzija za otklanjanje grešaka)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži SIM adresar"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Prikaži brojeve fiksnog biranja"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Prikaži brojeve biranja usluga"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6557918..e351f02 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Configuració de trucada"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Només l\'administrador pot canviar la configuració de trucades."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Només l\'administrador o l\'usuari de la feina pot canviar la configuració del compte del telèfon."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"El propietari del dispositiu ha restringit la possibilitat de canviar la configuració de la xarxa mòbil."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Configuració (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Error de configuració de trucada"</string>
     <string name="reading_settings" msgid="1605904432450871183">"S\'està llegint la configuració…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Surt del mode de devolució de trucada d\'emergència per fer un altre tipus de trucada."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"No registrat a la xarxa."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"La xarxa mòbil no està disponible."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"La xarxa mòbil no està disponible.\n\nConnecta\'t a una xarxa sense fil per fer una trucada.\n\nEl 2G està desactivat en aquest dispositiu, cosa que pot afectar la connectivitat. Ves a Configuració i activa Permet 2G per continuar."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"La xarxa mòbil no està disponible. Per fer una trucada, connecta\'t a una xarxa sense fil."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"La xarxa mòbil no està disponible.\n\nConnecta\'t a una xarxa sense fil per fer una trucada.\n\nEl 2G està desactivat en aquest dispositiu, cosa que pot afectar la connectivitat. Ves a Configuració i activa Permet 2G per continuar."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Per realitzar una trucada, introdueix un número vàlid."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"No s\'ha pogut fer la trucada."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"En aquest moment no es pot afegir la trucada. Prova d\'enviar un missatge."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"No es poden posar les trucades en espera."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Per fer una trucada, connecta amb una xarxa sense fil."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Activa les trucades per Wi-Fi per fer una trucada."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Per fer una trucada, desactiva el mode de satèl·lit."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Per fer una trucada, primer finalitza la connexió per satèl·lit."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Pots enviar i rebre missatges sense una xarxa mòbil o Wi‑Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informació d\'emergència"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propietari"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Torna a tocar per veure la informació"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Defineix l\'eSIM extraïble com a opció predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potència del senyal mòbil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simula que està fora de servei (només per a la compilació de depuració)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mode de satèl·lit d\'un operador de telefonia mòbil simulat (només per a la compilació de depuració)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Provar el mode eSOS de satèl·lit real (només per a la compilació de depuració)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Mostra la llibreta d\'adreces de la SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Mostra els números de marcatge fix"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Mostra els números de marcatge de serveis"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 597d6c5..5b76b8f 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Nastavení hovorů"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Nastavení hovorů může změnit pouze uživatel s oprávněním administrátora."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Nastavení telefonního účtu může změnit jen administrátor nebo uživatel pracovního účtu."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Vlastník zařízení omezil možnost změnit nastavení mobilní sítě."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Nastavení (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Chyba nastavení hovorů"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Načítání nastavení..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Chcete-li uskutečnit běžný hovor, opusťte režim tísňového volání."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Přihlášení k síti nebylo úspěšné."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilní síť je nedostupná."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilní síť není k dispozici.\n\nAbyste mohli uskutečnit hovor, připojte se k bezdrátové síti.\n\nV tomto zařízení není aktivní připojení 2G, což může ovlivňovat možnosti připojení. Přejděte do nastavení a zapněte volbu Povolit 2G."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilní síť není k dispozici. Pokud chcete provést hovor, připojte se k bezdrátové síti."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilní síť není k dispozici.\n\nAbyste mohli uskutečnit hovor, připojte se k bezdrátové síti.\n\nV tomto zařízení není aktivní připojení 2G, což může ovlivňovat možnosti připojení. Přejděte do nastavení a zapněte volbu Povolit 2G."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Chcete-li uskutečnit hovor, zadejte platné telefonní číslo."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Volání se nezdařilo."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Hovor momentálně není možné přidat. Můžete místo toho zkusit poslat zprávu."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Hovory nelze podržet."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Chcete-li provést hovor, připojte se k bezdrátové síti."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Pokud chcete provést hovor, povolte volání přes připojení Wi-Fi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Pokud chcete někomu zavolat, satelitní režim vypněte."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Pokud chcete někomu zavolat, nejdřív ukončete satelitní připojení."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Zprávy můžete odesílat a přijímat bez mobilní sítě nebo sítě Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Nouzové informace"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Vlastník"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Údaje zobrazíte dalším klepnutím"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nastavit vyjímatelnou eSIM jako výchozí"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Výkon mobilního přijímače"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulovat provoz mimo službu (pouze ladicí sestavení)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulace satelitního režimu operátora (pouze ladicí sestavení)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Otestovat reálný režim nouzových zpráv přes satelit (pouze ladicí sestavení)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Zobrazit adresář SIM karty"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Zobrazit povolená telefonní čísla"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Zobrazit čísla volání služeb"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 801eb12..d73bc19 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Indstillinger for opkald"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Opkaldsindstillingerne kan kun ændres af administratorbrugeren."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Telefons kontoindstillinger kan kun ændres af en administrator eller arbejdsbruger."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Enhedsejeren har begrænset muligheden for at ændre indstillinger for mobilnetværk."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Indstillinger (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Fejl i indstillinger for opkald"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Læser indstillinger ..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Afslut nødtilbagekaldstilstand for at foretage et almindeligt opkald."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ikke registreret på netværk."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilnetværket er ikke tilgængeligt."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilnetværk er ikke tilgængeligt.\n\nOpret forbindelse til et trådløst netværk for at foretage et opkald.\n\n2G er deaktiveret på denne enhed, hvilket kan påvirke dine forbindelsesmuligheder. Gå til Indstillinger, og aktivér Tillad 2G for at fortsætte."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilnetværk er ikke tilgængeligt. Opret forbindelse til et trådløst netværk for at foretage et opkald."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilnetværk er ikke tilgængeligt.\n\nOpret forbindelse til et trådløst netværk for at foretage et opkald.\n\n2G er deaktiveret på denne enhed, hvilket kan påvirke dine forbindelsesmuligheder. Gå til Indstillinger, og aktivér Tillad 2G for at fortsætte."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Angiv et gyldigt nummer for at foretage et opkald."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Opkald mislykkedes."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Opkaldet kan ikke tilføjes lige nu. Du kan prøve at sende en besked i stedet."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Opkald kan ikke sættes i venteposition."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Opret forbindelse til et trådløst netværk for at foretage et opkald."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktivér Wi-Fi-opkald for at foretage et opkald."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Deaktiver satellit for at foretage et opkald."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Hvis du vil foretage et opkald, skal du først afslutte satellitforbindelsen."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Du kan sende og modtage beskeder uden et mobil- eller Wi-Fi-netværk."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Nødoplysninger"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Ejer"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tryk igen for at se oplysninger"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Konfigurer eSIM, der kan fjernes, som standard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobilsendestyrke"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulering af enhed, der er ude af drift (kun i fejlretningsbuild)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Test af satellittilstand via mobilselskab (kun fejlretningsbuild)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Test af virkelig eSOS-satellittilstand (kun fejlretningsbuild)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Vis adressebog på SIM-kortet"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Vis numre til begrænset opkald"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Vis tjenestens faste opkaldsnumre"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 7378480..9c50dd7 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Anrufeinstellungen"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Anrufeinstellungen können nur vom Administrator geändert werden."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Die Kontoeinstellungen können nur durch den Administrator oder den Nutzer des Arbeitsprofils geändert werden."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Der Eigentümer des Geräts hat die Möglichkeit zum Ändern der Einstellungen für Mobilfunknetze eingeschränkt."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Einstellungen (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Fehler bei Anrufeinstellungen"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Einstellungen werden gelesen…"</string>
@@ -191,7 +192,7 @@
     <string name="preferred_network_mode_summary" msgid="3787989000044330064">"Netzwerkbetriebsmodus ändern"</string>
     <string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"Bevorzugter Netzwerktyp"</string>
     <string name="forbidden_network" msgid="5081729819561333023">"(nicht zulässig)"</string>
-    <string name="choose_network_title" msgid="5335832663422653082">"Netzwerk auswählen"</string>
+    <string name="choose_network_title" msgid="5335832663422653082">"Netz auswählen"</string>
     <string name="network_disconnected" msgid="8844141106841160825">"Nicht verbunden"</string>
     <string name="network_connected" msgid="2760235679963580224">"Verbunden"</string>
     <string name="network_connecting" msgid="160901383582774987">"Verbindung wird hergestellt..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Beende den Notfallrückrufmodus, um einen Anruf zu tätigen, bei dem es sich nicht um einen Notfall handelt."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Nicht in Netzwerk registriert."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilfunknetz ist nicht verfügbar."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilfunknetz nicht verfügbar.\n\nStelle eine Verbindung zu einem drahtlosen Netzwerk her, um zu telefonieren.\n\n2G ist auf diesem Gerät deaktiviert. Dies kann deine Verbindung beeinträchtigen. Gehe zu den Einstellungen und aktiviere „2G zulassen“, um fortzufahren."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Es ist kein Mobilfunknetz verfügbar. Stelle zum Telefonieren eine WLAN-Verbindung her."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilfunknetz nicht verfügbar.\n\nStelle eine Verbindung zu einem drahtlosen Netzwerk her, um zu telefonieren.\n\n2G ist auf diesem Gerät deaktiviert. Dies kann deine Verbindung beeinträchtigen. Gehe zu den Einstellungen und aktiviere „2G zulassen“, um fortzufahren."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Gib eine gültige Nummer ein."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Fehler beim Anruf."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Der Anruf kann momentan nicht hinzugefügt werden. Versuche stattdessen, eine Nachricht zu senden."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Anrufe können nicht gehalten werden."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Stelle zum Telefonieren eine WLAN-Verbindung her."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktiviere WLAN-Telefonie, um anzurufen."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Deaktiviere den Satellitenmodus, um einen Anruf zu tätigen."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Um einen Anruf zu tätigen, musst du zuerst die Satellitenverbindung beenden."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Du kannst Nachrichten ohne Mobilfunknetz oder WLAN senden und empfangen."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Notfallinformationen"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Eigentümer"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Noch einmal tippen, um Informationen anzuzeigen"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Wechsel-eSIM als Standard festlegen"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobilfunkstärke"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"„Außer Betrieb“ simulieren (nur Debug-Build)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Vom Mobilfunkanbieter simulierter Satellitenmodus (nur Debug-Build)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"eSOS-Modus mit echtem Satelliten testen (nur Debug-Build)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM-Adressbuch anzeigen"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Rufnummernbeschränkung ansehen"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Servicerufnummern anzeigen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 875ae61..cf33306 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Ρυθμίσεις κλήσης"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Οι ρυθμίσεις κλήσεων μπορούν να αλλάξουν μόνο από τον χρήστη που έχει ρόλο διαχειριστή."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Οι ρυθμίσεις λογαριασμού του τηλεφώνου μπορούν να αλλάξουν μόνο από τον διαχειριστή ή τον χρήστη του προφίλ εργασίας."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Ο κάτοχος της συσκευής έχει περιορίσει τη δυνατότητα αλλαγής των ρυθμίσεων δικτύου κινητής τηλεφωνίας."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Πραγματοποιήστε έξοδο από τη λειτουργία επιστροφής κλήσης έκτακτης ανάγκης για να πραγματοποιήσετε μια κλήση μη έκτακτης ανάγκης."</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\nΤο 2G είναι απενεργοποιημένο σε αυτή τη συσκευή και αυτό ενδέχεται να επηρεάζει τη σύνδεσή σας. Μεταβείτε στις Ρυθμίσεις και ενεργοποιήστε το στοιχείο Να επιτρέπεται το 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\nΤο δίκτυο 2G είναι απενεργοποιημένο σε αυτή τη συσκευή και αυτό ενδέχεται να επηρεάζει τη σύνδεσή σας. Μεταβείτε στις Ρυθμίσεις και ενεργοποιήστε το στοιχείο Να επιτρέπεται το 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Δεν είναι δυνατή η αναμονή κλήσεων."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Συνδεθείτε σε ασύρματο δίκτυο για να πραγματοποιήσετε μια κλήση."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Ενεργοποιήστε τη δυνατότητα κλήσεων μέσω Wi-Fi για να πραγματοποιήσετε μια κλήση."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Απενεργοποιήστε τη λειτουργία δορυφόρου για να πραγματοποιήσετε μια κλήση."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Για να πραγματοποιήσετε μια κλήση, τερματίστε πρώτα τη δορυφορική σύνδεση."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Μπορείτε να στέλνετε και να λαμβάνετε μηνύματα χωρίς δίκτυο κινητής τηλεφωνίας ή Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Πληροφορίες έκτακτης ανάγκης"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Κάτοχος"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Πατήστε ξανά για προβολή πληροφοριών"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ορισμός αφαιρούμενης eSIM ως προεπιλεγμένης"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Ισχύς πομπού κινητής τηλεφωνίας"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Η προσομοίωση δεν λειτουργεί (μόνο έκδοση εντοπισμού σφαλμάτων)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Εικονική λειτουργία δορυφόρου εταιρείας κινητής τηλεφωνίας (μόνο έκδοση εντοπισμού σφαλμάτων)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Δοκιμή πραγματικής δορυφορικής λειτουργίας eSOS (μόνο έκδοση εντοπισμού σφαλμάτων)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Προβολή βιβλίου διευθύνσεων κάρτας SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Προβολή προκαθορισμένων αριθμών κλήσης"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Προβολή αριθμών κλήσης υπηρεσίας"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 9a7861f..13cd54b 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Call settings"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Call settings can only be changed by the admin user."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Phone account settings can only be changed by the admin or work user."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"The device owner has restricted the ability to change mobile network settings."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Call settings error"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Reading settings…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Exit emergency callback mode to make a non-emergency call."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Not registered on network."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobile network not available."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobile network not available.\n\nConnect to a wireless network to make a call.\n\n2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2G to continue."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobile network isn\'t available. Connect to a wireless network to make a call."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobile network is not available.\n\nConnect to a wireless network to make a call.\n\n2 G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2 G to continue."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"To place a call, enter a valid number."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Call failed."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Call cannot be added at this time. You can try to get in touch by sending a message."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Can\'t hold calls."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Connect to a wireless network to make a call."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Enable Wi-Fi calling to make a call."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Disable satellite mode to make a call."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"To make a call, first end the satellite connection."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"You can send and receive messages without a mobile or Wi-Fi network."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Emergency information"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Owner"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tap again to view info"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set removable eSIM as default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile radio power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate out of service (debug build only)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock operator satellite mode (debug build only)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (debug build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM address book"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"View fixed dialling numbers"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"View service dialling numbers"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 81942d0..9741778 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Call settings"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Call settings can only be changed by the admin user."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Phone account settings can only be changed by the admin or work user."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"The device owner has restricted the ability to change mobile network settings."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Call settings error"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Reading settings…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Exit emergency callback mode to make a non-emergency call."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Not registered on network."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobile network not available."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobile network not available.\n\nConnect to a wireless network to make a call.\n\n2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2G to continue."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobile network is not available. Connect to a wireless network to make a call."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobile network is not available.\n\nConnect to a wireless network to make a call.\n\n2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2G to continue."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"To place a call, enter a valid number."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Call failed."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Call cannot be added at this time. You can try to reach out by sending a message."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Can\'t hold calls."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Connect to a wireless network to make a call."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Enable Wi-Fi calling to make a call."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Disable satellite mode to make a call."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"To make a call, first end the satellite connection."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"You can send and receive messages without a mobile or Wi-Fi network."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Emergency information"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Owner"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tap again to view info"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set Removable eSIM as Default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile Radio Power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate Out of Service (Debug Build only)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier Satellite Mode (Debug Build only)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (Debug Build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM Address Book"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"View Fixed Dialing Numbers"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"View Service Dialing Numbers"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 9a7861f..13cd54b 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Call settings"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Call settings can only be changed by the admin user."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Phone account settings can only be changed by the admin or work user."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"The device owner has restricted the ability to change mobile network settings."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Call settings error"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Reading settings…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Exit emergency callback mode to make a non-emergency call."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Not registered on network."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobile network not available."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobile network not available.\n\nConnect to a wireless network to make a call.\n\n2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2G to continue."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobile network isn\'t available. Connect to a wireless network to make a call."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobile network is not available.\n\nConnect to a wireless network to make a call.\n\n2 G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2 G to continue."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"To place a call, enter a valid number."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Call failed."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Call cannot be added at this time. You can try to get in touch by sending a message."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Can\'t hold calls."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Connect to a wireless network to make a call."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Enable Wi-Fi calling to make a call."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Disable satellite mode to make a call."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"To make a call, first end the satellite connection."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"You can send and receive messages without a mobile or Wi-Fi network."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Emergency information"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Owner"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tap again to view info"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set removable eSIM as default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile radio power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate out of service (debug build only)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock operator satellite mode (debug build only)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (debug build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM address book"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"View fixed dialling numbers"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"View service dialling numbers"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 9a7861f..13cd54b 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Call settings"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Call settings can only be changed by the admin user."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Phone account settings can only be changed by the admin or work user."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"The device owner has restricted the ability to change mobile network settings."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Settings (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Call settings error"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Reading settings…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Exit emergency callback mode to make a non-emergency call."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Not registered on network."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobile network not available."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobile network not available.\n\nConnect to a wireless network to make a call.\n\n2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2G to continue."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobile network isn\'t available. Connect to a wireless network to make a call."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobile network is not available.\n\nConnect to a wireless network to make a call.\n\n2 G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2 G to continue."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"To place a call, enter a valid number."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Call failed."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Call cannot be added at this time. You can try to get in touch by sending a message."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Can\'t hold calls."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Connect to a wireless network to make a call."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Enable Wi-Fi calling to make a call."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Disable satellite mode to make a call."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"To make a call, first end the satellite connection."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"You can send and receive messages without a mobile or Wi-Fi network."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Emergency information"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Owner"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tap again to view info"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Set removable eSIM as default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile radio power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulate out of service (debug build only)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock operator satellite mode (debug build only)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (debug build only)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"View SIM address book"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"View fixed dialling numbers"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"View service dialling numbers"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index d275cc4..f805a1e 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‎‏‎Call settings‎‏‎‎‏‎"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‎Call settings can only be changed by the admin user.‎‏‎‎‏‎"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‎‎Phone account settings can only be changed by the admin or work user.‎‏‎‎‏‎"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎The device owner has restricted the ability to change mobile network settings.‎‏‎‎‏‎"</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎Settings (‎‏‎‎‏‏‎<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‎‏‎Call settings error‎‏‎‎‏‎"</string>
     <string name="reading_settings" msgid="1605904432450871183">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎Reading settings…‎‏‎‎‏‎"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‎Exit emergency callback mode to make a non-emergency call.‎‏‎‎‏‎"</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‏‎‏‏‏‎‏‏‎‏‎Not registered on network.‎‏‎‎‏‎"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‎‏‎‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‎Mobile network not available.‎‏‎‎‏‎"</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‎‎‎Mobile network not available.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Connect to a wireless network to make a call.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2G to continue.‎‏‎‎‏‎"</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‏‎Mobile network is not available. Connect to a wireless network to make a call.‎‏‎‎‏‎"</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‏‏‎‎‏‏‏‏‎Mobile network is not available.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Connect to a wireless network to make a call.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable Allow 2G to continue.‎‏‎‎‏‎"</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‎To place a call, enter a valid number.‎‏‎‎‏‎"</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‏‎Call failed.‎‏‎‎‏‎"</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‏‏‏‏‏‎‎‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‏‎Call cannot be added at this time. You can try to reach out by sending a message.‎‏‎‎‏‎"</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‏‎Can\'t hold calls.‎‏‎‎‏‎"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‏‏‏‎‏‎‏‏‎‏‎Connect to a wireless network to make a call.‎‏‎‎‏‎"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‎‎‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‎Enable Wi-Fi calling to make a call.‎‏‎‎‏‎"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‎Disable satellite mode to make a call.‎‏‎‎‏‎"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎To make a call, first end the satellite connection.‎‏‎‎‏‎"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‎‎‏‎You can send and receive messages without a mobile or Wi-Fi network.‎‏‎‎‏‎"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‎‎‎‏‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‏‎‎‎Emergency information‎‏‎‎‏‎"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‎‎‎Owner‎‏‎‎‏‎"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‏‏‎‎‎‎‎‎‏‎‎Tap again to view info‎‏‎‎‏‎"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‎‎‎‏‎Set Removable eSIM as Default‎‏‎‎‏‎"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‏‏‎Mobile Radio Power‎‏‎‎‏‎"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎Simulate Out of Service (Debug Build only)‎‏‎‎‏‎"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎Mock Carrier Satellite Mode (Debug Build only)‎‏‎‎‏‎"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‎‎‏‎Test real satellite eSOS mode (Debug Build only)‎‏‎‎‏‎"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎View SIM Address Book‎‏‎‎‏‎"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‎‏‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎View Fixed Dialing Numbers‎‏‎‎‏‎"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‏‎‏‎‎‎‎‏‎‏‎‎View Service Dialing Numbers‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 2a25ded..27a4190 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Config. de llamada"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Solo el usuario administrador puede cambiar la configuración de llamadas."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Solo el administrador o usuario de trabajo puede cambiar la configuración de la cuenta telefónica."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"El propietario del dispositivo restringió la capacidad de cambiar la configuración de la red móvil."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Configuración (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Error de configuración de llamada"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Leyendo configuración..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Para realizar una llamada que no sea de emergencia, sal del modo de devolución de llamada de emergencia."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"No registrado en la red."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"La red móvil no está disponible."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"La red móvil no está disponible.\n\nConéctate a una red inalámbrica para realizar una llamada.\n\nLa conexión 2G está inhabilitada en este dispositivo, lo que podría afectar la conectividad. Ve a Configuración y habilita Permitir 2G para continuar."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"La red móvil no está disponible. Conéctate a una red inalámbrica para realizar una llamada."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"La red móvil no está disponible.\n\nConéctate a una red inalámbrica para realizar una llamada.\n\nLa conexión 2G está inhabilitada en este dispositivo, lo que podría afectar la conectividad. Ve a Configuración y habilita Permitir 2G para continuar."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Para realizar una llamada, ingresa un número válido."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Error en la llamada"</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"No se puede agregar la llamada en este momento. Para comunicarte, puedes enviar un mensaje."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"No es posible poner las llamadas en espera."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Conectarse a una red inalámbrica para hacer una llamada"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Habilita las llamadas con Wi-Fi para hacer una llamada."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Inhabilita el modo satelital para realizar una llamada."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Para realizar una llamada, primero finaliza la conexión satelital."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Puedes enviar y recibir mensajes incluso si no tienes conexión a una red móvil o Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Información de emergencia"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propietario"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Vuelve a presionar para ver la información"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Establecer eSIM extraíble como predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potencia de la señal móvil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular fuera de servicio (solo para la compilación de depuración)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Modo Satélite del operador de prueba (solo en la compilación de depuración)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Prueba el modo eSOS de satélite real (solo en la compilación de depuración)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver libreta de direcciones de SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ver números de marcación fija"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Ver números de marcación de servicio"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 26d5631..b1f0611 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Ajustes de llamadas"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"El administrador es el único usuario que puede cambiar los ajustes de llamada."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Solo el administrador o el usuario de trabajo pueden cambiar la configuración de la cuenta del teléfono."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"El propietario del dispositivo ha restringido la posibilidad de cambiar la configuración de la red móvil."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Ajustes (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Error de configuración de llamada"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Leyendo ajustes..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sal del modo de devolución de llamada de emergencia para hacer otro tipo de llamada."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"No se ha podido conectar a la red"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"La red móvil no está disponible."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"La red móvil no está disponible.\n\nConéctate a una red inalámbrica para hacer una llamada.\n\nEl 2G está inhabilitado en este dispositivo, lo que puede afectar a tu conectividad. Ve a Ajustes y habilita Permitir 2G para continuar."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"La red móvil no está disponible. Conéctate a una para llamar."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"La red móvil no está disponible.\n\nConéctate a una red inalámbrica para hacer una llamada.\n\nEl 2G está inhabilitado en este dispositivo, lo que puede afectar a tu conectividad. Ve a Ajustes y habilita Permitir 2G para continuar."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Para realizar una llamada, introduce un número válido."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"No se ha podido llamar."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"No se puede realizar la llamada en estos momentos. Intenta ponerte en contacto mediante un mensaje."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"No se pueden retener llamadas."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Conéctate a una red inalámbrica para hacer llamadas."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Para llamar, tienes que habilitar las llamadas por Wi-Fi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Inhabilita el modo Satélite para hacer llamadas."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Para hacer una llamada, primero finaliza la conexión por satélite."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Puedes enviar y recibir mensajes sin una red móvil o Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Información de emergencia"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propietario"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tocar de nuevo para ver la información"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Establecer eSIM extraíble como predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potencia de la señal móvil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular fuera del servicio (solo versión de depuración)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulación del modo Satélite de operador (solo versión de depuración)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Probar el modo eSOS por satélite real (solo versión de depuración)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver libreta de direcciones de tarjeta SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ver números de marcación fija"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Ver números de marcación de servicio"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 60c4d40..1fc277f 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Kõneseaded"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Kõne seadeid saab muuta ainult administraator."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Telefoni konto seadeid saab muuta ainult administraator või tööprofiili kasutaja."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Seadme omanik on mobiilsidevõrgu seadete muutmise võimalust piiranud."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Seaded (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Kõneseadete viga"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Seadete lugemine ..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Muude kui hädaabikõne tegemiseks väljuge hädaabikõnede režiimist."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ei ole võrku registreeritud."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiilsidevõrk pole saadaval."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobiilsidevõrk pole saadaval.\n\nHelistamiseks looge ühendus juhtmeta võrguga.\n\n2G on selles seadmes keelatud, mis võib teie ühenduvust mõjutada. Jätkamiseks avage Seaded ja lubage lüliti Luba 2G."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobiilsidevõrk pole saadaval. Helistamiseks looge ühendus traadita võrguga."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobiilsidevõrk pole saadaval.\n\nHelistamiseks looge ühendus juhtmeta võrguga.\n\n2G on selles seadmes keelatud, mis võib teie ühenduvust mõjutada. Jätkamiseks avage Seaded ja lubage lüliti Luba 2G."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Helistamiseks sisestage kehtiv number."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Kõne ebaõnnestus."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Kõnet ei saa praegu lisada. Proovige helistamise asemel sõnum saata."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Kõnesid ei saa ootele panna."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Helistamiseks looge ühendus traadita võrguga."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Lubage helistamiseks WiFi-kõned."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Helistamiseks keelake satelliidirežiim."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Helistamiseks katkestage esmalt satelliitühendus."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Teil on võimalik sõnumeid saata ja vastu võtta ilma mobiilside- ja WiFi-võrguta."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Hädaabiteave"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Omanik"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Teabe vaatamiseks puudutage uuesti"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Eemaldatava eSIM-i määramine vaikevalikuks"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiiliraadio toide"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simuleerimine ei tööta (ainult silumisjärgus)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simuleeritud operaatori satelliidirežiim (ainult silumisjärgus)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Režiimi eSOS katsetamine reaalse satelliitsidesüsteemi puhul (ainult silumisjärk)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Kuva SIM-i aadressiraamat"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Kuva fikseeritud valimisnumbrid"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Kuva teenuse valimise numbrid"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index d9fbf20..0f889d1 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Deien ezarpenak"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Administratzaileak soilik alda ditzake deien ezarpenak."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Administratzaileak / Laneko erabiltzaileek alda ditzakete telefonoko kontuaren ezarpenak."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Gailuaren jabeak sare mugikorraren ezarpenak aldatzeko aukera mugatu du."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Ezarpenak (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Deien ezarpenen errorea"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Ezarpenak irakurtzen…"</string>
@@ -305,7 +306,7 @@
     <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"operadorea, esim, esim txartela, sim, sim txartela, euicc, euicc txartela, aldatu operadoreak, aldatu operadorez, aldatu operadorea, gehitu operadorea, gehitu operadoreak"</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">"Datu-konexioa"</string>
-    <string name="mobile_data_settings_summary" msgid="5012570152029118471">"Atzitu datuak datu-konexioaren bidez"</string>
+    <string name="mobile_data_settings_summary" msgid="5012570152029118471">"Atzitu datuak sare mugikorraren bidez"</string>
     <string name="data_usage_disable_mobile" msgid="5669109209055988308">"Datu-konexioa desaktibatu nahi duzu?"</string>
     <string name="sim_selection_required_pref" msgid="6985901872978341314">"Hautatu egin behar da"</string>
     <string name="sim_change_data_title" msgid="9142726786345906606">"Datuetarako SIMa aldatu nahi duzu?"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Larrialdikoak ez diren deiak egiteko, irten larrialdi-zerbitzuen deiak jasotzeko modutik."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ez dago sarean erregistratuta."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Sare mugikorra ez dago erabilgarri."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Sare mugikorra ez dago erabilgarri.\n\nDeia egiteko, konektatu hari gabeko sare batera.\n\n2G desgaituta dago gailuan, eta baliteke horrek konexioan eragina izatea. Aurrera egiteko, joan ezarpenetara eta eman 2G erabiltzeko baimena."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Sare mugikorra ez dago erabilgarri. Deia egiteko, konektatu haririk gabeko sare batera."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Sare mugikorra ez dago erabilgarri.\n\nDeia egiteko, konektatu hari gabeko sare batera.\n\n2G desgaituta dago gailuan, eta baliteke horrek konexioan eragina izatea. Aurrera egiteko, joan ezarpenetara eta eman 2G erabiltzeko baimena."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Deitzeko, idatzi balio duen zenbaki bat."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Ezin izan da deitu."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Une honetan, ezin da egin deia. Deitu ordez, mezu bat bidaltzen saia zaitezke."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Ezin dira zain utzi deiak."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Deia egiteko, konektatu haririk gabeko sare batera."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Deia egiteko, gaitu wifi bidezko deiak."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Deiak egiteko, desgaitu satelite modua."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Dei bat egiteko, amaitu satelite bidezko konexioa."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Mezuak bidali eta jaso ditzakezu sare mugikorrik edo wifi-sarerik gabe."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Larrialdietarako informazioa"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Jabea"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Informazioa ikusteko, sakatu berriro"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ezarri eSIM aldagarria lehenetsi gisa"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Sare mugikor bidezko irratiaren indarra"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulatu gailua ez dabilela (arazketa-konpilazioa soilik)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulatu operadorearen satelite modua (arazketa-konpilazioa soilik)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Probatu satelite bidezko SOS larrialdien modua (arazketa-konpilazioa soilik)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ikusi SIMeko kontaktuak"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ikusi markatze finkoko zenbakiak"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Ikusi zerbitzuaren markatze-zenbakiak"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 7319afb..60abd7f 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"تنظیمات تماس"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"فقط کاربر سرپرست می‌تواند تنظیمات تماس را تغییر دهد."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"فقط کاربر کاری یا سرپرست می‌تواند تنظیمات حساب تلفن را تغییر دهد."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"مالک دستگاه امکان تغییر دادن تنظیمات شبکه تلفن همراه را محدود کرده است."</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>
@@ -285,8 +286,8 @@
     <string name="roaming" msgid="1576180772877858949">"فراگردی"</string>
     <string name="roaming_enable" msgid="6853685214521494819">"اتصال به سرویس‌های داده هنگام فراگردی"</string>
     <string name="roaming_disable" msgid="8856224638624592681">"اتصال به سرویس‌های داده هنگام فراگردی"</string>
-    <string name="roaming_reenable_message" msgid="1951802463885727915">"فراگردی داده خاموش شده است. برای روشن کردن آن، ضربه بزنید."</string>
-    <string name="roaming_enabled_message" msgid="9022249120750897">"ممکن است هزینه‌های فراگردی اعمال شود. برای اصلاح ضربه بزنید."</string>
+    <string name="roaming_reenable_message" msgid="1951802463885727915">"فراگردی داده خاموش شده است. برای روشن کردن آن، تک‌ضرب بزنید."</string>
+    <string name="roaming_enabled_message" msgid="9022249120750897">"ممکن است هزینه‌های فراگردی اعمال شود. برای اصلاح تک‌ضرب بزنید."</string>
     <string name="roaming_notification_title" msgid="3590348480688047320">"اتصال داده تلفن همراه قطع شد"</string>
     <string name="roaming_on_notification_title" msgid="7451473196411559173">"فراگردی داده روشن است"</string>
     <string name="roaming_warning" msgid="7855681468067171971">"شاید هزینه زیادی برای شما داشته باشد."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"برای برقراری تماس غیراضطراری از حالت پاسخ تماس اضطراری خارج شوید."</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\nشبکه نسل دوم در این دستگاه غیرفعال است که ممکن است بر قابلیت اتصالتان تأثیر بگذارد. برای ادامه دادن به «تنظیمات» بروید و گزینه «اجازه دادن به شبکه نسل دوم» را فعال کنید."</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\nشبکه نسل دوم در این دستگاه غیرفعال است که ممکن است بر قابلیت اتصالتان تأثیر بگذارد. برای ادامه دادن به «تنظیمات» بروید و گزینه «اجازه دادن به شبکه نسل دوم» را فعال کنید."</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>
@@ -557,14 +560,15 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"نگه‌داشتن تماس‌ها ممکن نیست."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"برای برقراری تماس، به یک شبکه بی‌سیم وصل شوید"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"‏برای برقراری تماس، تماس Wi-Fi را فعال کنید."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"برای برقراری تماس، حالت ماهواره را غیرفعال کنید."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"برای برقراری تماس، ابتدا اتصال ماهواره را قطع کنید."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"‏می‌توانید بدون شبکه تلفن همراه یا شبکه Wi-Fi پیام ارسال و دریافت کنید."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"اطلاعات اضطراری"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"مالک"</string>
-    <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"برای دیدن اطلاعات، دوباره ضربه بزنید"</string>
+    <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"برای دیدن اطلاعات، دوباره تک‌ضرب بزنید"</string>
     <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"تماس اضطراری"</string>
     <string name="single_emergency_number_title" msgid="8413371079579067196">"شماره تلفن اضطراری"</string>
     <string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"شماره تلفن‌های اضطراری"</string>
-    <string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"برای تماس با <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g> دوباره ضربه بزنید"</string>
+    <string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"برای تماس با <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g> دوباره تک‌ضرب بزنید"</string>
     <string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"در حال روشن کردن رادیو..."</string>
     <string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"سرویسی در دسترس نیست. دوباره امتحان کنید..."</string>
     <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"در طول تماس اضطراری نمی‌توانید به حالت هواپیما بروید."</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"تنظیم سیم‌کارت داخلی جداشدنی به‌عنوان پیش‌فرض"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"توان رادیوی تلفن همراه"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"شبیه‌سازی از کار افتادن (فقط ساخت اشکال‌زدایی)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"حالت ماهواره‌ای شرکت مخابراتی ساختگی (فقط ساخت اشکال‌زدایی)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"آزمایش کردن حالت واقعی درخواست کمک اضطراری ماهواره‌ای (فقط ساخت اشکال‌زدایی)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"مشاهده دفترچه نشانی سیم‌کارت"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"مشاهده شماره‌های شماره‌گیری ثابت"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"مشاهده شماره‌های شماره‌گیری سرویس"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 2bd6ac9..d347488 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Puheluasetukset"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Vain järjestelmänvalvoja voi muuttaa puheluasetuksia."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Vain järjestelmänvalvoja tai työkäyttäjä voi muuttaa puhelintilin asetuksia."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Laitteen omistaja on rajoittanut mobiiliverkkoasetusten muuttamista."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Asetukset (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Virhe puheluasetuksissa"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Luetaan asetuksia…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Poistu hätäpuhelujen takaisinsoittotilasta soittaaksesi muun kuin hätäpuhelun."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ei rekisteröity verkkoon."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiiliverkko ei käytettävissä."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobiiliverkko ei ole käytettävissä.\n\nYhdistä langattomaan verkkoon, jos haluat soittaa puhelun.\n\n2G ei ole käytössä tällä laitteella, mikä saattaa vaikuttaa yhteyksiin. Jatka siirtymällä asetuksiin ja ottamalla \"Salli 2G\" käyttöön."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobiiliverkko ei ole käytettävissä. Yhdistä langattomaan verkkoon, jos haluat soittaa puhelun."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobiiliverkko ei ole käytettävissä.\n\nYhdistä langattomaan verkkoon, jos haluat soittaa puhelun.\n\n2G ei ole käytössä tällä laitteella, mikä saattaa vaikuttaa yhteyksiin. Jatka siirtymällä asetuksiin ja ottamalla \"Salli 2G\" käyttöön."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Soita antamalla kelvollinen numero."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Puhelu epäonnistui."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Puhelua ei voi lisätä juuri nyt. Voit sen sijaan yrittää lähettää viestin."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Puhelujen pito ei onnistu."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Yhdistä langattomaan verkkoon, jos haluat soittaa puhelun."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Ota Wi-Fi-puhelut käyttöön soittaaksesi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Poista satelliittitila käytöstä, jotta voit soittaa puhelun."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Lopeta satelliittiyhteys, jotta voit soittaa puhelun."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Voit lähettää ja vastaanottaa viestejä ilman mobiili‑ tai Wi-Fi-verkkoa."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Vaaratiedot"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Omistaja"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Katso tiedot napauttamalla uudelleen"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Aseta poistettava eSIM oletukseksi"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiiliradion voimakkuus"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Epäkunnossa-simulaatio (vain virheenkorjauksen koontiversio)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Operaattorin satelliittitilaesimerkki (vain virheenkorjauksen koontiversio)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testaa oikeaa Satellite eSOS ‑tilaa (vain virheenkorjauksen koontiversio)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Näytä SIM-kortin osoitekirja"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Näytä sallitut numerot"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Näytä sallitut palvelunumerot"</string>
diff --git a/res/values-fr-feminine/strings.xml b/res/values-fr-feminine/strings.xml
new file mode 100644
index 0000000..af39013
--- /dev/null
+++ b/res/values-fr-feminine/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2007 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"Indisponible lorsque vous êtes connectée à %1$s"</string>
+</resources>
diff --git a/res/values-fr-masculine/strings.xml b/res/values-fr-masculine/strings.xml
new file mode 100644
index 0000000..457cf38
--- /dev/null
+++ b/res/values-fr-masculine/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2007 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"Indisponible lorsque vous êtes connecté à %1$s"</string>
+</resources>
diff --git a/res/values-fr-neuter/strings.xml b/res/values-fr-neuter/strings.xml
new file mode 100644
index 0000000..221e1eb
--- /dev/null
+++ b/res/values-fr-neuter/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2007 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"Indisponible lorsque vous êtes connecté·e à %1$s"</string>
+</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 95e6ae9..03c0e56 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Paramètres d\'appel"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Seul l\'administrateur peut modifier les paramètres d\'appel."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Seuls l\'admin. ou l\'utilisat. profession. peuvent modif. les param. du compte tél."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Le propriétaire de l\'appareil a limité la possibilité de modifier les paramètres du réseau cellulaire."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Paramètres (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Erreur des paramètres d\'appel"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Lecture des paramètres..."</string>
@@ -145,7 +146,7 @@
     <string name="stk_cc_ss_to_ussd_error" msgid="8330749347425752192">"Demande SS remplacée par une demande USSD"</string>
     <string name="stk_cc_ss_to_ss_error" msgid="8297155544652134278">"Remplacement par une nouvelle demande SS"</string>
     <string name="stk_cc_ss_to_dial_video_error" msgid="4255261231466032505">"Demande SS remplacée par un appel vidéo"</string>
-    <string name="fdn_check_failure" msgid="1833769746374185247">"Les numéros autorisés sont activés dans l\'application de votre téléphone. Par conséquent, certaines fonctionnalités d\'appel ne fonctionnent pas."</string>
+    <string name="fdn_check_failure" msgid="1833769746374185247">"Les numéros autorisés sont activés dans l\'appli de votre téléphone. Par conséquent, certaines fonctionnalités d\'appel ne fonctionnent pas."</string>
     <string name="radio_off_error" msgid="8321564164914232181">"Activez le signal radio avant d\'afficher ces paramètres."</string>
     <string name="close_dialog" msgid="1074977476136119408">"OK"</string>
     <string name="enable" msgid="2636552299455477603">"Activer"</string>
@@ -298,7 +299,7 @@
     <string name="sip_accounts_removed_notification_title" msgid="3528076957535736095">"Comptes SIP obsolètes trouvés et retirés"</string>
     <string name="sip_accounts_removed_notification_message" msgid="1916856744869791592">"Les appels SIP ne sont plus pris en charge par la plateforme Android.\nVos comptes SIP <xliff:g id="REMOVED_SIP_ACCOUNTS">%s</xliff:g> existants ont été retirés.\nVeuillez confirmer votre paramètre de compte d\'appel par défaut."</string>
     <string name="sip_accounts_removed_notification_action" msgid="3772778402370555562">"Accéder aux paramètres"</string>
-    <string name="data_usage_title" msgid="8438592133893837464">"Utilisation des données des applications"</string>
+    <string name="data_usage_title" msgid="8438592133893837464">"Utilisation des données des applis"</string>
     <string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_1">%1$s</xliff:g> de données mobiles utilisées pendant la période suivante : <xliff:g id="ID_2">%2$s</xliff:g>"</string>
     <string name="advanced_options_title" msgid="9208195294513520934">"Avancés"</string>
     <string name="carrier_settings_euicc" msgid="1190237227261337749">"Opérateur"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Quittez le mode de rappel d\'urgence pour effectuer un appel non urgent."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Non enregistré sur le réseau"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Réseau pour mobile non disponible"</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Réseau mobile non disponible.\n\nConnectez-vous à un réseau sans fil pour passer un appel.\n\nLe réseau 2G est désactivé sur cet appareil, ce qui peut affecter votre connectivité. Accédez aux paramètres et activez Autoriser les réseaux 2G pour continuer."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Le réseau mobile n\'est pas accessible. Connectez-vous à un réseau sans fil pour effectuer un appel."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Le réseau mobile n\'est pas disponible.\n\nConnectez-vous à un réseau sans fil pour passer un appel.\n\nLe réseau 2G est désactivé sur cet appareil, ce qui peut affecter votre connectivité. Accédez aux paramètres et activez Autoriser les réseaux 2G pour continuer."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Pour faire un appel, entrez un numéro valide."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Échec de l\'appel."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Impossible d\'ajouter l\'appel pour le moment. Vous pouvez essayer de joindre la personne en lui envoyant un message."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Impossible de mettre les appels en attente."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Connectez-vous à un réseau Wi-Fi pour faire un appel."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Activez les appels Wi-Fi pour faire un appel."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Désactivez le mode Satellite pour passer un appel."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Pour passer un appel, mettez d\'abord fin à la connexion par satellite."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Vous pouvez envoyer et recevoir des messages sans avoir recours à un appareil mobile ni à un réseau Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Renseignements en cas d\'urgence"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propriétaire"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Touchez à nouveau pour afficher les renseignements"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Définir la carte eSIM amovible comme carte SIM par défaut"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentation de radio cellulaire"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulation de l\'appareil hors service (version de débogage uniquement)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mode Satellite de l\'opérateur simulé (version de débogage uniquement)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Tester le mode eSOS par satellite réel (version de débogage uniquement)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Afficher le carnet d\'adresses de la carte SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Afficher les numéros d\'appel fixes"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Afficher les numéros de service"</string>
@@ -926,9 +932,9 @@
     <string name="call_quality_notification_bluetooth_details" msgid="8348950331707346711">"Votre signal Bluetooth est faible. Essayez de passer au haut-parleur mains libres."</string>
     <string name="call_quality_notification_name" msgid="3476828289553948830">"Notification de qualité d\'appel"</string>
     <string name="notification_channel_sip_account" msgid="1261816025156179637">"Comptes SIP obsolètes"</string>
-    <string name="send_from_work_profile_title" msgid="7044759579507604732">"Impossible d\'envoyer un message à partir d\'une application personnelle"</string>
-    <string name="send_from_work_profile_description" msgid="2174402508727161974">"Votre organisation ne vous autorise à envoyer de messages qu\'à partir d\'applications professionnelles"</string>
+    <string name="send_from_work_profile_title" msgid="7044759579507604732">"Impossible d\'envoyer un message à partir d\'une appli personnelle"</string>
+    <string name="send_from_work_profile_description" msgid="2174402508727161974">"Votre organisation ne vous autorise à envoyer de messages qu\'à partir d\'applis professionnelles"</string>
     <string name="send_from_work_profile_cancel" msgid="177746511030381711">"Annuler"</string>
     <string name="send_from_work_profile_action_str" msgid="6892775562934243337">"Passer au profil professionnel"</string>
-    <string name="install_messages_on_work_profile_action_str" msgid="3773440996395152903">"Installer une application de messagerie professionnelle"</string>
+    <string name="install_messages_on_work_profile_action_str" msgid="3773440996395152903">"Installer une appli de messagerie professionnelle"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 8b3f378..8fac282 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Paramètres d\'appel"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Seul l\'administrateur peut modifier les paramètres d\'appel."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Seul l\'administrateur ou l\'utilisateur professionnel peut modifier les paramètres du compte téléphonique."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Le propriétaire de l\'appareil a limité la possibilité de modifier les paramètres du réseau mobile."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Paramètres (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Erreur des paramètres d\'appel"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Lecture des paramètres..."</string>
@@ -184,7 +185,7 @@
     <string name="registration_done" msgid="5337407023566953292">"Enregistré sur le réseau."</string>
     <string name="already_auto" msgid="8607068290733079336">"La sélection automatique est déjà activée."</string>
     <string name="select_automatically" msgid="779750291257872651">"Sélectionner automatiquement le réseau"</string>
-    <string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"Indisponibles lorsque vous êtes connecté à %1$s"</string>
+    <string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"Indisponible lorsque vous êtes connecté à %1$s"</string>
     <string name="network_select_title" msgid="4117305053881611988">"Réseau"</string>
     <string name="register_automatically" msgid="3907580547590554834">"Enregistrement automatique…"</string>
     <string name="preferred_network_mode_title" msgid="5253395265169539830">"Type de réseau préféré"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Veuillez quitter le mode de rappel d\'urgence pour passer un appel standard."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Non enregistré sur le réseau."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Réseau mobile non disponible"</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Réseau mobile non disponible.\n\nConnectez-vous à un réseau sans fil pour passer un appel.\n\nLa 2G est désactivée sur cet appareil, ce qui peut affecter votre connectivité. Accédez aux paramètres et activez \"Autoriser la 2G\" pour continuer."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Le réseau mobile n\'est pas disponible. Connectez-vous à un réseau sans fil pour passer un appel."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Réseau mobile non disponible.\n\nConnectez-vous à un réseau sans fil pour passer un appel.\n\nLa 2G est désactivée sur cet appareil, ce qui peut affecter votre connectivité. Accédez aux paramètres et activez \"Autoriser la 2G\" pour continuer."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Pour émettre un appel, veuillez saisir un numéro valide."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Échec de l\'appel."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Impossible d\'ajouter un appel pour le moment. Essayez plutôt d\'envoyer un message."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Impossible de mettre les appels en attente."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Connectez-vous à un réseau sans fil pour passer un appel."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Pour passer un appel, veuillez activer les appels Wi-Fi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Désactivez le mode Satellite pour passer un appel."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Pour passer un appel, mettez d\'abord fin à la connexion satellite."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Vous pouvez envoyer et recevoir des messages sans connexion au réseau mobile ou Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informations d\'urgence"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propriétaire"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Appuyer à nouveau pour afficher les informations"</string>
@@ -619,7 +623,7 @@
     <string name="ota_hfa_activation_title" msgid="3300556778212729671">"Activation en cours…"</string>
     <string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"Le service de données mobiles est en cours d\'activation sur le téléphone…\n\nCette opération peut prendre jusqu\'à cinq minutes."</string>
     <string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"Ignorer l\'activation ?"</string>
-    <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Si vous poursuivez sans activer votre mobile, vous ne pourrez ni téléphoner, ni vous connecter à des réseaux de données mobiles. La connexion à un réseau Wi-Fi reste possible. Vous serez invité à effectuer l\'activation à chaque démarrage du téléphone."</string>
+    <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"Si vous poursuivez sans activer votre mobile, vous ne pourrez ni téléphoner, ni vous connecter à des réseaux de données mobiles. La connexion à un réseau Wi-Fi reste possible. L\'activation vous sera proposée à chaque démarrage du téléphone."</string>
     <string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"Ignorer"</string>
     <string name="ota_activate" msgid="7939695753665438357">"Activer"</string>
     <string name="ota_title_activate_success" msgid="1272135024761004889">"Votre téléphone est activé"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Définir l\'eSIM amovible comme SIM par défaut"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentation radio mobile"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simuler une panne (version de débogage uniquement)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simuler le mode Satellite de l\'opérateur (version de débogage uniquement)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Tester le SOS par satellite en mode réel (version de débogage uniquement)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Afficher le carnet d\'adresses de la carte SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Afficher les numéros autorisés"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Afficher les numéros de service"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 5ce9ea3..7d680f7 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Configuración de chamada"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Só o usuario administrador pode cambiar a configuración de chamada."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Só o usuario administrador ou o usuario do traballo poden cambiar a configuración da conta do teléfono."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"A persoa propietaria do dispositivo restrinxiu a capacidade de modificar a configuración da rede de telefonía móbil."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Configuración (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Erro de configuración das chamadas"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Lendo a configuración..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sae do modo de devolución de chamada de emerxencia para facer unha chamada que non sexa de emerxencia."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Sen rexistro na rede"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"A rede móbil non está dispoñible."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"A rede de telefonía móbil non está dispoñible.\n\nConéctate a unha rede sen fíos para facer chamadas.\n\nA rede 2G está desactivada neste dispositivo, o que pode impedir que te conectes. Para continuar, vai a Configuración e activa a opción Permitir uso de 2G."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"A rede móbil non está dispoñible. Conéctate a unha rede sen fíos para facer unha chamada."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"A rede de telefonía móbil non está dispoñible.\n\nConéctate a unha rede sen fíos para facer chamadas.\n\nA rede 2G está desactivada neste dispositivo, o que pode impedir que te conectes. Para continuar, vai a Configuración e activa a opción Permitir uso de 2G."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Para realizar unha chamada, introduce un número válido."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Produciuse un erro na chamada."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Non se pode realizar a chamada neste momento. Podes tentar poñerte en contacto mediante unha mensaxe."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Non se poden poñer as chamadas en espera."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Conéctate a unha rede sen fíos para facer unha chamada."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Activa as chamadas por wifi para facer unha chamada."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Desactiva o modo Satélite para facer chamadas."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Para facer unha chamada, primeiro finaliza a conexión por satélite."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Podes enviar e recibir mensaxes sen unha rede de telefonía móbil ou wifi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Información de emerxencia"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Propietario"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Toca de novo para consultar a información"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Establecer eSIM extraíble como predeterminada"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentación da radio móbil"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular Fóra de servizo (só compilación de depuración)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simular o modo Satélite do operador (só compilación de depuración)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Probar o modo real eSOS por satélite (só compilación de depuración)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver axenda de enderezos da SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ver números de marcación fixa"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Ver números de marcación de servizo"</string>
@@ -877,7 +883,7 @@
     <string name="radio_info_dl_kbps" msgid="2382922659525318726">"Largura de banda de descarga (kbps):"</string>
     <string name="radio_info_ul_kbps" msgid="2102225400904799036">"Largura de banda de carga (kbps):"</string>
     <string name="radio_info_phy_chan_config" msgid="608045501232211303">"Configuración da canle física:"</string>
-    <string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Taxa de actualización da información para móbiles:"</string>
+    <string name="radio_info_cell_info_refresh_rate" msgid="670511448975997340">"Frecuencia de actualización da información para móbiles:"</string>
     <string name="radio_info_cellinfo_label" msgid="8199062974670377659">"Toda a información de medición para móbiles:"</string>
     <string name="radio_info_gprs_service_label" msgid="6819204246355412952">"Servizo de datos:"</string>
     <string name="radio_info_roaming_label" msgid="6636932886446857120">"Itinerancia:"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 99606a0..19d127d 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"કૉલ સેટિંગ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"કૉલ સેટિંગને ફક્ત ઍડમિન વપરાશકર્તા દ્વારા જ બદલી શકાય છે."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ફોન એકાઉન્ટના સેટિંગને ફક્ત ઍડમિન અથવા ઑફિસના વપરાશકર્તા જ બદલી શકે છે."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ડિવાઇસના માલિકે મોબાઇલ નેટવર્ક સેટિંગ બદલવાની ક્ષમતા પ્રતિબંધિત કરી છે."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"બિન-કટોકટીનો કૉલ કરવા માટે કટોકટી કૉલબૅક મોડમાંથી બહાર નીકળો."</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\nઆ ડિવાઇસ પર 2G સેવા બંધ છે, જે તમારી કનેક્ટિવિટીને અસર કરી શકે છે. સેટિંગમાં જાઓ અને આ સેવાને ચાલુ રાખવા માટે \'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\nઆ ડિવાઇસ પર 2G સેવા બંધ છે, જે તમારી કનેક્ટિવિટીને અસર કરી શકે છે. સેટિંગમાં જાઓ અને આ સેવાને ચાલુ રાખવા માટે \'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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"કૉલ્સને હોલ્ડ કરી શકતાં નથી."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"કૉલ કરવા માટે વાયરલેસ નેટવર્કથી કનેક્ટ કરો."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"કૉલ કરવા માટે Wi-Fi કૉલિંગ સક્ષમ કરો."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"કૉલ કરવા માટે ઉપગ્રહ મોડ બંધ કરો."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"કૉલ કરવા માટે, પહેલાં સૅટલાઇટ કનેક્શન સમાપ્ત કરો."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"તમે મોબાઇલ અથવા વાઇ-ફાઇ નેટવર્ક વિના મેસેજ મોકલી અને પ્રાપ્ત કરી શકો છો."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ઇમર્જન્સીની માહિતી"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"માલિક"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"માહિતી જોવા માટે ફરીથી ટૅપ કરો"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"કાઢી નાખી શકાય એવા ઇ-સિમ કાર્ડને ડિફૉલ્ટ તરીકે સેટ કરો"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"મોબાઇલ રેડિયો પાવર"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'સેવા ઉપલબ્ધ નથી\' મોડ સિમ્યુલેટ કરો (માત્ર ડિબગ બિલ્ડ માટે)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"મૉક કૅરિઅર સૅટલાઇટ મોડ (માત્ર ડિબગ બિલ્ડ માટે)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"રિઅલ સૅટલાઇટ eSOS મોડનું પરિક્ષણ કરો (માત્ર ડિબગ બિલ્ડ માટે)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"સિમમાં સરનામા પુસ્તિકા જુઓ"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ફિક્સ્ડ ડાયલિંગ નંબર જુઓ"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"સર્વિસ ડાયલિંગ નંબર જુઓ"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index febd572..5e172b1 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"कॉल सेटिंग"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"कॉल सेटिंग केवल व्यवस्थापक उपयोगकर्ता द्वारा ही बदली जा सकती हैं."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"फ़ोन की खाता सेटिंग, सिर्फ़ एडमिन या वर्क प्रोफ़ाइल के उपयोगकर्ता बदल सकते हैं."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"डिवाइस के मालिक ने मोबाइल नेटवर्क की सेटिंग बदलने की सुविधा पर पाबंदी लगा दी है."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"गैर-आपातकालीन कॉल करने के लिए आपातकालीन कॉलबैक मोड से बाहर निकलें."</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\nइस डिवाइस पर 2G नेटवर्क इस्तेमाल करने की सुविधा बंद है. ऐसा हो सकता है कि इसका असर कनेक्टिविटी पर पड़ा हो. जारी रखने के लिए, Settings में जाकर ‘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\nइस डिवाइस पर 2G नेटवर्क इस्तेमाल करने की सुविधा बंद है, जिससे कनेक्टिविटी पर असर पड़ सकता है. जारी रखने के लिए, Settings में जाएं और ‘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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"कॉल होल्ड नहीं किए जा सकते."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"कॉल करने के लिए किसी वायरलेस नेटवर्क से कनेक्‍ट करें."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"कॉल करने के लिए वाई-फ़ाई कॉलिंग सक्षम करें."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"कॉल करने के लिए, सैटलाइट मोड को बंद करें."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"कॉल करने के लिए, सैटलाइट कनेक्शन बंद करें."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"आपके पास, मोबाइल या वाई-फ़ाई नेटवर्क के बिना भी मैसेज भेजने और पाने की सुविधा है."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"आपातकाल में दिखने वाली जानकारी"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"मालिक"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"जानकारी देखने के लिए फिर से टैप करें"</string>
@@ -588,7 +592,7 @@
     <string name="onscreenManageConferenceText" msgid="4700574060601755137">"कॉन्फ़्रेंस प्रबंधित करें"</string>
     <string name="onscreenAudioText" msgid="7224226735052019986">"ऑडियो"</string>
     <string name="onscreenVideoCallText" msgid="1743992456126258698">"वीडियो कॉल"</string>
-    <string name="importSimEntry" msgid="3892354284082689894">"आयात करें"</string>
+    <string name="importSimEntry" msgid="3892354284082689894">"इंपोर्ट करें"</string>
     <string name="importAllSimEntries" msgid="2628391505643564007">"सभी आयात करें"</string>
     <string name="importingSimContacts" msgid="4995457122107888932">"सिम संपर्क आयात कर रहा है"</string>
     <string name="importToFDNfromContacts" msgid="5068664870738407341">"संपर्कों से आयात करें"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"हटाए जा सकने वाले ई-सिम को डिफ़ॉल्ट के तौर पर सेट करें"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"मोबाइल रेडियो पावर"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"सिम्युलेट किया गया डिवाइस काम नहीं कर रहा है (सिर्फ़ डीबग के लिए बिल्ड)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी के सैटलाइट मोड की मॉक टेस्टिंग करें (सिर्फ़ डीबग के लिए बिल्ड)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"रीयल सैटलाइट इमरजेंसी एसओएस मोड को आज़माएं (सिर्फ़ डीबग के लिए बिल्ड)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"सिम में संपर्कों के पते की सूची देखें"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"फ़िक्स्ड डायलिंग नंबर देखें"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"सेवा के डायलिंग नंबर देखें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index cb58063..e33b502 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Postavke poziva"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Postavke poziva može mijenjati samo korisnik koji je administrator."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Postavke računa za telefon može mijenjati samo administrator ili poslovni korisnik."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Vlasnik uređaja ograničio je mogućnost promjene postavki mobilne mreže."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Postavke (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Pogreška postavki poziva"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Čitanje postavki..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Isključite način hitnih poziva da biste uputili poziv koji nije hitan."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Nije registrirano na mreži."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilna mreža nije dostupna."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilna mreža nije dostupna.\n\nPovežite se s bežičnom mrežom da biste uputili poziv.\n\n2G je onemogućen na ovom uređaju, što možda utječe na povezivost. Za nastavak otvorite postavke i omogućite opciju Dopusti 2G."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilna mreža nije dostupna. Povežite se s bežičnom mrežom da biste uputili poziv."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilna mreža nije dostupna.\n\nPovežite se s bežičnom mrežom da biste uputili poziv.\n\n2G je onemogućen na ovom uređaju, što možda utječe na povezivost. Za nastavak otvorite postavke i omogućite opciju Dopusti 2G."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Unesite važeći broj da biste uspostavili poziv."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Poziv nije uspio."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Poziv se trenutačno ne može dodati. Pokušajte poslati poruku."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Pozivi se ne mogu stavljati na čekanje."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Povežite se s bežičnom mrežom da biste uputili poziv."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Omogućite pozivanje putem Wi-Fi veze da biste uspostavili poziv."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Onemogućite način satelita da biste uputili poziv."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Da biste uputili poziv, najprije prekinite satelitsku vezu."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Možete slati i primati poruke bez mobilne ili Wi-Fi mreže."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Podaci za hitne slučajeve"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Vlasnik"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Dodirnite ponovno da biste vidjeli informacije"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Postavljanje uklonjivog eSIM-a kao zadanog"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Snaga mobilnog radija"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija stanja \"izvan upotrebe\" (samo međuverzija programa za otklanjanje pogrešaka)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni način mobilnog operatera za slanje putem satelita (samo međuverzija programa za otklanjanje pogrešaka)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testiranje eSOS načina pravog satelita (samo međuverzija programa za otklanjanje pogrešaka)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži imenik SIM-a"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Prikaži brojeve za fiksno biranje"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Prikaži brojeve za servisno biranje"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 54c112b..62c413a 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Hívásbeállítások"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"A hívásbeállításokat csak a rendszergazda módosíthatja."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"A telefon fiókbeállításait csak az adminisztrátor vagy munkahelyi felhasználó módosíthatja."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Az eszköz tulajdonosa korlátozta a mobilhálózati beállítások módosítását."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Beállítások (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Hiba a hívásbeállításokban"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Beállítások olvasása..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Lépjen ki a Segélykérő visszahívása módból nem vészjellegű hívás kezdeményezéséhez."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Nincs regisztrálva a hálózaton."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"A mobilhálózat nem érhető el."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Nem áll rendelkezésre mobilhálózat.\n\nHívás indításához csatlakozzon vezeték nélküli hálózathoz.\n\nA 2G le van tiltva ezen az eszközön, ami hatással lehet a kapcsolódásra. A folytatáshoz nyissa meg a beállításokat, és kapcsolja be a 2G engedélyezése lehetőséget."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"A mobilhálózat nem érhető el. Hívás indításához csatlakozzon egy vezeték nélküli hálózathoz."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Nem áll rendelkezésre mobilhálózat.\n\nHívás indításához csatlakozzon vezeték nélküli hálózathoz.\n\nA 2G le van tiltva ezen az eszközön, ami hatással lehet a kapcsolódásra. A folytatáshoz nyissa meg a beállításokat, és kapcsolja be a 2G engedélyezése lehetőséget."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Hívásindításhoz adjon meg egy érvényes számot."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Sikertelen hívás."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Jelenleg nem indítható hívás. Üzenet küldésével érheti el a másik felet."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"A hívások nem tarthatók."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Hívás indításához csatlakozzon egy vezeték nélküli hálózathoz."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Engedélyezze a Wi-Fi-hívást a hívásindításhoz."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Hívás indításához kapcsolja ki a műholdas módot."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Hívás indításához először szakítsa meg a műholdas kapcsolatot."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Küldhet és fogadhat üzeneteket mobil- és Wi-Fi-hálózat nélkül is."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Segélyhívási információk"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Tulajdonos"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Koppints újra az információk megtekintéséhez"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Cserélhető eSIM beállítása alapértelmezettként"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobil rádióadó teljesítménye"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Szolgáltatáskiesés szimulációja (csak hibaelhárító build)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Szimulált szolgáltató – Műholdas mód (csak hibaelhárító build)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"A valódi műholdas eSOS mód tesztelése (csak hibaelhárító build)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM-kártya telefonkönyvének megtekintése"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Fix hívószámok megtekintése"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Szolgáltatásszámok megtekintése"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 8e68a06..731c6fb 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Զանգի կարգավորումներ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Զանգի կարգավորումները կարող է փոխել միայն ադմինիստրատոր հանդիսացող օգտատերը:"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Հեռախոսի հաշվի կարգավորումները կարող է փոխել միայն ադմինիստրատորը կամ աշխատանքային հաշվի օգտատերը։"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Սարքի սեփականատերը սահմանափակել է բջջային ցանցի կարգավորումները փոխելու հնարավորությունը։"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Սովորական զանգ կատարելու համար դուրս եկեք շտապ կանչի ռեժիմից։"</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">"Բջջային ցանցն անհասանելի է: Զանգելու համար միացեք Wi-Fi ցանցին:"</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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Հնարավոր չէ հետաձգել զանգերը:"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Զանգ կատարելու համար միացեք անլար ցանցին:"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Զանգ կատարելու համար միացրեք «Զանգեր Wi-Fi ցանցի միջոցով» գործառույթը:"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Զանգ կատարելու համար անջատեք արբանյակի ռեժիմը։"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Զանգ կատարելու համար նախ անջատեք արբանյակային կապը։"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Դուք կարող եք ուղարկել և ստանալ հաղորդագրություններ՝ առանց բջջային կամ Wi-Fi կապի։"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Անհետաձգելի բուժօգնության տվյալներ"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Սեփականատեր"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Կրկին հպեք՝ տեղեկությունները դիտելու համար"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Սահմանել հեռացվելի eSIM քարտը որպես կանխադրված"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Բջջային ռադիոազդանշանի հզորությունը"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Սպասարկման գոտուց դուրս գտնվելու սիմուլյացիա (միայն վրիպազերծման կառուցում)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Օպերատորի արբանյակի ռեժիմի սիմուլյացիա (միայն վրիպազերծման կառուցում)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Փորձարկել իրական արբանյակային eSOS ռեժիմը (միայն վրիպազերծման կառուցման մեջ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Դիտել SIM քարտի հասցեագիրքը"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Տեսնել ամրակցված հեռախոսահամարները"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Տեսնել ծառայությունների հեռախոսահամարները"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 9484f54..1e9ca9a 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Setelan panggilan"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Setelan panggilan telepon hanya dapat diubah oleh pengguna admin."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Setelan akun Telepon hanya dapat diubah admin atau pengguna untuk kerja."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Pemilik perangkat telah membatasi kemampuan untuk mengubah setelan jaringan seluler."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Setelan (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Kesalahan setelan panggilan"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Membaca setelan…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Keluar dari mode telepon balik darurat untuk melakukan panggilan non-darurat."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Tidak terdaftar pada jaringan."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Jaringan seluler tidak tersedia."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Jaringan seluler tidak tersedia.\n\nHubungkan ke jaringan nirkabel untuk melakukan panggilan.\n\n2G dinonaktifkan di perangkat ini, yang mungkin memengaruhi konektivitas Anda. Buka Setelan dan aktifkan Izinkan 2G untuk melanjutkan."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Jaringan seluler tidak tersedia. Sambungkan ke jaringan nirkabel untuk melakukan panggilan."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Jaringan seluler tidak tersedia.\n\nSambungkan ke jaringan nirkabel untuk melakukan panggilan.\n\n2G dinonaktifkan di perangkat ini, yang mungkin memengaruhi konektivitas Anda. Buka Setelan dan aktifkan Izinkan 2G untuk melanjutkan."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Untuk melakukan panggilan telepon, masukkan nomor yang valid."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Telepon gagal."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Panggilan tidak bisa ditambahkan saat ini. Anda bisa mencoba menghubungi dengan mengirim pesan."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Tidak dapat menahan panggilan."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Sambungkan ke jaringan nirkabel untuk melakukan panggilan"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktifkan panggilan Wi-Fi untuk melakukan panggilan."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Nonaktifkan mode satelit untuk melakukan panggilan."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Untuk melakukan panggilan, akhiri koneksi satelit terlebih dahulu."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Anda dapat mengirim dan menerima pesan tanpa jaringan seluler atau Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informasi darurat"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Pemilik"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Ketuk lagi untuk melihat info"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Tetapkan eSIM yang Dapat Dilepas sebagai Default"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Daya Radio Seluler"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulasi Tidak dapat Digunakan (Khusus Build Debug)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mode Satelit Operator Tiruan (khusus Build Debug)."</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Uji mode eSOS satelit asli (khusus Build Debug)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Lihat Buku Alamat SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Lihat Panggilan Terbatas"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Lihat Nomor Panggilan Layanan"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 123519e..a201c1e 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Símtalsstillingar"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Aðeins stjórnandinn má breyta símtalsstillingum."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Aðeins stjórnandi eða vinnunotandi getur breytt reikningsstillingum símans."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Eigandi tækisins takmarkaði getu til að breyta stillingum farsímakerfis."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Stillingar (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Villa í símtalsstillingum"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Les stillingar…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Hætta í stillingu fyrir svarhringingu neyðarsímtala til að hringja símtal sem ekki er neyðarsímtal."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ekki skráð á símkerfi."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Farsímakerfi ekki tiltækt."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Farsímakerfið er ekki tiltækt.\n\nTengstu þráðlausu neti til að hringja.\n\nSlökkt er á 2G í þessu tæki, sem kann að hafa áhrif á tenginguna. Opnaðu stillingar og virkjaðu Leyfa 2G til að halda áfram."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Farsímakerfi er ekki tiltækt. Tengstu þráðlausu neti til að hringja."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Farsímakerfið er ekki tiltækt.\n\nTengstu þráðlausu neti til að hringja.\n\nSlökkt er á 2G í þessu tæki, sem kann að hafa áhrif á tenginguna. Opnaðu stillingar og virkjaðu Leyfa 2G til að halda áfram."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Sláðu inn gilt númer til að hringja símtal."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Tókst ekki að hringja."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Ekki er hægt að bæta símtali við að svo stöddu. Þú getur reynt að hafa samband með því að senda skilaboð."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Getur ekki sett símtöl í bið."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Tengstu þráðlausu neti til að hringja."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Virkjaðu Wi-Fi símtöl til að hringja."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Slökktu á gervihnattarstillingu til að hringja símtal."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Byrjaðu á því að slökkva á gervihnattatengingunni til að hringja símtal."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Þú getur sent og móttekið skilaboð án tengingar við farsímakerfi eða Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Neyðarupplýsingar"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Eigandi"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Ýttu aftur til að skoða upplýsingar"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Stilla laust eSIM sem sjálfgefið"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Loftnetsstyrkur farsíma"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Líkja eftir „Utan þjónustusvæðis“ (aðeins villuleitarsmíði)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Eftirlíking af gervihnattarstillingu símafyrirtækis (aðeins villuleitarsmíði)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Prófa eSOS-stillingu raunverulegs gervihnattar (eingöngu villuleitarsmíð)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Skoða símaskrá SIM-korts"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Skoða læst númeraval"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Skoða þjónustunúmer"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 2b8e870..cadede4 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Impostazioni chiamate"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Le impostazioni delle chiamate possono essere modificate solo dall\'utente amministratore."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Le impostazioni dell\'account del telefono possono essere modificate solo dall\'amministratore o dall\'utente di lavoro."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Il proprietario del dispositivo ha limitato la possibilità di modificare le impostazioni della rete mobile."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Impostazioni (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Errore durante aggiornam. impostaz. chiamate"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Lettura impostazioni..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Per effettuare chiamate non di emergenza, esci dalla modalità di richiamata di emergenza."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Non registrato sulla rete."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Rete cellulare non disponibile."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Rete mobile non disponibile.\n\nConnettiti a una rete wireless per effettuare una chiamata.\n\nIl 2G è disattivato su questo dispositivo, e questo potrebbe influire sulla tua connettività. Vai alle Impostazioni e attiva Consenti 2G per continuare."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"La rete cellulare non è disponibile. Connettiti a una rete wireless per effettuare una chiamata."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"La rete mobile non è disponibile.\n\nConnettiti a una rete wireless per effettuare una chiamata.\n\nIl 2G è disattivato su questo dispositivo, e questo potrebbe influire sulla tua connettività. Vai alle Impostazioni e attiva Consenti 2G per continuare."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Per effettuare una chiamata, inserisci un numero valido."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Chiamata non riuscita."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Impossibile aggiungere la chiamata al momento. Prova a inviare un messaggio."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Impossibile mettere in attesa le chiamate."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Connettiti a una rete wireless per effettuare una chiamata."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Attiva le chiamate tramite Wi-Fi per effettuare una chiamata."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Disattiva la modalità satellite per effettuare una chiamata."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Per effettuare una chiamata, devi prima terminare la connessione satellitare."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Puoi inviare e ricevere messaggi senza una rete mobile o Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informazioni d\'emergenza"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Proprietario"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tocca di nuovo per visualizzare le informazioni"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Imposta la eSIM rimovibile come predefinita"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potenza del segnale radio mobile"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulazione non disponibile (solo build di debug)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Modalità satellite operatore fittizio (solo build di debug)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testa la modalità eSOS con satellite reale (solo build di debug)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Visualizza rubrica SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Visualizza numeri consentiti"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Visualizza numeri dell\'elenco dei numeri di servizio"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index f5475b2..f93dc1d 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"הגדרות שיחה"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"רק מנהל המערכת יכול לשנות הגדרות שיחה."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"אפשר לשנות את הגדרות החשבון בטלפון רק מהחשבון של האדמין או של העבודה."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"אי אפשר לשנות את הגדרות הרשת הסלולרית בגלל מגבלות שהוגדרו על ידי בעלי המכשיר."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"עליך לצאת ממצב חירום של התקשרות חזרה כדי לבצע שיחות שאינן שיחות חירום."</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\nהחיבור ל-2G מושבת במכשיר, ויכול להיות שזה משפיע על הקישוריות. כדי להמשיך, צריך לפתוח את ההגדרות ולאפשר שימוש ב-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\nהחיבור ל-2G מושבת במכשיר, ויכול להיות שזה משפיע על הקישוריות. כדי להמשיך, צריך לפתוח את ההגדרות ולאפשר שימוש ב-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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"לא ניתן להחזיק שיחות."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"יש להתחבר לרשת אלחוטית כדי לבצע שיחה."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"‏יש להפעיל את \'שיחות Wi-Fi\' כדי להתקשר."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"כדי להתקשר, צריך להפסיק את השימוש במצב לוויין."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"כדי להתקשר, צריך להתנתק מהחיבור הלווייני."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"‏אפשר לשלוח ולקבל הודעות ללא חיבור לרשת סלולרית או לרשת Wi-Fi"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"מידע למקרה חירום"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"בעלים"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"אפשר להקיש שוב כדי להציג את הפרטים"</string>
@@ -842,6 +846,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‏הגדרת eSIM נשלף כברירת המחדל"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"הפעלה של רדיו סלולרי"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"‏סימולציה של המצב \'לא בשירות\' (גרסת build לניפוי באגים בלבד)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"‏מצב שמדמה תקשורת לוויינית דרך ספק הסלולר (גרסת build לניפוי באגים בלבד)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"‏מצב בדיקה שמדמה תקשורת לוויינית eSOS (גרסת build לניפוי באגים בלבד)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‏הצגת פנקס כתובות של SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"הצגת מספרי חיוג קבועים"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"מספרי חיוג לשירות"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 91a1871..9642efc 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"通話設定"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"通話設定は管理者ユーザーのみが変更できます。"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"モバイル デバイスのアカウント設定を変更できるのは、管理者または従業員ユーザーのみに限られています。"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"デバイス所有者によって、モバイル ネットワークの設定を変更する機能が制限されています。"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"緊急通報以外の通話を発信するには、緊急通報待機モードを終了してください。"</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\nこのデバイスでは 2G が無効になっており、接続性に影響している可能性があります。続行するには、[設定] に移動し、[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\nこのデバイスでは 2G が無効になっており、接続性に影響している可能性があります。続行するには、[設定] に移動し、[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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"通話を保留にできません。"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"電話をかけるには無線ネットワークに接続してください。"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"電話をかけるには Wi-Fi 通話を有効にしてください。"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"電話をかけるには、衛星モードを無効にしてください。"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"通話を発信するには、まず衛星通信の接続を完了してください。"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"モバイル ネットワークや Wi-Fi ネットワークを使わずにメッセージを送受信できます。"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"緊急時情報"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"所有者"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"もう一度タップすると情報を確認できます"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"リムーバブル eSIM をデフォルトに設定"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"モバイル無線電力"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"圏外状態のシミュレート(デバッグビルドのみ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"携帯通信会社の疑似航空写真モード(デバッグビルドのみ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"実際に衛星経由の緊急 SOS モードをテストする(デバッグビルドのみ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM のアドレス帳を表示"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"発信番号制限を表示"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"サービス電話番号を表示"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index f4ca82e..0d673a6 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"ზარის პარამეტრები"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ზარის პარამეტრების შეცვლა მხოლოდ მომხმარებელ-ადმინისტრატორს შეუძლია."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ტელ. ანგარიშის პარამეტრების შეცვლა შეუძლია მხოლოდ ადმინს/სამსახურის მომხმარებელს."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"მოწყობილობის მფლობელმა შეზღუდა მობილური ქსელის პარამეტრების შეცვლის შესაძლებლობა."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"გამოდით გადაუდებელი გადმორეკვის რეჟიმიდან არაგადაუდებელი ზარის განსახორციელებლად."</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_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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ზარების დაყოვნება ვერ ხერხდება."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ზარის განსახორციელებლად, დაუკავშირდით უსადენო ქსელს."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ზარის განსახორციელებლად ჩართეთ Wi-Fi დარეკვა."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"დასარეკად გამორთეთ სატელიტის რეჟიმი."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"დასარეკად ჯერ დაასრულეთ სატელიტური კავშირი."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"შეგიძლიათ გაგზავნოთ და მიიღოთ შეტყობინებები მობილური ან Wi-Fi ქსელის გარეშე."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"საგანგებო ინფორმაცია"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"მფლობელი"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"ინფორმაციის სანახავად შეეხეთ ხელახლა"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"მოსახსნელი eSIM-ის ნაგულისხმევად დაყენება"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"მობილური რადიოკავშირის ელკვება"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"სიმულაცია სერვისის გარეშე (მხოლოდ გამართვის აგება)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"სიმულაციური ოპერატორის სატელიტის რეჟიმი (მხოლოდ გამართვის აგება)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"სატელიტური eSOS-ის რეალური რეჟიმის ტესტირება (მხოლოდ გამართვის მიზნით)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM-ის მისამართების წიგნის ნახვა"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"დაშვებული ნომრების ნახვა"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"სერვისის დარეკილი ნომრების ნახვა"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 72e9c7f..25ab94d 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Қоңырау параметрлері"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Қоңырау параметрлерін тек әкімші пайдаланушы өзгерте алады."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Телефонның аккаунт параметрлерін тек әкімші немесе жұмыстағы пайдаланушы өзгерте алады."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Құрылғының иесі мобильдік желі параметрлерін өзгертуге шектеу қойды."</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>
@@ -194,7 +195,7 @@
     <string name="choose_network_title" msgid="5335832663422653082">"Желі таңдау"</string>
     <string name="network_disconnected" msgid="8844141106841160825">"Желіге жалғанбаған"</string>
     <string name="network_connected" msgid="2760235679963580224">"Қосылды"</string>
-    <string name="network_connecting" msgid="160901383582774987">"Қосылуда…"</string>
+    <string name="network_connecting" msgid="160901383582774987">"Қосылып жатыр…"</string>
     <string name="network_could_not_connect" msgid="6547460848093727998">"Қосылмады"</string>
   <string-array name="preferred_network_mode_choices">
     <item msgid="4531933377509551889">"GSM/WCDMA таңдалған"</item>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Төтенше емес қоңырау шалу үшін төтенше қоңырауды кері шалу режимінен шығыңыз."</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\nОсы құрылғыдағы 2G функциясы өшірілген. Бұл байланыс жұмысына әсер етуі мүмкін. Жалғастыру үшін параметрлерге өтіп, \"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\nОсы құрылғыдағы 2G функциясы өшірілген. Бұл қосылу мүмкіндігіне әсер етуі мүмкін. Жалғастыру үшін \"Параметрлерге\" өтіп, \"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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Қоңырауларды ұстау мүмкін емес."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Қоңырау шалу үшін сымсыз желіге қосылыңыз."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Қоңырау шалу үшін, Wi-Fi желісін қосыңыз."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Қоңырау шалу үшін жер серігі режимін өшіріңіз."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Қоңырау шалу үшін алдымен жерсерік байланысын аяқтаңыз."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Мобильдік не Wi-Fi желісіне қосылмастан хабар алмаса аласыз."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Төтенше жағдайға арналған ақпарат"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Иесі"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Ақпаратты көру үшін қайта түртіңіз"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Алынбалы eSIM әдепкі етіп орнату"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Радиосигнал күші"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"Істен шыққан\" қызметін симуляциялау (түзету құрамасы ғана)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier жер серігі режимі (тек түзету құрамасы)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Шынайы жерсеріктегі құтқару қызметін шақыру режимін сынау (тек түзету құрамасы)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM мекенжай кітапшасын көру"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Рұқсат нөмірлерді көру"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Қызметтік теру нөмірлерін көру"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index d42deb0..e8084f9 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"កំណត់​ការ​ហៅ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ការកំណត់ការហៅអាចផ្លាស់ប្តូរបានដោយអ្នកប្រើដែលមានសិទ្ធិគ្រប់គ្រងតែប៉ុណ្ណោះ។"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"មានតែ​អ្នកគ្រប់គ្រង ឬអ្នកប្រើប្រាស់​ពាក់ព័ន្ធនឹងការងារ​ប៉ុណ្ណោះ ទើបអាចផ្លាស់ប្ដូរ​ការកំណត់​គណនី​ទូរសព្ទបាន។"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ម្ចាស់ឧបករណ៍បានរឹតបន្តឹង​លទ្ធភាព​ក្នុងការប្ដូរការកំណត់​បណ្ដាញ​ទូរសព្ទ​ចល័ត។"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"ចាកចេញពីរបៀបហៅទៅវិញពេលមានអាសន្នដើម្បីធ្វើការហៅធម្មតា។"</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_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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"មិនអាចរង់ចាំការហៅទេ"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ភ្ជាប់ទៅបណ្តាញឥតខ្សែដើម្បីធ្វើការហៅ។"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"បើក​ការ​ហៅ​តាម​​វ៉ាយហ្វាយ​ដើម្បី​ធ្វើ​ការ​ហៅ។"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"បិទ​មុខងារ​ផ្កាយរណប ដើម្បី​ហៅ​ទូរសព្ទ។"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ដើម្បីហៅទូរសព្ទ សូមបញ្ចប់ការតភ្ជាប់ផ្កាយរណបជាមុនសិន។"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"អ្នកអាចផ្ញើ និងទទួលសារដោយមិនប្រើបណ្ដាញទូរសព្ទចល័ត ឬ Wi-Fi។"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ព័ត៌មានសង្គ្រោះបន្ទាន់"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ម្ចាស់"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"ចុច​ម្ដង​ទៀត ដើម្បីមើល​ព័ត៌មាន"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"កំណត់ eSIM ដែល​អាចដកបាន​ជាលំនាំដើម"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ថាមពល​វិទ្យុ​ទូរសព្ទ​ចល័ត"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ត្រាប់តាម​ពេលគ្មានសេវា (កំណែបង្កើតសម្រាប់ជួសជុលតែប៉ុណ្ណោះ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"មុខងារ​ផ្កាយរណប​ក្រុមហ៊ុន​សេវាទូរសព្ទ​សាកល្បង (កំណែបង្កើត​សម្រាប់​ជួសជុល​តែប៉ុណ្ណោះ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"មុខងារ​ធ្វើតេស្ត eSOS ផ្កាយរណប​ជាក់ស្ដែង (កំណែបង្កើត​សម្រាប់​ជួសជុល​តែប៉ុណ្ណោះ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"មើលសៀវភៅអាសយដ្ឋានក្នុងស៊ីមកាត"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"មើល​លេខ​ហៅ​ថេរ"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"មើល​លេខ​ហៅ​សេវាកម្ម"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 58bcc3a..9feb53a 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"ಕರೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ಕರೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಕೇವಲ ನಿರ್ವಾಹಕ ಬಳಕೆದಾರರು ಮಾತ್ರ ಬದಲಾಯಿಸಬಹುದು."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ಫೋನ್ ಖಾತೆಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಾಹಕರು ಅಥವಾ ಕೆಲಸದ ಬಳಕೆದಾರರಿಂದ ಮಾತ್ರ ಬದಲಾಯಿಸಬಹುದಾಗಿದೆ."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ಸಾಧನದ ಮಾಲೀಕರು ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"ತುರ್ತು ರಹಿತ ಕರೆಯನ್ನು ಮಾಡಲು ತುರ್ತು ಮರು ಕರೆಮಾಡುವಿಕೆ ಮೋಡ್ ಅನ್ನು ನಿರ್ಗಮಿಸಿ."</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\nಈ ಸಾಧನದಲ್ಲಿ 2G ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ಇದು ನಿಮ್ಮ ಕನೆಕ್ಟಿವಿಟಿ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರಬಹುದು. ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ ಮತ್ತು ಮುಂದುವರಿಸಲು 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\nಈ ಸಾಧನದಲ್ಲಿ 2G ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ಇದು ನಿಮ್ಮ ಕನೆಕ್ಟಿವಿಟಿ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರಬಹುದು. ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಹೋಗಿ ಮತ್ತು ಮುಂದುವರಿಸಲು 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ಕರೆಗಳನ್ನು ಹೋಲ್ಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ಕರೆ ಮಾಡಲು ವೈರ್‌ಲೆಸ್ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ಕರೆ ಮಾಡಲು ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ಕರೆ ಮಾಡಲು ಸ್ಯಾಟಲೈಟ್ ಮೋಡ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ಕರೆ ಮಾಡಲು, ಮೊದಲು ಸ್ಯಾಟಲೈಟ್ ಕನೆಕ್ಷನ್ ಅನ್ನು ಕೊನೆಗೊಳಿಸಿ."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"ನೀವು ಮೊಬೈಲ್ ಅಥವಾ ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್ ಇಲ್ಲದೆಯೇ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಮತ್ತು ಸ್ವೀಕರಿಸಬಹುದು."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ತುರ್ತು ಮಾಹಿತಿ"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ಮಾಲೀಕರು"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಲು ಮತ್ತೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ತೆಗೆದುಹಾಕಬಹುದಾದ eSIM ಅನ್ನು ಡೀಫಾಲ್ಟ್ ಆಗಿ ಸೆಟ್ ಮಾಡಿ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ಮೊಬೈಲ್ ರೇಡಿಯೋ ಪವರ್"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ಸೇವೆಯಲ್ಲಿಲ್ಲದಿರುವುದನ್ನು ಸಿಮ್ಯುಲೇಟ್‌ ಮಾಡುವುದು (ಡೀಬಗ್ ಬಿಲ್ಡ್ ಮಾತ್ರ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier ಉಪಗ್ರಹ ಮೋಡ್ (ಡೀಬಗ್ ಬಿಲ್ಡ್ ಮಾತ್ರ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"ನೈಜ ಸ್ಯಾಟಲೈಟ್ eSOS ಮೋಡ್ ಅನ್ನು ಪರೀಕ್ಷಿಸಿ (ಡೀಬಗ್ ಬಿಲ್ಡ್ ಮಾತ್ರ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ಸಿಮ್ ವಿಳಾಸ ಪುಸ್ತಕವನ್ನು ವೀಕ್ಷಿಸಿ"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ಸ್ಥಿರ ಡಯಲಿಂಗ್ ಸಂಖ್ಯೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"ಸೇವಾ ಡಯಲಿಂಗ್ ಸಂಖ್ಯೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 6b403d9..5794600 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"통화 설정"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"관리자만 통화 설정을 변경할 수 있습니다."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"전화 계정 설정은 관리자 또는 직장 사용자만 변경할 수 있습니다."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"기기 소유자가 모바일 네트워크 설정 변경 기능을 제한했습니다."</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>
@@ -305,7 +306,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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"일반 전화를 걸려면 긴급 콜백 모드를 해제하세요."</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\n기기에서 2G가 사용 중지되어 있어 연결 상태에 영향을 줄 수 있습니다. 계속하려면 \'설정\'으로 이동하여 \'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\n이 기기에서 2G가 사용 중지되어 있으므로 연결에 영향을 미칠 수 있습니다. 계속하려면 \'설정\'으로 이동하여 \'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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"통화를 보류할 수 없습니다."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"전화를 걸려면 무선 네트워크에 연결하세요."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"전화를 걸려면 Wi-Fi 통화를 사용 설정하세요."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"전화를 걸려면 위성 모드를 사용 중지하세요."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"전화를 걸려면 먼저 위성 연결을 종료하세요."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Wi-Fi 또는 모바일 네트워크 없이 메시지를 주고받을 수 있습니다."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"긴급 상황 정보"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"소유자"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"정보를 보려면 다시 탭하세요."</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"삭제 가능한 eSIM을 기본으로 설정"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"모바일 무선 전력"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'서비스 지역 벗어남\' 시뮬레이션(디버그 빌드만 해당)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"모의 이동통신사 위성 모드(디버그 빌드만 해당)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"실제 위성 eSOS 모드 테스트(디버그 빌드만 해당)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM 주소록 보기"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"발신 허용 번호 보기"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"SDN(Service Dialing Numbers) 보기"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 3fca1ed..3b086e9 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Чалуу параметрлери"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Чалуу параметрлерин администратор гана өзгөртө алат."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Телефондогу аккаунттун параметрлерин администратор же жумуштагы колдонуучу гана өзгөртө алат."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Түзмөктүн ээси мобилдик тармактын параметрлерин өзгөртүүгө тыюу салды."</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>
@@ -524,7 +525,7 @@
     <string name="card_title_dialing" msgid="8742182654254431781">"Терилүүдө"</string>
     <string name="card_title_redialing" msgid="18130232613559964">"Кайра терүү"</string>
     <string name="card_title_conf_call" msgid="901197309274457427">"Конференц-чалуу"</string>
-    <string name="card_title_incoming_call" msgid="881424648458792430">"Кирүүчү чалуу"</string>
+    <string name="card_title_incoming_call" msgid="881424648458792430">"Чалып жатат"</string>
     <string name="card_title_call_ended" msgid="650223980095026340">"Чалуу аяктады"</string>
     <string name="card_title_on_hold" msgid="9028319436626975207">"Күтүлүүдө"</string>
     <string name="card_title_hanging_up" msgid="814874106866647871">"Телефон коюлууда"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Кадимки шартта чалуу үчүн шашылыш кайра чалуу режиминен чыгыңыз."</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\nБул түзмөктө 2G өчүрүлгөндүктөн, байланышка таасирин тийгизиши мүмкүн. Улантуу үчүн параметрлерге өтүп, \"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\nБул түзмөктө 2G өчүрүлгөндүктөн, байланышка таасирин тийгизиши мүмкүн. Улантуу үчүн параметрлерге өтүп, \"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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Чалууну кармап туруу мүмкүн эмес."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Чалуу үчүн зымсыз тармакка туташыңыз."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Wi-Fi аркылуу чалыңыз."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Чалуу үчүн спутникти өчүрүңүз."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Чалуу үчүн, адегенде спутникке туташыңыз."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Мобилдик же Wi-Fi тармагы жок эле билдирүүлөрдү жөнөтүп, ала аласыз."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Кырсыктаганда керек болчу маалымат"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Ээси"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Маалыматты көрүү үчүн кайра таптап коюңуз"</string>
@@ -769,19 +773,19 @@
     <string name="sum_call_barring_enabled" msgid="5184331188926370824">"Күйүк"</string>
     <string name="sum_call_barring_disabled" msgid="5699448000600153096">"Өчүк"</string>
     <string name="call_barring_baoc" msgid="7400892586336429326">"Чыгуучу чалуулардын баары"</string>
-    <string name="call_barring_baoc_enabled" msgid="3131509193386668182">"Чыгуучу чалуулардын баарын бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baoc_enabled" msgid="3131509193386668182">"Чыгуучу чалуулардын баарын бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baoc_disabled" msgid="8534224684091141509">"Чыгуучу чалуулардын баары бөгөттөлсүнбү?"</string>
     <string name="call_barring_baoic" msgid="8668125428666851665">"Эл аралык чыгуучу чалуу"</string>
-    <string name="call_barring_baoic_enabled" msgid="1203758092657630123">"Эл аралык чыгуучу чалууларды бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baoic_enabled" msgid="1203758092657630123">"Эл аралык чыгуучу чалууларды бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baoic_disabled" msgid="5656889339002997449">"Эл аралык чыгуучу чалуулар бөгөттөлсүнбү?"</string>
     <string name="call_barring_baoicr" msgid="8566167764432343487">"Роумингдеги эл аралык чыгуучу чалуулар"</string>
-    <string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"Роумингдеги эларалык чыгуучу чалууларды бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baoicr_enabled" msgid="1615324165512798478">"Роумингдеги эларалык чыгуучу чалууларды бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baoicr_disabled" msgid="172010175248142831">"Роумингдеги эларалык чыгуучу чалуулар бөгөттөлсүнбү?"</string>
     <string name="call_barring_baic" msgid="7941393541678658566">"Кирүүчү чалуулардын баары"</string>
-    <string name="call_barring_baic_enabled" msgid="4357332358020337470">"Кирүүчү чалуулардын баарын бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <string name="call_barring_baic_enabled" msgid="4357332358020337470">"Кирүүчү чалуулардын баарын бөгөттөө функциясын өчүрөсүзбү?"</string>
     <string name="call_barring_baic_disabled" msgid="2355945245938240958">"Кирүүчү чалуулардын баары бөгөттөлсүнбү?"</string>
     <string name="call_barring_baicr" msgid="8712249337313034226">"Роумингдеги эл аралык кирүүчү чалуу"</string>
-    <string name="call_barring_baicr_enabled" msgid="64774270234828175">"Роумингдеги эл аралык кирүүчү чалууларды бөгөттөө функциясы өчүрүлсүнбү?"</string>
+    <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>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Чыгарылуучу eSIM-картаны демейки катары коюу"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мобилдик радионун кубаты"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Тейлөө аймагынын сыртында режимин иштетүү (Мүчүлүштүктөрдү оңдоо үчүн гана)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Симуляцияланган байланыш операторунун спутниги (Мүчүлүштүктөрдү оңдоо үчүн гана)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Чыныгы спутник eSOS режимин сыноо (Мүчүлүштүктөрдү оңдоо үчүн гана)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM картадагы дарек китепчесин көрүү"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Туруктуу терүү номерлерин көрүү"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Кызматтык терүү номерлерин көрүү"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 10ddb89..d771fe3 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"ການຕັ້ງຄ່າການໂທ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ມີ​ແຕ່​ຜູ້​ໃຊ້​ທີ່​ເປັນ​ຜູ້ດູແລລະບົບ​ເທົ່າ​ນັ້ນ​ທີ່​ສາ​ມາດ​ປ່ຽນການ​ຕັ້ງ​ຄ່າ​ການ​ໂທ​ໄດ້."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ສະເພາະຜູ້ເບິ່ງແຍງລະບົບ ຫຼື ຜູ້ໃຊ້ຢູ່ບ່ອນເຮັດວຽກເທົ່ານັ້ນທີ່ສາມາດປ່ຽນການຕັ້ງຄ່າບັນຊີຂອງໂທລະສັບໄດ້."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ເຈົ້າຂອງອຸປະກອນໄດ້ຈຳກັດຄວາມສາມາດໃນການປ່ຽນການຕັ້ງຄ່າເຄືອຂ່າຍມືຖື."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"ອອກ​ຈາກໂໝດ​ໂທ​ກັບ​ສຸກ​ເສີນ ເພື່ອ​ເຮັດ​ການ​ໂທ​ປົກກະຕິ."</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">"ບໍ່ສາມາດໃຊ້ອິນເຕີເນັດມືຖືໄດ້. ກະລຸນາເຊື່ອມຕໍ່ຫາ Wi-Fi ເພື່ອໂທ."</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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ບໍ່ສາມາດພັກສາຍໄດ້."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍໄຮ້ສາຍເພື່ອເຮັດການໂທ."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ກະລຸນາເປີດໃຊ້ການໂທ Wi-Fi ເພື່ອໂທ."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ປິດການນຳໃຊ້ໂໝດດາວທຽມເພື່ອໂທອອກ."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ເພື່ອໂທອອກ, ໃຫ້ສິ້ນສຸດການເຊື່ອມຕໍ່ຜ່ານດາວທຽມກ່ອນ."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"ທ່ານສາມາດສົ່ງ ແລະ ຮັບຂໍ້ຄວາມໂດຍບໍ່ຕ້ອງໃຊ້ເຄືອຂ່າຍມືຖື ຫຼື Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ຂໍ້ມູນສຸກເສີນ"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ເຈົ້າຂອງ"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"ແຕະອີກເທື່ອໜຶ່ງເພື່ອເບິ່ງຂໍ້ມູນ"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ຕັ້ງຄ່າ eSIM ແບບຖອດໄດ້ໃຫ້ເປັນຄ່າເລີ່ມຕົ້ນ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ພະລັງງານວິທະຍຸມືຖື"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"ຈໍາລອງເຫດການບໍ່ພ້ອມໃຫ້ບໍລິການ (ສໍາລັບ Build ດີບັກເທົ່ານັ້ນ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ຈຳລອງໂໝດດາວທຽມຂອງຜູ້ໃຫ້ບໍລິການ (ສຳລັບ Build ດີບັກເທົ່ານັ້ນ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"ທົດສອບໂໝດ eSOS ດາວທຽມແທ້ (ສຳລັບ Build ດີບັກເທົ່ານັ້ນ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ເບິ່ງສະໝຸດທີ່ຢູ່ໃນຊິມ"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ເບິ່ງໝາຍເລກໂທອອກທີ່ກຳນົດ"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"ເບິ່ງໝາຍເລກບໍລິການໂທອອກ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 9e1a340..3034573 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Skambinimo nustatymai"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Skambučių nustatymus gali keisti tik administruojantis naudotojas."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Telefono paskyros nustatymus gali keisti tik administratorius arba darbo paskyros naudotojas."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Įrenginio savininkas apribojo galimybę keisti mobiliojo ryšio tinklo nustatymus."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Nustatymai (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Skambinimo nustatymų klaida"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Analizuojami nustatymai..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Jei norite skambinti ne pagalbos numeriu, išjunkite atgalinio skambinimo pagalbos numeriu režimą."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Neregistruota tinkle."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilusis tinklas negalimas."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobiliojo ryšio tinklas nepasiekiamas.\n\nPrisijunkite prie belaidžio ryšio tinklo, kad galėtumėte skambinti.\n\n2G išjungtas šiame įrenginyje, o tai gali paveikti jūsų ryšį. Eikite į skiltį „Nustatymai“ ir įgalinkite funkciją „Leisti 2G“, kad galėtumėte tęsti."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobiliojo ryšio tinklas nepasiekiamas. Prisijunkite prie belaidžio ryšio tinklo, kad galėtumėte skambinti."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobiliojo ryšio tinklas nepasiekiamas.\n\nPrisijunkite prie belaidžio ryšio tinklo, kad galėtumėte skambinti.\n\n2G išjungtas šiame įrenginyje, o tai gali paveikti jūsų ryšį. Eikite į skiltį „Nustatymai“ ir įgalinkite funkciją „Leisti 2G“, kad galėtumėte tęsti."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Kad galėtumėte paskambinti, įveskite tinkamą numerį."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Paskambinti nepavyko."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Šiuo metu skambučio pridėti negalima. Galite pabandyti susisiekti išsiųsdami pranešimą."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Negalima sulaikyti skambučių."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Prisijunkite prie belaidžio ryšio tinklo, kad galėtumėte skambinti."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Įgalinkite „Wi-Fi“ skambinimą, kad galėtumėte skambinti."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Išjunkite satelito režimą, kad galėtumėte skambinti."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Jei norite skambinti, pirmiausia nutraukite palydovinį ryšį."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Galite siųsti ir gauti pranešimus be mobiliojo ryšio ar „Wi-Fi“ tinklo."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Kritinės padėties informacija"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Savininkas"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Palieskite dar kartą, kad peržiūrėtumėte informaciją"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nustatyti pašalinimą „eSIM“ kaip numatytąją"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiliojo ryšio radijo signalas"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Modeliavimas neteikiamas (tik derinimo versija)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Netikras operatoriaus satelito režimas (tik derinimo versija)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Išbandykite tikrą Pagalbos iškvietimo kritiniu atveju naudojant palydovinį ryšį režimą (tik derinimo versija)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Žiūrėti SIM kortelės adresų knygą"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Žiūrėti fiksuotojo rinkimo numerius"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Žiūrėti paslaugos renkamus numerius"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 90165b8..10a7a49 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Zvanu iestatījumi"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Tikai lietotājs ar administratora tiesībām var mainīt zvanu iestatījumus."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Tikai administrators vai primārais lietotājs var mainīt tālruņa konta iestatījumus."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Ierīces īpašnieks ir ierobežojis iespēju mainīt mobilā tīkla iestatījumus."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Iestatījumi (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Zvanu iestatījumu kļūda"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Notiek iestatījumu lasīšana..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Lai veiktu parastu zvanu, izejiet no ārkārtas atzvana režīma."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Tīklā nav reģistrēts."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilais tīkls nav pieejams."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilais tīkls nav pieejams.\n\nLai veiktu zvanu, izveidojiet savienojumu ar bezvadu tīklu.\n\nŠajā ierīcē ir atspējots 2G, un tas var ietekmēt jūsu savienojamību. Lai turpinātu, pārejiet uz iestatījumiem un iespējojiet opciju “Atļaut 2G”."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilais tīkls nav pieejams. Lai veiktu zvanu, izveidojiet savienojumu ar bezvadu tīklu."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilais tīkls nav pieejams.\n\nLai veiktu zvanu, izveidojiet savienojumu ar bezvadu tīklu.\n\nŠajā ierīcē ir atspējots 2G, un tas var ietekmēt jūsu savienojamību. Lai turpinātu, pārejiet uz iestatījumiem un iespējojiet opciju “Atļaut 2G”."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Lai veiktu zvanu, ievadiet derīgu numuru."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Zvans neizdevās."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Pašlaik nevar pievienot zvanu. Varat mēģināt sūtīt īsziņu."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Nevar aizturēt zvanus."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Lai veiktu zvanu, izveidojiet savienojumu ar bezvadu tīklu."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Lai veiktu zvanu, iespējojiet Wi-Fi zvanus."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Lai zvanītu, atspējojiet satelīta režīmu."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Lai veiktu zvanu, vispirms pārtrauciet savienojumu ar satelītu."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Varat sūtīt un saņemt ziņojumus bez mobilā vai Wi-Fi tīkla."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Ārkārtas informācija"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Īpašnieks"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Pieskarieties vēlreiz, lai skatītu informāciju."</string>
@@ -840,7 +844,9 @@
     <string name="dsds_dialog_cancel" msgid="3245958947099586655">"Atcelt"</string>
     <string name="removable_esim_string" msgid="7931369811671787649">"Iestatīt noņemamu eSIM kā noklusējumu"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobilā tālruņa radio signāla stiprums"</string>
-    <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulācijas ierīce nedarbojas (tikai būvējuma atkļūdošana)"</string>
+    <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulācijas ierīce nedarbojas (tikai atkļūdošanas būvējums)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mobilo sakaru operatora satelīta režīma imitēšana (tikai atkļūdošanas būvējums)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Izmēģināt īsta satelīta eSOS režīmu (tikai atkļūdošanas būvējumā)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Skatīt SIM adrešu grāmatu"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Skatīt ierobežotā zvanu saraksta numurus"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Pakalpojuma iezvanes numuru skatīšana"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index fd24053..450fce0 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Поставки за повици"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Поставките за повик може да ги измени само администраторскиот корисник."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Поставките за сметката на телефонот може да ги промени само администраторот или деловниот корисник."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Сопственикот на уредот ја ограничил можноста за менување на поставките за мобилната мрежа."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Излезете од режимот на итен повратен повик за да направите обичен повик."</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_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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Не може да се задржат повици."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Поврзете се на безжична мрежа за да повикате."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Овозможете повикување преку Wi-Fi за воспоставување повик."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Исклучете го режимот на сателит за да упатите повик."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"За да воспоставите повик, прво завршете ја сателитската врска."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Може да испраќате и примате пораки без мобилна или Wi-Fi мрежа."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Податоци за итни случаи"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Сопственик"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Допрете повторно за приказ на информации"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Поставување eSIM што може да се отстрани како стандардна"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Радио-напојување на мобилен"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Симулирање „Надвор од употреба“ (само за верзиите за отстранување грешки)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Симулација на режим на сателит за оператор (само за верзиите за отстранување грешки)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Тестирајте го реалниот режим на eSOS (само во верзијата за отстранување грешки)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Прикажи именик на SIM-картичката"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Прикажи броеви со ограничено бирање"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Прикажи броеви за бирање служби"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index b0785bb..3f8935c 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"കോൾ ക്രമീകരണങ്ങൾ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"അഡ്മിൻ ഉപയോക്താവിന് മാത്രമേ കോൾ ക്രമീകരണം മാറ്റാൻ കഴിയൂ."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"അഡ്‌മിനോ ഔദ്യോഗിക ഉപയോക്താവിനോ മാത്രമേ ഫോൺ അക്കൗണ്ട് ക്രമീകരണം മാറ്റാനാകൂ."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ഉപകരണത്തിന്റെ ഉടമ, മൊബൈൽ നെറ്റ്‌വർക്ക് ക്രമീകരണം മാറ്റാനുള്ള ശേഷി നിയന്ത്രിച്ചിരിക്കുന്നു."</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>
@@ -535,14 +536,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">"അടിയന്തിരമല്ലാത്ത കോൾ ചെയ്യാൻ അടിയന്തിര കോൾബാക്ക് മോഡിൽ നിന്ന് പുറത്തുകടക്കുക."</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\nഈ ഉപകരണത്തിൽ 2G പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു, അത് നിങ്ങളുടെ കണക്റ്റിവിറ്റിയെ ബാധിച്ചേക്കാം. തുടരാൻ, ക്രമീകരണത്തിലേക്ക് പോയി 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\nഈ ഉപകരണത്തിൽ 2G പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു, അത് നിങ്ങളുടെ കണക്റ്റിവിറ്റിയെ ബാധിച്ചേക്കാം. തുടരാൻ, ക്രമീകരണത്തിലേക്ക് പോയി 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"കോളുകൾ ഹോൾഡുചെയ്യാൻ കഴിയില്ല."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ഒരു കോൾ വിളിക്കാൻ വയർലെസ്സ് നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"കോൾ ചെയ്യാൻ Wi-Fi കോളിംഗ് പ്രവർത്തനക്ഷമമാക്കുക."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"കോൾ ചെയ്യാൻ സാറ്റലൈറ്റ് മോഡ് പ്രവർത്തനരഹിതമാക്കുക."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ഒരു കോൾ ചെയ്യുന്നതിന്, ആദ്യം സാറ്റലൈറ്റ് കണക്ഷൻ അവസാനിപ്പിക്കുക."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"മൊബൈൽ അല്ലെങ്കിൽ വൈഫൈ നെറ്റ്‌വർക്ക് ഇല്ലാതെ തന്നെ നിങ്ങൾക്ക് സന്ദേശങ്ങൾ അയയ്ക്കാനും സ്വീകരിക്കാനും കഴിയും."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"അടിയന്തര വിവരം"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ഉടമ"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"വിവരങ്ങൾ കാണാൻ വീണ്ടും ടാപ്പ് ചെയ്യുക"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"നീക്കം ചെയ്യാവുന്ന ഇ-സിം ഡിഫോൾട്ടായി സജ്ജീകരിക്കുക"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"മൊബൈൽ റേഡിയോ പവർ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"സേവനം ലഭ്യമല്ലെന്ന് അനുകരിക്കുക (ഡീബഗ് ബിൽഡ് മാത്രം)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock സേവനദാതാവ് ഉപഗ്രഹ മോഡ് (ഡീബഗ് ബിൽഡ് മാത്രം)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"യഥാർത്ഥ സാറ്റലൈറ്റ് eSOS മോഡ് പരീക്ഷിക്കുക (ഡീബഗ് ബിൽഡ് മാത്രം)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"സിം വിലാസ പുസ്‌തകം കാണുക"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"സ്ഥിര ഡയലിംഗ് നമ്പറുകൾ കാണുക"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"സർവീസ് ഡയലിംഗ് നമ്പറുകൾ കാണുക"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 712042a..ea2421c 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>
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Дуудлагын тохиргоо"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Дуудлагын тохиргоог зөвхөн админ хэрэглэгч солих боломжтой."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Утасны бүртгэлийн тохиргоог зөвхөн админ эсвэл ажлын хэрэглэгч өөрчлөх боломжтой."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Төхөөрөмжийн өмчлөгч хөдөлгөөнт холбооны сүлжээний тохиргоог өөрчлөх чадамжийг хязгаарласан."</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>
@@ -173,7 +174,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 +306,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,14 +536,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_wfc" msgid="4497663185857190885">"Мобайл сүлжээнд холбогдох боломжгүй байна. Дуудлага хийхийн тулд утасгүй интернетэд холбогдоно уу."</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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Дуудлагыг хадгалах боломжгүй байна."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Дуудлага хийхийн тулд утасгүй интернетэд холбогдоно уу."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Дуудлага хийхийн тулд Wi-Fi дуудлагыг идэвхжүүлнэ үү."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Дуудлага хийхийн тулд хиймэл дагуулын горимыг идэвхгүй болгоно уу."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Дуудлага хийхийн тулд эхлээд хиймэл дагуулын холболтыг дуусгана уу."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Та мобайл эсвэл Wi-Fi сүлжээгүйгээр мессеж илгээх болон хүлээн авах боломжтой."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Яаралтай тусламжийн мэдээлэл"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Эзэмшигч"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Мэдээллийг үзэхийн тулд дахин товшино уу"</string>
@@ -714,7 +718,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>
@@ -821,10 +825,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>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Салгах боломжтой eSIM-г өгөгдмөлөөр тохируулах"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мобайл радио цахилгаан"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Үйлчилгээний хүрээнээс гарсан нөхцөл байдлыг загварчлах (зөвхөн дебагийн хийц)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Оператор компанийн хуурамч хиймэл дагуулын горим (зөвхөн дебаг хийсэн хийц)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Жинхэнэ хиймэл дагуул eSOS горимыг турших (зөвхөн дебаг хийсэн хийц)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM хаягийн лавлахыг харах"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Залгахаар тохируулсан дугаарыг харах"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Үйлчилгээний залгах дугаарыг харах"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 1201657..2975abd 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"कॉल सेटिंग्ज"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"कॉल सेटिंग्ज केवळ प्रशासक वापरकर्त्याद्वारे बदलल्‍या जाऊ शकतात."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"फोन खाते सेटिंग्ज फक्त ॲडमिन किंवा ऑफिसच्या वापरकर्त्याद्वारे बदलली जाऊ शकतात."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"डिव्हाइसच्या मालकाने मोबाइल नेटवर्क सेटिंग्ज बदलण्याची क्षमता प्रतिबंधित केली आहे."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"आणीबाणी नसलेला कॉल करण्‍यासाठी आणीबाणी कॉलबॅक मोडमधून बाहेर पडा."</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\nया डिव्हाइसवर 2G बंद केले आहे, ज्यामुळे तुमच्या कनेक्टिव्हिटीवर परिणाम होत असेल. सेटिंग्ज वर जा आणि पुढे सुरू ठेवण्यासाठी 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\nया डिव्हाइसवर 2G बंद केले आहे, ज्यामुळे तुमच्या कनेक्टिव्हिटीवर परिणाम होत असेल. सेटिंग्ज वर जा आणि पुढे सुरू ठेवण्यासाठी 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"कॉल सुरू ठेवू शकत नाही."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"कॉल करण्‍यासाठी वायरलेस नेटवर्कशी कनेक्‍ट करा."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"कॉल करण्यासाठी वाय-फाय कॉलिंग सक्षम करा."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"कॉल करण्यासाठी उपग्रह मोड बंद करा."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"कॉल करण्यासाठी, सर्वप्रथम उपग्रह कनेक्शन बंद करा."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"तुम्ही मोबाइल किंवा वाय-फाय नेटवर्कशिवाय मेसेज पाठवू आणि मिळवू शकता."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"अतिमहत्त्वाची माहिती"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"मालक"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"माहिती पाहण्यासाठी पुन्हा टॅप करा"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"काढून टाकण्यायोग्य eSIM डीफॉल्ट म्हणून सेट करा"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"मोबाइल रेडिओ पॉवर"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"सेवा बंद आहे सिम्युलेट करा (फक्त डीबगचा बिल्‍ड)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"नमुना वाहकाचा उपग्रह मोड (फक्त डीबग बिल्ड)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"प्रत्यक्ष सॅटेलाइट eSOS मोडची चाचणी करा (फक्त डीबग बिल्ड)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"सिम ॲड्रेस बुक पहा"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"निश्चित डायलिंग नंबर पहा"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"सर्व्हिस डायलिंग नंबर पहा"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 18b47c2..b7e25ca 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Tetapan panggilan"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Tetapan panggilan hanya boleh diubah oleh pengguna pentadbir."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Tetapan akaun telefon hanya boleh ditukar oleh pentadbir atau pengguna di tempat kerja."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Pemilik peranti telah mengehadkan keupayaan untuk menukar tetapan rangkaian mudah alih."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Tetapan (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Ralat tetapan panggilan"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Membaca tetapan..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Keluar daripada mod panggil balik kecemasan untuk membuat panggilan bukan kecemasan."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Tidak didaftarkan pada rangkaian."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Rangkaian mudah alih tidak tersedia."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Rangkaian mudah alih tidak tersedia.\n\nBuat sambungan kepada rangkaian wayarles untuk membuat panggilan.\n\n2G dilumpuhkan pada peranti ini, yang mungkin menjejaskan kesambungan anda. Akses Tetapan dan dayakan Benarkan 2G untuk meneruskan kesambungan."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Rangkaian selular tidak tersedia. Sambung ke rangkaian wayarles untuk membuat panggilan."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Rangkaian mudah alih tidak tersedia.\n\nSambungkan kepada rangkaian wayarles untuk membuat panggilan.\n\n2G dilumpuhkan pada peranti ini, yang mungkin menjejaskan kesambungan anda. Akses Tetapan dan dayakan Benarkan 2G untuk meneruskan kesambungan."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Untuk membuat panggilan, masukkan nombor yang sah."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Panggilan gagal."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Panggilan tidak dapat ditambahkan pada masa ini. Anda boleh cuba menghantar mesej untuk berhubung."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Tidak dapat menunda panggilan."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Sambungkan ke rangkaian wayarles untuk membuat panggilan."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Dayakan panggilan Wi-Fi untuk membuat panggilan."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Lumpuhkan mod satelit untuk membuat panggilan."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Untuk membuat panggilan, tamatkan sambungan satelit dahulu."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Anda boleh menghantar dan menerima mesej tanpa rangkaian mudah alih atau Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Maklumat kecemasan"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Pemilik"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Ketik lagi untuk melihat maklumat"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Tetapkan eSIM Boleh Tanggal sebagai Lalai"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Kuasa Radio Mudah Alih"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulasi Rosak (Binaan Penyahpepijatan sahaja)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Contoh Mod Satelit Pembawa (Binaan Penyahpepijatan sahaja)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Uji mod sSOS satelit sebenar (Binaan Penyahpepijatan sahaja)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Lihat Buku Alamat SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Lihat Nombor Dailan Tetap"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Lihat Nombor Dailan Perkhidmatan"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 0f4321a..59182a3 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"ဖုန်းခေါ်ဆိုခြင်း ဆက်တင်များ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ခေါ်ဆိုမှုကြိုတင်ပြင်ဆင်ချက်များကို ကြီးကြပ်သူသာလျှင် ပြောင်းလဲနိုင်သည်။"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ဖုန်းအကောင့်ဆက်တင်များကို စီမံခန့်ခွဲသူ (သို့) ဝန်ထမ်းကသာ ပြောင်းနိုင်သည်။"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"စက်ပစ္စည်းပိုင်ရှင်သည် မိုဘိုင်းကွန်ရက်ဆက်တင်များ ပြောင်းခွင့်ကို ကန့်သတ်ထားသည်။"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"အရေးပေါ် မဟုတ်သည့် ခေါ်ဆိုမှုကို ပြုလုပ်ရန် အရေးပေါ် ဖုန်းခေါ်မှုမှ ထွက်ပါ။"</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\nဤစက်တွင် 2G ကိုပိတ်ထားပြီး ၎င်းက သင့်ချိတ်ဆက်နိုင်မှုအပေါ် သက်ရောက်နိုင်သည်။ ဆက်တင်များသို့သွားပြီး ရှေ့ဆက်ရန် 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\nဤစက်တွင် 2G ကိုပိတ်ထားပြီး ၎င်းက သင့်ချိတ်ဆက်နိုင်မှုအပေါ် သက်ရောက်နိုင်သည်။ ဆက်တင်များသို့သွားပြီး ရှေ့ဆက်ရန် 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ခေါ်ဆိုမှုများကို ကိုင်ထား၍မရပါ။"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ဖုန်းခေါ်ရန် ကြိုးမဲကွန်ယက်တစ်ခုသို့ ချိတ်ဆက်ပါ။"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ဖုန်းဆက်ရန် Wi-Fi ခေါ်ဆိုခြင်းကို ဖွင့်ပါ။"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ဖုန်းခေါ်ရန် ဂြိုဟ်တုမုဒ် ပိတ်ပါ။"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ဖုန်းခေါ်ရန်အတွက် ဂြိုဟ်တုချိတ်ဆက်မှုကို အရင်ဖြုတ်ပါ။"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"မိုဘိုင်း (သို့) Wi-Fi ကွန်ရက်မရှိဘဲ မက်ဆေ့ဂျ်များကို ပို့နိုင်၊ လက်ခံနိုင်သည်။"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"အရေးပေါ် အချက်အလက်"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ပိုင်ရှင်"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"အချက်အလက်ကြည့်ရန် ထပ်နှိပ်ပါ"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ဖယ်ရှားနိုင်သော eSIM ကို မူရင်းအဖြစ် သတ်မှတ်ရန်"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"မိုဘိုင်း ရေဒီယိုစွမ်းအား"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"အသွင်တူပြုလုပ်သောစက် အလုပ်မလုပ်ပါ (အမှားရှာပြင်ခြင်းသာလျှင်)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock Carrier Satellite Mode (အမှားရှာပြင်ခြင်း အတွက်သာ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"ဂြိုဟ်တုအစစ် eSOS မုဒ်ကို စမ်းသပ်ခြင်း (အမှားရှာပြင်ခြင်းအတွက်သာ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM ထဲရှိ လိပ်စာ စာအုပ်ကိုကြည့်ပါ"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ခေါ်ဆိုရန် ကန့်သတ် နံပါတ်ကို ကြည့်မည်"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"ခေါ်ဆိုသည့်ဝန်ဆောင်မှုနံပါတ်အားကြည့်မည်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index fb8a4fe..b62d14e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Samtaleinnstillinger"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Anropsinnstillinger kan bare endres av administratoren."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Kontoinnstillingene for telefonen kan bare endres av administratoren eller jobbrukeren."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Enhetseieren har begrenset muligheten til å endre innstillingene for mobilnettverk."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Innstillinger (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Feil ved samtaleinnstillinger"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Leser innstillingene …"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Avslutt modusen for nødanrop for å gjøre et vanlig anrop."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ikke registrert på nettverket."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilnettverket er ikke tilgjengelig."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilnettverk er ikke tilgjengelig.\n\nKoble til et trådløst nettverk for å ringe.\n\n2G er deaktivert på denne enheten – dette kan påvirke tilkoblingen. Gå til Innstillinger og aktiver «Tillat 2G» for å fortsette."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilnettverk er ikke tilgjengelig. Koble til et trådløst nettverk for å ringe."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilnettverk er ikke tilgjengelig.\n\nKoble til et trådløst nettverk for å ringe.\n\n2G er deaktivert på denne enheten – dette kan påvirke tilkoblingen. Gå til Innstillinger og aktiver «Tillat 2G» for å fortsette."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Skriv inn et gyldig nummer for å plassere en samtale."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Anropet mislyktes."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Kan ikke legge til anropet akkurat nå. Du kan prøve å ta kontakt ved å sende en melding."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Kan ikke sette samtaler på vent."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Koble til et trådløst nettverk for å ringe."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Slå på telefonanrop via Wifi for å ringe."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Slå av satellittmodus for å ringe."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Du må avslutte satellittilkoblingen før du kan ringe."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Du kan sende og motta meldinger uten mobil- eller wifi-nettverk"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Nødinformasjon"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Eier"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Trykk på nytt for å se informasjon"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Angi flyttbart eSIM-kort som standard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Strømforsyning for mobilradio"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Ute av drift-simulering (bare for feilsøkingsversjoner)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satelittmodus for fiktiv operatør (feilsøkingsversjon)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Test ekte satellitt med eSOS-modus (kun for feilsøkingsversjoner)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Se adressebok for SIM-kort"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Vis forhåndsbestemte numre"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Vis tjenestenumre"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 4428df0..f63b198 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"कल सेटिङहरू"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"कल सेटिङहरू केवल प्रशासकीय प्रयोगकर्ताद्वारा परिवर्तन गर्न सकिन्छ।"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"एड्मिन वा कार्य प्रोफाइलका प्रयोगकर्ता मात्र फोनमा लिंक गरिएको खाताका सेटिङ बदल्न सक्नुहुन्छ।"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"डिभाइसका मालिकले मोबाइल नेटवर्कसम्बन्धी सेटिङ परिवर्तन गर्न रोक लगाउनुभएको छ।"</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>
@@ -187,12 +188,12 @@
     <string name="manual_mode_disallowed_summary" msgid="3970048592179890197">"%1$s मा जडान हुँदा उपलब्ध छैन"</string>
     <string name="network_select_title" msgid="4117305053881611988">"नेटवर्क"</string>
     <string name="register_automatically" msgid="3907580547590554834">"स्वतः दर्ता..."</string>
-    <string name="preferred_network_mode_title" msgid="5253395265169539830">"रुचाइएको सञ्जाल प्रकार"</string>
+    <string name="preferred_network_mode_title" msgid="5253395265169539830">"रुचाइएको नेटवर्कको प्रकार"</string>
     <string name="preferred_network_mode_summary" msgid="3787989000044330064">"नेटवर्क संचालन मोड परिवर्तन गर्नुहोस्"</string>
-    <string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"रुचाइएको सञ्जाल प्रकार"</string>
+    <string name="preferred_network_mode_dialogtitle" msgid="2781447433514459696">"रुचाइएको नेटवर्कको प्रकार"</string>
     <string name="forbidden_network" msgid="5081729819561333023">"(निषेध गरिएको)"</string>
     <string name="choose_network_title" msgid="5335832663422653082">"नेटवर्क छनौट गर्नुहोस्‌"</string>
-    <string name="network_disconnected" msgid="8844141106841160825">"जडान विच्छेद गरियो"</string>
+    <string name="network_disconnected" msgid="8844141106841160825">"जडान डिस्कनेक्ट गरियो"</string>
     <string name="network_connected" msgid="2760235679963580224">"जडान गरियो"</string>
     <string name="network_connecting" msgid="160901383582774987">"जडान गरिँदै छ..."</string>
     <string name="network_could_not_connect" msgid="6547460848093727998">"जडान गर्न सकिएन"</string>
@@ -306,7 +307,7 @@
     <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="data_usage_disable_mobile" msgid="5669109209055988308">"मोबाइल डेटा निष्क्रिय पार्ने हो?"</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">"डेटा सिम परिवर्तन गर्ने हो?"</string>
     <string name="sim_change_data_message" msgid="3567358694255933280">"मोबाइल डेटाका लागि <xliff:g id="OLD_SIM">%2$s</xliff:g> को सट्टा <xliff:g id="NEW_SIM">%1$s</xliff:g> को प्रयोग गर्ने हो?"</string>
@@ -482,8 +483,8 @@
     <string name="fdn_failed" msgid="216592346853420250">"FDN कार्य बिफल भयो।"</string>
     <string name="simContacts_emptyLoading" msgid="4989040293858675483">"SIM कार्ड पढ्दै..."</string>
     <string name="simContacts_empty" msgid="1135632055473689521">"तपाईँको SIM कार्डमा कुनै पनि सम्पर्क छैन।"</string>
-    <string name="simContacts_title" msgid="2714029230160136647">"सम्पर्कहरू आयात गर्न चयन गर्नुहोस्"</string>
-    <string name="simContacts_airplaneMode" msgid="4654884030631503808">"SIM कार्डबाट सम्पर्कहरू आयात गर्न हवाइजहाज मोड बन्द गर्नुहोस्।"</string>
+    <string name="simContacts_title" msgid="2714029230160136647">"कन्ट्याक्टहरू इम्पोर्ट गर्न चयन गर्नुहोस्"</string>
+    <string name="simContacts_airplaneMode" msgid="4654884030631503808">"SIM कार्डबाट कन्ट्याक्टहरू इम्पोर्ट गर्न हवाइजहाज मोड बन्द गर्नुहोस्।"</string>
     <string name="enable_pin" msgid="967674051730845376">"SIM PIN सक्षम/अक्षम गर्नुहोस्"</string>
     <string name="change_pin" msgid="3657869530942905790">"SIM को PIN परिवर्तन गर्नुहोस्"</string>
     <string name="enter_pin_text" msgid="3182311451978663356">"SIM PIN:"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"गैर-आपत्‌कालीन कल गर्न आपत्‌कालीन कलब्याक मोडबाट निस्कनुहोस्।"</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\nयो डिभाइसमा 2G नेटवर्क अफ गरिएको छ, यसै कारणले तपाईंको कनेक्टिभिटी प्रभावित भएको हुन सक्छ। सेटिङमा जानुहोस् र जारी राख्नका निम्ति 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\nयो डिभाइसमा 2G अफ गरिएको छ, यसै कारणले तपाईंको कनेक्टिभिटी प्रभावित भएको हुन सक्छ। सेटिङमा जानुहोस् र जारी राख्नका निम्ति 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"कल सञ्चालन गर्न सकिँदैन।"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"एक कल गर्न एक ताररहितको सञ्जालमा कनेक्ट गर्नुहोस्।"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"कल गर्नका लागि Wi-Fi कलिङ सक्षम गर्नुहोस्।"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"कल गर्न स्याटेलाइट मोड अफ गर्नुहोस्।"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"कल गर्न सर्वप्रथम स्याटलाइट कनेक्सन अन्त्य गर्नुहोस्।"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"तपाईं मोबाइल वा Wi-Fi नेटवर्कविनै म्यासेज पठाउन र प्राप्त गर्न सक्नुहुन्छ।"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"आपत्‌कालीन जानकारी"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"मालिक"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"जानकारी हेर्न पुनः ट्याप गर्नुहोस्"</string>
@@ -588,14 +592,14 @@
     <string name="onscreenManageConferenceText" msgid="4700574060601755137">"सम्मेलन प्रबन्ध गर्नुहोस्"</string>
     <string name="onscreenAudioText" msgid="7224226735052019986">"अडियो"</string>
     <string name="onscreenVideoCallText" msgid="1743992456126258698">"भिडियो कल"</string>
-    <string name="importSimEntry" msgid="3892354284082689894">"आयात गर्नुहोस्"</string>
-    <string name="importAllSimEntries" msgid="2628391505643564007">"सबै आयात गर्नुहोस्"</string>
-    <string name="importingSimContacts" msgid="4995457122107888932">"SIM सम्पर्कहरू आयात गर्दै"</string>
-    <string name="importToFDNfromContacts" msgid="5068664870738407341">"सम्पर्कहरूबाट आयात गर्नुहोस्"</string>
+    <string name="importSimEntry" msgid="3892354284082689894">"इम्पोर्ट गर्नुहोस्"</string>
+    <string name="importAllSimEntries" msgid="2628391505643564007">"सबै इम्पोर्ट गर्नुहोस्"</string>
+    <string name="importingSimContacts" msgid="4995457122107888932">"SIM कन्ट्याक्टहरू आयात गर्दै"</string>
+    <string name="importToFDNfromContacts" msgid="5068664870738407341">"कन्ट्याक्टबाट इम्पोर्ट गर्नुहोस्"</string>
     <string name="singleContactImportedMsg" msgid="3619804066300998934">"आयातित सम्पर्क"</string>
-    <string name="failedToImportSingleContactMsg" msgid="228095510489830266">"सम्पर्क आयात गर्न असफल"</string>
-    <string name="hac_mode_title" msgid="4127986689621125468">"श्रवणका लागि सहयोगी यन्त्रहरू"</string>
-    <string name="hac_mode_summary" msgid="7774989500136009881">"श्रवण सहायता अनुकूलता खोल्नुहोस्"</string>
+    <string name="failedToImportSingleContactMsg" msgid="228095510489830266">"सम्पर्क इम्पोर्ट गर्न असफल"</string>
+    <string name="hac_mode_title" msgid="4127986689621125468">"हियरिङ डिभाइसहरू"</string>
+    <string name="hac_mode_summary" msgid="7774989500136009881">"हियरिङ डिभाइस कम्प्याटिबिलिटी अन गर्नुहोस्"</string>
     <string name="rtt_mode_title" msgid="3075948111362818043">"द्रुत टेक्स्ट म्यासेज (RTT) कल"</string>
     <string name="rtt_mode_summary" msgid="8631541375609989562">"भ्वाइस कलभित्रै सन्देश प्रवाह गर्ने अनुमति दिनुहोस्"</string>
     <string name="rtt_mode_more_information" msgid="587500128658756318">"RTT ले बहिरा, सुन्नमा कठिन हुने, बोल्न नसक्ने र आवाज मात्र नभई कल गर्दा थप कुराहरू चाहिने  मान्छेहरूलाई सहायता गर्छ!&lt;br&gt; &lt;a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>&gt;थप जान्नुहोस्&lt;/a&gt;\n       &lt;br&gt;&lt;br&gt; - RTT कलहरूलाई सन्देशसम्बन्धी ट्रान्सक्रिप्टका रूपमा सुरक्षित गरिन्छ\n      &lt;br&gt; - RTT भिडियो कलहरूमा उपलब्ध छैन"</string>
@@ -815,7 +819,7 @@
     <string name="supp_service_deflected_call" msgid="7565979024562921707">"कल अर्को नम्बरमा स्थानान्तरण गरियो।"</string>
     <string name="supp_service_forwarded_call" msgid="6475776013771821457">"कल फर्वार्ड गरियो।"</string>
     <string name="supp_service_conference_call" msgid="4004193534408317148">"सम्मेलन कलमा सामेल हुँदै छ।"</string>
-    <string name="supp_service_held_call_released" msgid="2847835124639112410">"होल्डमा राखिएको कललाई विच्छेद गरियो।"</string>
+    <string name="supp_service_held_call_released" msgid="2847835124639112410">"होल्डमा राखिएको कललाई डिस्कनेक्ट गरियो।"</string>
     <string name="callFailed_otasp_provisioning_in_process" msgid="3345666183602879326">"डिभाइसमा हाल सेवाहरूको व्यवस्था गरिँदै हुनाले कल गर्न सकिँदैन।"</string>
     <string name="callFailed_already_dialing" msgid="7250591188960691086">"अर्को बहिर्गमन कल पहिले नै डायल भएका हुनाले कल गर्न सकिँदैन।"</string>
     <string name="callFailed_already_ringing" msgid="2376603543544289303">"जवाफ नदिइएको आगमन कल जारी रहेकाले नयाँ कल गर्न सकिँदैन। कुनै नयाँ कल गर्नुअघि आगमन कलको जवाफ दिनुहोस् वा त्यसलाई अस्वीकार गर्नुहोस्।"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"हटाउन मिल्ने eSIM डिफल्ट रूपमा सेट गर्नुहोस्"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"मोबाइल रेडियोको पावर"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"सेवा उपलब्ध छैन\" सिमुलेट गर्नुहोस् (डिबग बिल्डमा मात्र सिमुलेट गर्न मिल्छ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"सेवा प्रदायकको स्याटेलाइट मोडको परीक्षण गर्नुहोस् (डिबग बिल्ड मात्र)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"वास्तविक स्याटेलाइट eSOS मोड परीक्षण गर्नुहोस् (डिबग बिल्ड मात्र)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM को ठेगाना पुस्तिका हेर्नुहोस्"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"स्थिर डायल गर्ने नम्बरहरू हेर्नुहोस्"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"सेवामा डायल गर्ने नम्बरहरू हेर्नुहोस्"</string>
@@ -860,7 +866,7 @@
     <string name="radioInfo_phone_idle" msgid="2191653783170757819">"निष्क्रिय"</string>
     <string name="radioInfo_phone_ringing" msgid="8100354169567413370">"घन्टी बज्दै छ"</string>
     <string name="radioInfo_phone_offhook" msgid="7564601639749936170">"कल जारी छ"</string>
-    <string name="radioInfo_data_disconnected" msgid="8085447971880814541">"विच्छेद गरियो"</string>
+    <string name="radioInfo_data_disconnected" msgid="8085447971880814541">"डिस्कनेक्ट गरिएको छ"</string>
     <string name="radioInfo_data_connecting" msgid="925092271092152472">"जोडिँदै"</string>
     <string name="radioInfo_data_connected" msgid="7637335645634239508">"जडान गरियो"</string>
     <string name="radioInfo_data_suspended" msgid="8695262782642002785">"निलम्बित"</string>
diff --git a/res/values-night/styles.xml b/res/values-night/styles.xml
index f7d831b..9774396 100644
--- a/res/values-night/styles.xml
+++ b/res/values-night/styles.xml
@@ -25,6 +25,11 @@
         <item name="android:navigationBarDividerColor">@color/dialer_divider_color</item>
         <item name="android:colorAccent">@color/dialer_theme_color</item>
         <item name="android:dialogTheme">@style/DialerAlertDialogTheme</item>
+
+        <!--
+            TODO(b/309578419): Make activities handle insets properly and then remove this.
+        -->
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
     </style>
 
     <style name="EmergencyInfoNameTextAppearance"
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index f373f5b..7d92840 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Gespreksinstellingen"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Oproepinstellingen kunnen alleen worden gewijzigd door de beheerder."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Alleen de beheerder of zakelijke gebruiker kan de accountinstellingen wijzigen."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"De eigenaar van het apparaat heeft de mogelijkheid voor het wijzigen van de mobiele netwerkinstellingen beperkt."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Instellingen (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Fout met oproepinstellingen"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Instellingen lezen..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sluit de modus voor noodoproepen af om een niet-noodoproep te plaatsen."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Niet geregistreerd op netwerk."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobiel netwerk niet beschikbaar."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobiel netwerk niet beschikbaar.\n\nMaak verbinding met een draadloos netwerk om te bellen.\n\n2G is uitgezet op dit apparaat. Dit kan gevolgen hebben voor je connectiviteit. Ga naar Instellingen en zet 2G toestaan aan om door te gaan."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobiel netwerk is niet beschikbaar. Maak verbinding met een draadloos netwerk om te bellen."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobiel netwerk is niet beschikbaar.\n\nMaak verbinding met een draadloos netwerk om te bellen.\n\n2G staat uit op dit apparaat. Dit kan gevolgen hebben voor je connectiviteit. Ga naar Instellingen en zet 2G toestaan aan om door te gaan."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Als je wilt bellen, moet je een geldig nummer invoeren."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Gesprek mislukt."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Gesprek kan op dit moment niet worden toegevoegd. Je kunt contact opnemen door een bericht te sturen."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Kan gesprekken niet in de wacht zetten."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Maak verbinding met een draadloos netwerk om te bellen."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Zet bellen via wifi aan om te bellen."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Zet de satellietmodus uit om te bellen."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Als je wilt bellen, moet je eerst de satellietverbinding beëindigen."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Je kunt berichten sturen en krijgen zonder een mobiel of wifi-netwerk."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Noodinformatie"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Eigenaar"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tik nogmaals om informatie te bekijken"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Verwisselbare e-simkaart instellen als standaard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobiel radiovermogen"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'Niet in gebruik\' simuleren (alleen in foutopsporingsbuild)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satellietmodus voor testprovider (alleen in foutopsporingsbuild)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Echte e-SOS via satellietmodus testen (alleen in foutopsporingsbuild)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Adresboek op simkaart bekijken"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Vaste nummers bekijken"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Servicenummers bekijken"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index fd8e728..cbdcea3 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"କଲ ସେଟିଂସ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"କଲ ସେଟିଂସକୁ କେବଳ ଆଡମିନ ୟୁଜର ବଦଳାଇପାରିବେ।"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ଫୋନ ଆକାଉଣ୍ଟ ସେଟିଂସ କେବଳ ଆଡମିନ କିମ୍ବା ୱାର୍କ ୟୁଜରଙ୍କ ଦ୍ୱାରା ପରିବର୍ତ୍ତନ କରାଯାଇପାରିବ।"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ମୋବାଇଲ ନେଟୱାର୍କ ସେଟିଂସ ପରିବର୍ତ୍ତନ କରିବାର କ୍ଷମତାକୁ ଡିଭାଇସ ମାଲିକ ପ୍ରତିବନ୍ଧିତ କରିଛନ୍ତି।"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"ଗୋଟିଏ ସାଧାରଣ କଲ୍ କରିବା ପାଇଁ ଜରୁରିକାଳୀନ କଲବ୍ୟାକ୍ ମୋଡ୍‌ରୁ ବାହାରି ଆସନ୍ତୁ।"</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\nଏହି ଡିଭାଇସରେ 2Gକୁ ଅକ୍ଷମ କରାଯାଇଛି, ଯାହା ଆପଣଙ୍କ କନେକ୍ଟିଭିଟିକୁ ପ୍ରଭାବିତ କରୁଥାଇପାରେ। ଜାରି ରଖିବା ପାଇଁ ସେଟିଂସକୁ ଯାଇ \'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\nଏହି ଡିଭାଇସରେ 2Gକୁ ଅକ୍ଷମ କରାଯାଇଛି, ଯାହା ଆପଣଙ୍କ କନେକ୍ଟିଭିଟିକୁ ପ୍ରଭାବିତ କରୁଥାଇପାରେ। ଜାରି ରଖିବା ପାଇଁ ସେଟିଂସକୁ ଯାଇ \'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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"କଲ୍‍କୁ ହୋଲ୍ଡ କରାଯାଇପାରିବ ନାହିଁ।"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ଗୋଟିଏ କଲ୍ କରିବା ପାଇଁ ଏକ ତାରବିହୀନ ନେଟ୍‌ୱର୍କ ସହ କନେକ୍ଟ କରନ୍ତୁ।"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ଗୋଟିଏ କଲ୍ କରିବା ପାଇଁ ୱାଇ-ଫାଇ କଲିଙ୍ଗକୁ ସକ୍ଷମ କରନ୍ତୁ।"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ଏକ କଲ କରିବା ପାଇଁ ସେଟେଲାଇଟ ମୋଡକୁ ଅକ୍ଷମ କରନ୍ତୁ।"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ଏକ କଲ କରିବାକୁ ପ୍ରଥମେ ସେଟେଲାଇଟ କନେକ୍ସନ ସମାପ୍ତ କରନ୍ତୁ।"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"ଏକ ମୋବାଇଲ କିମ୍ବା ୱାଇ-ଫାଇ ନେଟୱାର୍କ ବିନା ଆପଣ ମେସେଜ ପଠାଇପାରିବେ ଏବଂ ପାଇପାରିବେ।"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ଜରୁରୀକାଳୀନ ସୂଚନା"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ମାଲିକ"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"ସୂଚନା ଦେଖିବାକୁ ପୁଣିଥରେ ଟାପ୍‍ କରନ୍ତୁ"</string>
@@ -620,7 +624,7 @@
     <string name="ota_hfa_activation_dialog_message" msgid="7921718445773342996">"ଏହି ଫୋନ୍‌ ଆପଣଙ୍କର ମୋବାଇଲ୍‌ ଡାଟା ସେବାକୁ ସକ୍ରିୟ କରୁଛି। \n\nଏଥି ପାଇଁ ପ୍ରାୟ 5 ମିନିଟ୍‌ ସମୟ ଲାଗିପାରେ।"</string>
     <string name="ota_skip_activation_dialog_title" msgid="7666611236789203797">"ସକ୍ରିୟ କରିବା ଛାଡ଼ିଯିବେ?"</string>
     <string name="ota_skip_activation_dialog_message" msgid="6691722887019708713">"ଯଦି ଆପଣ ସକ୍ରିୟ କରିବା କାର୍ଯ୍ୟକୁ ଛାଡ଼ିଯା’ନ୍ତି ତେବେ ଆପଣ କଲ୍ କରିପାରିବେ ନାହିଁ କିମ୍ବା ମୋବାଇଲ୍ ନେଟ୍‌ୱର୍କ (ଯଦିଓ ଆପଣ ୱାଇ-ଫାଇ ନେଟ୍‌ୱର୍କ ସହିତ ଯୋଡ଼ିହୋ‌ଇପାରିବେ) ସହିତ ଯୋଡ଼ିହୋ‌ଇପାରିବେ ନାହିଁ। ଆପଣ ନିଜର ଫୋନ୍‌କୁ ସକ୍ରିୟ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ପ୍ରତ୍ୟେକଥର ଏହାକୁ ଚାଲୁ କରିବା ସମୟରେ ସକ୍ରିୟ କରିବା ପାଇଁ କୁହାଯିବ।"</string>
-    <string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"ଛାଡ଼ିଦିଅନ୍ତୁ"</string>
+    <string name="ota_skip_activation_dialog_skip_label" msgid="5908029466817825633">"ବାଦ ଦିଅନ୍ତୁ"</string>
     <string name="ota_activate" msgid="7939695753665438357">"ସକ୍ରିୟ କରନ୍ତୁ"</string>
     <string name="ota_title_activate_success" msgid="1272135024761004889">"ଫୋନ୍ ସକ୍ରିୟ ହୋ‌ଇଯାଇଛି।"</string>
     <string name="ota_title_problem_with_activation" msgid="7019745985413368726">"ସକ୍ରିୟ ହେବାରେ ସମସ୍ୟା"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"କାଢ଼ି ହେଉଥିବା eSIMକୁ ଡିଫଲ୍ଟ ଭାବେ ସେଟ କରନ୍ତୁ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ମୋବାଇଲ୍ ରେଡିଓ ପାୱାର୍"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\"କାମ କରୁନାହିଁ\"ରେ ସିମୁଲେଟ କରନ୍ତୁ (କେବଳ ଡିବଗ ବିଲ୍ଡ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ମକ କେରିଅର ସେଟେଲାଇଟ ମୋଡ (କେବଳ ଡିବଗ ବିଲ୍ଡ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"ପ୍ରକୃତ ସେଟେଲାଇଟର eSOS ମୋଡ ପରୀକ୍ଷା କରନ୍ତୁ (କେବଳ ଡିବଗ ବିଲ୍ଡ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ସିମ୍‌ରେ ଥିବା ଠିକଣା ପୁସ୍ତକ ଦେଖନ୍ତୁ"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ସ୍ଥାୟୀ ଡାଏଲିଂ ନମ୍ୱରଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"ସର୍ଭିସ୍ ଡାଏଲିଂ ନମ୍ୱରଗୁଡ଼ିକ ଦେଖନ୍ତୁ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 8dd6abd..585a53e 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"ਕਾਲ ਸੈਟਿੰਗਾਂ"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ਕਾਲ ਸੈਟਿੰਗਾਂ ਸਿਰਫ਼ ਪ੍ਰਸ਼ਾਸਕ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਹੀ ਬਦਲੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ਫ਼ੋਨ ਦੀਆਂ ਖਾਤਾ ਸੈਟਿੰਗਾਂ ਸਿਰਫ਼ ਪ੍ਰਸ਼ਾਸਕ ਜਾਂ ਕਾਰਜ-ਸਥਾਨ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਹੀ ਬਦਲੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"ਡੀਵਾਈਸ ਦੇ ਮਾਲਕ ਨੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਣ ਦੀ ਯੋਗਤਾ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾ ਦਿੱਤੀ ਹੈ।"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"ਇੱਕ ਗ਼ੈਰ-ਅਪਾਤਕਾਲ ਕਾਲ ਕਰਨ ਲਈ ਅਪਾਤਕਾਲ ਕਾਲਬੈਕ ਮੋਡ ਤੋਂ ਬਾਹਰ ਆਓ।"</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\nਇਸ ਡੀਵਾਈਸ \'ਤੇ 2G ਬੰਦ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਕਨੈਕਟੀਵਿਟੀ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰ ਸਕਦਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ \'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\nਇਸ ਡੀਵਾਈਸ \'ਤੇ 2G ਬੰਦ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਕਨੈਕਟੀਵਿਟੀ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰ ਸਕਦਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ \'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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ਕਾਲਾਂ ਹੋਲਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ ਇੱਕ ਵਾਇਰਲੈਸ ਨੈਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ।"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ Wi-Fi ਕਾਲਿੰਗ ਯੋਗ ਬਣਾਓ।"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ਕਾਲ ਕਰਨ ਲਈ ਉਪਗ੍ਰਹਿ ਮੋਡ ਬੰਦ ਕਰੋ।"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ਕਾਲ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਉਪਗ੍ਰਹਿ ਕਨੈਕਸ਼ਨ ਬੰਦ ਕਰੋ।"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"ਤੁਸੀਂ ਮੋਬਾਈਲ ਜਾਂ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਤੋਂ ਬਿਨਾਂ ਸੁਨੇਹੇ ਭੇਜ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ਸੰਕਟਕਾਲੀਨ ਜਾਣਕਾਰੀ"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"ਮਾਲਕ"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"ਜਾਣਕਾਰੀ ਦੇਖਣ ਲਈ ਦੁਬਾਰਾ ਟੈਪ ਕਰੋ"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ਹਟਾਉਣਯੋਗ ਈ-ਸਿਮ ਨੂੰ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਜੋਂ ਸੈੱਟ ਕਰੋ"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ਮੋਬਾਈਲ ਰੇਡੀਓ ਪਾਵਰ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'ਸੇਵਾ ਵਿੱਚ ਨਹੀਂ\' ਨੂੰ ਸਿਮੂਲੇਟ ਕਰੋ (ਸਿਰਫ਼ ਡੀਬੱਗ ਬਿਲਡ)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ਮੌਕ ਕੈਰੀਅਰ ਉਪਗ੍ਰਹਿ ਮੋਡ (ਸਿਰਫ਼ ਡੀਬੱਗ ਬਿਲਡ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"ਰੀਅਲ ਸੈਟੇਲਾਈਟ eSOS ਮੋਡ ਅਜ਼ਮਾਓ (ਸਿਰਫ਼ ਡੀਬੱਗ ਬਿਲਡ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ਸਿਮ ਦੀ ਪਤਾ ਬੁੱਕ ਦੇਖੋ"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ਫਿਕਸਡ ਡਾਇਲਿੰਗ ਨੰਬਰ ਦੇਖੋ"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"ਸੇਵਾ ਡਾਇਲਿੰਗ ਨੰਬਰ ਦੇਖੋ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 18ff3b1..7793f49 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Ustawienia połączeń"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Ustawienia połączeń może zmieniać tylko użytkownik będący administratorem."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Ustawienia konta telefonu zmienia administrator lub użytkownik profilu służbowego."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Właściciel urządzenia ograniczył możliwość zmieniania ustawień sieci komórkowej."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Ustawienia (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Błąd w ustawieniach połączenia"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Czytanie ustawień..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Aby zadzwonić normalnie, wyjdź z trybu alarmowego połączenia zwrotnego."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Nie zarejestrowano w sieci"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Sieć komórkowa jest niedostępna."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Sieć komórkowa jest niedostępna.\n\nAby zadzwonić, połącz się z siecią bezprzewodową.\n\nSieć 2G na tym urządzeniu jest wyłączona, co może mieć wpływ na łączność. Aby kontynuować, przejdź do Ustawień i włącz opcję „Zezwól na 2G”."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Sieć komórkowa jest niedostępna. Połącz się z siecią bezprzewodową, by zadzwonić."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Sieć komórkowa jest niedostępna.\n\nAby zadzwonić, połącz się z siecią bezprzewodową.\n\nSieć 2G na tym urządzeniu jest wyłączona, co może mieć wpływ na łączność. Aby kontynuować, przejdź do Ustawień i włącz opcję „Zezwól na 2G”."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Aby zadzwonić, wybierz prawidłowy numer."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Nie udało się połączyć."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"W tej chwili nie możesz zadzwonić. Zamiast tego możesz wysłać wiadomość."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Nie można zawieszać połączeń."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Połącz się z siecią bezprzewodową, by zadzwonić."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Włącz Połączenia przez Wi-Fi, aby nawiązać połączenie."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Aby zadzwonić, wyłącz tryb satelitarny."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Aby zadzwonić, najpierw zakończ połączenie satelitarne."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Możesz wymieniać wiadomości bez dostępu do sieci komórkowej lub Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informacje alarmowe"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Właściciel"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Kliknij ponownie, aby wyświetlić informacje"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ustaw wymienną kartę eSIM jako domyślną"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Moc sygnału komórkowego"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Symulowana przerwa w działaniu usługi (tylko w kompilacji do debugowania)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Symulowany tryb satelitarny operatora (tylko kompilacja do debugowania)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testowanie rzeczywistego trybu satelitarnego eSOS (tylko kompilacja do debugowania)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Wyświetl książkę adresową z karty SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Wyświetl ustalone numery"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Wyświetl numery usług"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 10fb31a..62c51e8 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Definições de chamadas"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"As definições de chamadas só podem ser alteradas pelo utilizador gestor."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"As definições da conta do telemóvel só podem ser alteradas pelo administrador ou utilizador de trabalho."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"O proprietário do dispositivo restringiu a capacidade de alterar as definições de rede móvel."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Definições (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Erro nas definições de chamada"</string>
     <string name="reading_settings" msgid="1605904432450871183">"A ler as definições..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Sair do modo de chamada de retorno de emergência para efetuar uma chamada que não é de emergência."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Sem registo na rede."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Rede móvel não disponível."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"A rede móvel não está disponível.\n\nLigue-se a uma rede sem fios para fazer uma chamada.\n\nO 2G está desativado neste dispositivo, o que pode estar a afetar a sua conetividade. Aceda às Definições e ative a opção Permitir 2G para continuar."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"A rede móvel não está disponível. Ligue-se a uma rede sem fios para efetuar uma chamada."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"A rede móvel não está disponível.\n\nLigue-se a uma rede sem fios para fazer uma chamada.\n\nO 2G está desativado neste dispositivo, o que pode estar a afetar a sua conetividade. Aceda às Definições e ative a opção Permitir 2G para continuar."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Para telefonar, introduza um número válido."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"A chamada falhou."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Não é possível adicionar a chamada neste momento. Pode tentar entrar em contacto ao enviar uma mensagem."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Não é possível colocar as chamadas em espera."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Ligue-se a uma rede sem fios para fazer uma chamada."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Ativar as chamadas através de Wi-Fi para fazer uma chamada."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Desative o modo satélite para fazer uma chamada."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Para fazer uma chamada, termine primeiro a ligação de satélite."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Pode enviar e receber mensagens sem uma rede móvel ou Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informações de emergência"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Proprietário"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Toque novamente para ver informações"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Predefinir eSIM removível"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potência do rádio móvel"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simule o modo fora de serviço (apenas na versão de depuração)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Modo satélite da operadora fictícia (apenas na versão de depuração)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testar modo eSOS de satélite real (apenas na versão de depuração)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver livro de endereços do SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ver números autorizados"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Ver números de marcação de serviços"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 02288b9..6bd6988 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Configurações de chamadas"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"As configurações de chamada só podem ser alteradas pelo usuário administrador."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"As configurações da conta do smartphone só podem ser alteradas pelo administrador ou usuário no trabalho."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"O proprietário do dispositivo restringiu a opção de fazer mudanças nas configurações de rede móvel."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Configurações (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Erro de configuração da chamada"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Lendo as configurações…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Saia do modo de retorno de chamada de emergência para fazer uma chamada que não seja de emergência."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Não registrado na rede."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Rede móvel não disponível."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Rede móvel indisponível.\n\nConecte-se a uma rede sem fio para fazer uma ligação.\n\nO 2G está desativado neste dispositivo e isso pode afetar sua conectividade. Acesse \"Configurações\" e ative a opção \"Permitir 2G\" para continuar."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"A rede móvel não está disponível. Conecte-se a uma rede sem fio para fazer uma chamada."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"A rede móvel está indisponível.\n\nConecte-se a uma rede sem fio para fazer uma ligação.\n\nO 2G está desativado neste dispositivo e pode estar afetando sua conectividade. Acesse \"Configurações\" e ative a opção \"Permitir 2G\" para continuar."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Para realizar uma chamada, digite um número válido."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Falha na chamada."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Não é possível ligar no momento. Entre em contato enviando uma mensagem."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Não é possível colocar chamadas em espera."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Conecte-se a uma rede sem fio para fazer uma chamada."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Ative as chamadas por Wi-Fi para fazer uma chamada."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Desative o modo satélite para fazer uma ligação."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Para fazer uma ligação, encerre a conexão por satélite."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Você pode enviar e receber mensagens sem um dispositivo móvel ou uma rede Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informações de emergência"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Proprietário"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Toque novamente para ver as informações"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Definir eSIM removível como padrão"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Potência do rádio celular"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simular o modo fora de serviço (somente build de depuração)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulação de modo satélite da operadora (somente build de depuração)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testar o modo eSOS por satélite (somente build de depuração)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Ver o catálogo de endereços do chip"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ver números de discagem fixa"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Ver números de discagem do serviço"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 94cf9d4..dd8a134 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Setări pentru apeluri"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Numai administratorul poate să modifice setările pentru apeluri."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Setările contului de pe telefon pot fi modificate numai de administrator sau de un utilizator profesional."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Proprietarul dispozitivului a restricționat posibilitatea de a modifica setările pentru rețelele mobile."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Setări (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Eroare în setările pentru apeluri"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Se citesc setările..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Ieși din modul de apelare inversă de urgență pentru a efectua un apel care nu este de urgență."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Neînregistrat în rețea."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Rețeaua mobilă nu este disponibilă."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Rețeaua mobilă nu este disponibilă.\n\nConectează-te la o rețea wireless pentru a iniția un apel.\n\n2G este dezactivat pe acest dispozitiv, ceea ce poate afecta conectivitatea. Accesează Setări și activează setarea Permite 2G pentru a continua."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Rețeaua mobilă nu este disponibilă. Pentru a apela, conectează-te la o rețea wireless."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Rețeaua mobilă nu este disponibilă.\n\nConectează-te la o rețea wireless pentru a iniția un apel.\n\n2G este dezactivat pe acest dispozitiv, ceea ce poate afecta conectivitatea. Accesează Setări și activează setarea Permite 2G pentru a continua."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Pentru a apela, introdu un număr valid."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Apelul nu a fost inițiat."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Apelul nu poate fi inițiat în acest moment. Poți lua legătura cu persoana respectivă trimițându-i un mesaj."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Apelurile nu pot fi puse în așteptare."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Pentru a apela, conectează-te la o rețea wireless."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Activează apelarea prin Wi-Fi pentru a iniția un apel."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Dezactivează modul Satelit pentru a apela."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Pentru a apela, mai întâi încheie conexiunea prin satelit."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Poți să trimiți și să primești mesaje fără o rețea mobilă sau Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informații în caz de urgență"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Proprietar"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Atinge din nou pentru a vedea informațiile"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Setează cartela eSIM portabilă drept prestabilită"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Alimentare radio celular"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulează modul în afara ariei de acoperire (numai în versiunea pentru remedierea erorilor)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mod Satelit al operatorului de testare (numai versiune pentru remedierea erorilor)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testează modul eSOS prin satelit real (numai versiunea pentru remedierea erorilor)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Afișează agenda de pe SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Afișează numerele pentru apeluri restricționate"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Vezi numere de apelare de serviciu"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ec534c6..c640ce3 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Настройки вызовов"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Настройки вызовов может изменить только основной пользователь"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Настройки аккаунта на телефоне может изменить только работающий с ним сотрудник или администратор."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Владелец устройства ограничил возможность изменения настроек мобильной сети."</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>
@@ -306,7 +307,7 @@
     <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="data_usage_disable_mobile" msgid="5669109209055988308">"Отключить мобильный Интернет?"</string>
+    <string name="data_usage_disable_mobile" msgid="5669109209055988308">"Отключить мобильный интернет?"</string>
     <string name="sim_selection_required_pref" msgid="6985901872978341314">"Выберите SIM-карту"</string>
     <string name="sim_change_data_title" msgid="9142726786345906606">"Смена SIM-карты"</string>
     <string name="sim_change_data_message" msgid="3567358694255933280">"Использовать для передачи данных по мобильной сети SIM-карту \"<xliff:g id="NEW_SIM">%1$s</xliff:g>\" (вместо \"<xliff:g id="OLD_SIM">%2$s</xliff:g>\")?"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Чтобы сделать обычный звонок, выйдите из режима экстренных обратных вызовов."</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\nНа этом устройстве отключена передача данных по сетям 2G, что может влиять на функции связи. Чтобы продолжить, перейдите в настройки и включите параметр \"Разрешить 2G\"."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Мобильная сеть недоступна. Чтобы позвонить, подключитесь к Wi-Fi."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Мобильная сеть недоступна.\n\nЧтобы позвонить, подключитесь к беспроводной сети.\n\nНа этом устройстве отключена передача данных по сетям 2G, что может влиять на функции связи. Чтобы продолжить, перейдите в настройки и включите параметр \"Разрешить 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Удержание невозможно."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Чтобы позвонить, подключитесь к Wi-Fi."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Чтобы позвонить, включите звонки через Wi-Fi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Чтобы позвонить, отключите спутниковый режим."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Чтобы позвонить, сначала завершите спутниковое соединение."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Вы можете отправлять и получать сообщения без доступа к мобильной сети или Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Данные для экстренных случаев"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Владелец"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Чтобы посмотреть информацию, нажмите ещё раз"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Установить съемную eSIM-карту в качестве используемой по умолчанию"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Мощность радиосигнала"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Моделирование нахождения вне зоны обслуживания (только отладочная сборка)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Режим спутниковой связи симуляции оператора (только отладочная сборка)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Проверка спутникового режима eSOS (только отладочная сборка)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Посмотреть адресную книгу на SIM-карте"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Список разрешенных номеров"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Посмотреть номера служебного набора"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 22f0a1c..c29bef1 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"ඇමතුම් සැකසීම්"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ඇමතුම් සැකසීම් වෙනස් කළ හැක්කේ පරිපාලක පරිශීලකයාට පමණි."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"දුරකථන ගිණුම් සැකසීම් වෙනස් කළ හැක්කේ පරිපාලක හෝ කාර්යාල පරිශීලකයාට පමණි."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"උපාංග හිමිකරු ජංගම ජාල සැකසීම් වෙනස් කිරීමේ හැකියාව සීමා කර ඇත."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"හදිසි-නොවන ඇමතුමක් සිදු කිරීමට හදිසි අවස්ථා පසු ඇමතුම් ප්‍රකාරයෙන් ඉවත් වන්න."</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\nමෙම උපාංගය මත 2G අබල කර ඇත, එය ඔබේ සම්බන්‍ධතාවට බලපාමින් තිබේවි. ඉදිරියට යාමට සැකසීම් වෙත ගොස් 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\nමෙම උපාංගය මත 2G අබල කර ඇත, එය ඔබේ සම්බන්‍ධතාවට බලපාමින් තිබේවි. ඉදිරියට යාමට සැකසීම් වෙත ගොස් 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ඇමතුම් රඳවා තැබීමට නොහැකිය."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"ඇමතුමක් ගැනීමට රැහැන් රහිත ජාලයක් වෙත සම්බන්ධ වෙන්න."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"ඇමතුමක් කිරීමට Wi-Fi ඇමතීම සබල කරන්න."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ඇමතුමක් ගැනීමට චන්ද්‍රිකා ප්‍රකාරය ක්‍රියාවිරහිත කරන්න."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"ඇමතුමක් ගැනීමට, පළමුව චන්ද්‍රිකා සම්බන්ධතාව නිමා කරන්න."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"ඔබට ජංගම හෝ Wi-Fi ජාලයක් නොමැතිව පණිවිඩ යැවීමට සහ ලැබීමට හැක."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"හදිසි අවස්ථා තොරතුරු"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"හිමිකරු"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"තොරතුරු බැලීම සඳහා නැවත තට්ටු කරන්න"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"ඉවත් කළ හැකි eSIM පෙරනිමිය ලෙස සකසන්න"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"ජංගම රේඩියෝ බලය"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"සේවයෙන් බැහැරව අනුකරණය කරන්න (නිදොස් තැනුම පමණි)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"ආදර්ශ වාහක චන්ද්‍රිකා ප්‍රකාරය (නිදොස් තැනීමට පමණි)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"සැබෑ චන්ද්‍රිකා eSOS ප්‍රකාරය පරීක්ෂා කරන්න (නිදොස් තැනීමට පමණි)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM ලිපින පොත බලන්න"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ස්ථාවර ඇමතුම් අංක පෙන්වන්න"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"සේවා ඩයල් කිරීමේ අංක පෙන්වන්න"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 623f3c0..d540299 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Nastavenia hovorov"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Nastavenia hovorov môže zmeniť iba používateľ s povoleniami správcu."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Nastavenia telefónneho účtu môže zmeniť iba správca alebo spravovaný používateľ."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Vlastník zariadenia obmedzil možnosť zmeny nastavení mobilnej siete."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Nastavenia (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Chyba nastavení hovorov"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Nastavenia sa načítavajú…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Ak chcete volať štandardným spôsobom, ukončite režim tiesňového spätného volania."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Prihlásenie do siete nebolo úspešné."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobilná sieť nie je k dispozícii."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilná sieť nie je k dispozícii.\n\nAk chcete volať, pripojte sa k bezdrôtovej sieti.\n\nV tomto zariadení nie je zapnuté pripojenie 2G, čo môže mať vplyv na možnosti pripojenia. Ak chcete pokračovať, prejdite do nastavení a zapnite možnosť Povoliť 2G."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilná sieť nie je k dispozícii. Ak chcete volať, pripojte sa k bezdrôtovej sieti."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilná sieť nie je k dispozícii.\n\nAk chcete volať, pripojte sa k bezdrôtovej sieti.\n\nV tomto zariadení je prístup k 2G vypnutý, čo môže mať vplyv na pripojenie. Ak chcete pokračovať, prejdite do nastavení a zapnite možnosť Povoliť 2G."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Ak chcete volať, zadajte platné číslo"</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Hovor zlyhal."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Hovor sa momentálne nedá pridať. Môžete namiesto toho skúsiť poslať správu."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Hovory nie je možné podržať."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Ak chcete volať, pripojte sa k bezdrôtovej sieti"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Na uskutočnenie hovoru povoľte volanie cez Wi‑Fi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Ak chcete volať, deaktivujte satelitný režim."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Ak chcete uskutočniť hovor, musíte najprv ukončiť satelitné pripojenie."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Správy môžete odosielať a prijímať bez mobilnej siete či siete Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Tiesňové informácie"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Vlastník"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Informácie si zobrazíte opätovným klepnutím"</string>
@@ -579,7 +583,7 @@
     <string name="dialerKeyboardHintText" msgid="1115266533703764049">"Číslo vytočíte pomocou klávesnice."</string>
     <string name="onscreenHoldText" msgid="4025348842151665191">"Podržať"</string>
     <string name="onscreenEndCallText" msgid="6138725377654842757">"Koniec"</string>
-    <string name="onscreenShowDialpadText" msgid="658465753816164079">"Číselná klávesnica"</string>
+    <string name="onscreenShowDialpadText" msgid="658465753816164079">"Číselník"</string>
     <string name="onscreenMuteText" msgid="5470306116733843621">"Ignorovať"</string>
     <string name="onscreenAddCallText" msgid="9075675082903611677">"Pridať hovor"</string>
     <string name="onscreenMergeCallsText" msgid="3692389519611225407">"Zlúčiť hovory"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nastaviť odoberateľnú eSIM kartu ako predvolenú"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Sila signálu GSM"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulácia nefungujúceho zariadenia (možné iba v ladiacej zostave)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulácia satelitného režimu operátora (iba ladiaca zostava)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testovať režim pomoci v tiesni cez skutočné satelity (iba ladiaca zostava)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Zobraziť adresár SIM karty"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Zobraziť povolené čísla"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Zobraziť čísla volaní služieb"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 975cdc7..214fcc4 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Nastavitve klicev"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Nastavitve klicanja lahko spremeni samo uporabnik s skrbniškim dostopom."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Nastavitve računa telefona lahko spremeni samo uporabnik s skrbniškim ali službenim dostopom."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Lastnik naprave je omejil možnost spreminjanja nastavitev mobilnega omrežja."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Nastavitve (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Napaka nastavitev klicev"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Branje nastavitev …"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Če ne gre za klic v sili, zaprite način za povratni klici v sili."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ni registrirano v omrežju."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Omrežje prenosnega telefona ni na voljo."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobilno omrežje ni na voljo.\n\nČe želite opraviti klic, vzpostavite povezavo z brezžičnim omrežjem.\n\nOmrežje 2G je v tej napravi onemogočeno, kar lahko vpliva na povezljivost. Odprite nastavitve in vklopite možnost »Omogoči 2G«, če želite nadaljevati."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobilno omrežje ni na voljo. Če želite opraviti klic, vzpostavite povezavo z brezžičnim omrežjem."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobilno omrežje ni na voljo.\n\nČe želite opraviti klic, vzpostavite povezavo z brezžičnim omrežjem.\n\nOmrežje 2G je v tej napravi onemogočeno, kar lahko vpliva na povezljivost. Odprite nastavitve in vklopite možnost »Omogoči 2G«, če želite nadaljevati."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Če želite opraviti klic, vnesite veljavno številko."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Klic ni uspel."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Trenutno ni mogoče dodati klica. Poskusite poslati sporočilo."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Klicev ni mogoče zadržati."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Povežite se v omrežje Wi-Fi, če želite opraviti klic."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Če želite opraviti klic, omogočite klicanja prek Wi-Fi-ja."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Če želite opraviti klic, onemogočite satelitski način."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Če želite opraviti klic, najprej prekinite satelitsko povezavo."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Sporočila SMS lahko pošiljate in prejemate brez mobilnega omrežja ali omrežja Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informacije za nujne primere"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Lastnik"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Znova se dotaknite, da si ogledate podatke"</string>
@@ -594,8 +598,8 @@
     <string name="importToFDNfromContacts" msgid="5068664870738407341">"Uvozi iz stikov"</string>
     <string name="singleContactImportedMsg" msgid="3619804066300998934">"Uvožen je bil stik"</string>
     <string name="failedToImportSingleContactMsg" msgid="228095510489830266">"Uvoz stika ni uspel"</string>
-    <string name="hac_mode_title" msgid="4127986689621125468">"Slušni pripomočki"</string>
-    <string name="hac_mode_summary" msgid="7774989500136009881">"Vključi združljivost s slušnimi pripomočki"</string>
+    <string name="hac_mode_title" msgid="4127986689621125468">"Slušni aparati"</string>
+    <string name="hac_mode_summary" msgid="7774989500136009881">"Vključi združljivost s slušnimi aparati"</string>
     <string name="rtt_mode_title" msgid="3075948111362818043">"Klic s sprotnim besedilom (RTT)"</string>
     <string name="rtt_mode_summary" msgid="8631541375609989562">"Dovoli izmenjavo sporočil v glasovnem klicu"</string>
     <string name="rtt_mode_more_information" msgid="587500128658756318">"Funkcija RTT pomaga klicateljem, ki so gluhi, naglušni, imajo govorno motnjo ali potrebujejo več kot samo glas.&lt;br&gt; &lt;a href=<xliff:g id="URL">http://support.google.com/mobile?p=telephony_rtt</xliff:g>&gt;Več o tem&lt;/a&gt;\n       &lt;br&gt;&lt;br&gt; – Klici RTT se shranijo kot prepis sporočila\n       &lt;br&gt; – RTT ni na voljo pri videoklicih"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Nastavi izmenljivo kartico e-SIM kot privzeto"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Moč radia mobilne naprave"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulacija nedelovanja (samo za gradnjo za odpravljanje napak)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Lažni satelitski način operaterja (samo gradnja za odpravljanje napak)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Preizkus pravega satelitskega načina eSOS (samo gradnja za odpravljanje napak)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Prikaži imenik na kartici SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Prikaži številke za zaporo odhodnih klicev"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Prikaži številke za klicanje storitev"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 0d4d021..a9aad0d 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Cilësimet e telefonatës"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Cilësimet e telefonatës mund të ndryshohen vetëm nga administratori."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Cilësimet e llogarisë të telefonit mund të ndryshohen vetëm nga administratori ose një përdorues në punë."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Zotëruesi i pajisjes ka kufizuar aftësinë për të ndryshuar cilësimet e rrjetit celular."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Cilësimet (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Gabim në cilësimet e telefonatës"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Po lexon cilësimet…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Dil nga modaliteti i kthimit të telefonatës së urgjencës për të bërë një telefonatë jo urgjente."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"I paregjistruar në rrjet."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Rrjeti celular nuk mundësohet."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Rrjeti celular nuk ofrohet.\n\nLidhu me një rrjet wireless për të bërë një telefonatë.\n\n2G është çaktivizuar në këtë pajisje, e cila mund të ketë ndikim te lidhshmëria. Shko te \"Cilësimet\" dhe aktivizo \"Lejo 2G\" për të vazhduar."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Rrjeti celular nuk ofrohet. Lidhu me një rrjet wireless për të bërë një telefonatë."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Rrjeti celular nuk ofrohet.\n\nLidhu me një rrjet wireless për të bërë një telefonatë.\n\n2G është çaktivizuar në këtë pajisje, e cila mund të ketë ndikim te lidhshmëria. Shko te \"Cilësimet\" dhe aktivizo \"Lejo 2G\" për të vazhduar."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Për të kryer një telefonatë, fut një numër të vlefshëm."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Thirrja dështoi."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Telefonata nuk mund të shtohet në këtë moment. Mund të provosh të kontaktosh duke dërguar një mesazh."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Telefonatat nuk mund të mbahen në pritje."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Lidhu me një rrjet wireless për të bërë një telefonatë."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktivizo telefonatat nëpërmjet rrjetit Wi-Fi për të bërë një telefonatë."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Çaktivizo modalitetin e satelitit për të bërë një telefonatë."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Për të bërë një telefonatë, në fillim mbyll lidhjen satelitore."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Mund të dërgosh dhe të marrësh mesazhe pa një rrjet celular apo rrjet Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Informacioni i urgjencës"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Zotëruesi"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Trokit përsëri për të shikuar informacionet"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Caktoje kartën e lëvizshme eSIM si të parazgjedhur"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Fuqia e radios së rrjetit celular"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulo gjendjen jashtë shërbimit (vetëm versioni i korrigjimit)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulo modalitetin e satelitit të operatorit celular (vetëm versioni i korrigjimit)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testo modalitetin real të \"eSOS satelitor\" (vetëm versioni i korrigjimit)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Shiko librin e adresave të kartës SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Shiko numrat me telefonim të përzgjedhur"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Shiko numrat e telefonit të shërbimit"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index d25009f..3c61e72 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Подешавања позива"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Само кориснику са администраторским правима је дозвољено да мења подешавања позива."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Подешавања налога телефона може да промени само администратор или пословни корисник."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Власник уређаја је ограничио могућност промене подешавања мобилне мреже."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Изађите из режима хитног повратног позива да бисте упутили позив који није хитан."</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_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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Није могуће стављати позиве на чекање."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Повежите се на бежичну мрежу да бисте упутили позив."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Омогућите позивање преко WiFi-а да бисте упутили позив."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Онемогућите сателитски режим да бисте упутили позив."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Да бисте упутили позив, прво завршите сателитску везу."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Можете да шаљете и примате поруке без мобилне или WiFi мреже."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Информације за хитне случајеве"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Власник"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Додирните поново да бисте видели информације"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Подеси преносиви eSIM као подразумевани"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Напајање за радио на мобилним уређајима"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Симулација не функционише (само верзија са отклоњеним грешкама)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Лажни режим мобилног оператера за слање преко сателита (само верзија за отклањање грешака)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Тестирајте стварни сателитски eSOS режим (само верзија са отклоњеним грешкама)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Прикажи адресар SIM-а"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Прикажи бројеве за фиксно бирање"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Прикажи бројеве за сервисно бирање"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 1906ed7..65921b3 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Samtalsinställningar"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Det är bara administratören som kan ändra samtalsinställningar."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Endast administratören eller arbetsanvändaren får ändra telefonens kontoinställningar."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Enhetens ägare har begränsat möjligheten att ändra inställningar för mobilnätverk."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Inställningar (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Felaktiga samtalsinställningar"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Läser inställningar…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Avsluta läget för återuppringning vid nödsamtal om du vill ringa ett vanligt samtal."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Inte registrerat på nätverk."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Inget mobilt nätverk är tillgängligt."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Det finns inga tillgängliga mobilnätverk.\n\nAnslut till ett trådlöst nätverk om du vill ringa.\n\n2G har inaktiverats på den här enheten, vilket kan påverka anslutningen. Öppna inställningarna och aktivera Tillåt 2G om du vill fortsätta."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Det finns inga tillgängliga mobilnätverk. Anslut till ett trådlöst nätverk om du vill ringa."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Det finns inget mobilnätverk.\n\nAnslut till ett trådlöst nätverk om du vill ringa ett samtal.\n\n2G har inaktiverats på den här enheten, vilket kan påverka anslutningen. Öppna inställningarna och aktivera Tillåt 2G om du vill fortsätta."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Ange ett giltigt nummer om du vill ringa ett samtal."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Det gick inte att koppla samtalet."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Det går inte att lägga till samtalet just nu. Ta istället kontakt genom att skicka ett meddelande."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Det går inte att hålla kvar samtal."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Anslut till ett trådlöst nätverk om du vill ringa."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Aktivera wifi-samtal för att ringa."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Inaktivera satellitläget om du vill ringa ett samtal."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Om du vill ringa ett samtal måste du först avsluta satellitanslutningen."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Du kan skicka och ta emot meddelanden utan mobil- eller wifi-nätverk."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Nödinformation"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Ägare"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Tryck igen för att visa information"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Ställ in Flyttbart eSIM som standard"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Strömförsörjning för mobilradio"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Simulera ur funktion (endast felsökningsversion)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Simulering av operatörssatellitläge (version endast för felsökning)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Testa verkligt eSOS-satellitläge (endast felsökningsversion)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Visa SIM-adressbok"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Visa Fasta nummer"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Visa tjänstenummer"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 9e1f6fe..c18c00e 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Mipangilio ya simu"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Mipangilio ya simu inaweza kubadilishwa na mtumiaji wa akaunti ya msimamizi."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Mipangilio ya akaunti ya simu inaweza tu kubadilishwa na msimamizi au mtumiaji wa kazini."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Mmiliki wa kifaa amezuia kubadilisha mipangilio ya mtandao wa simu."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Mipangilio (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Hitilafu ya mipangilio ya kupiga simu"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Inasoma mipangilio…."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Ondoka kwenye hali ya kupiga simu za dharura ili upige simu zisizokuwa za dharura."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Haijasajiliwa kwa mitandao"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mtandao wa simu haupatikani."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mtandao wa simu haupatikani.\n\nUnganisha kwenye mtandao pasiwaya ili upige simu.\n\n2G imezimwa kwenye kifaa hiki, hali ambayo huenda inaathiri muunganisho wako. Nenda kwenye Mipangilio kisha uwashe \'Ruhusu 2G\' ili uendelee."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mtandao wa simu za mkononi haupatikani. Unganisha kwenye mtandao pasiwaya ili upige simu."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mtandao wa simu haupatikani.\n\nUnganisha kwenye mtandao pasiwaya ili upige simu.\n\n2G imezimwa kwenye kifaa hiki, hali ambayo huenda inaathiri muunganisho wako. Nenda kwenye Mipangilio kisha uwashe \'Ruhusu 2G\' ili uendelee."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Ili upige simu, weka namba sahihi."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Imeshindwa kupiga simu."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Simu haiwezi kuongezwa kwa sasa. Unaweza kujaribu kuwasiliana kwa kutuma ujumbe."</string>
@@ -557,12 +560,13 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Haiwezi kushikilia simu."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Unganisha kwenye mtandao pasiwaya ili upige simu."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Washa kipengele cha kupiga simu kupitia Wi-Fi ili upige simu."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Zima hali ya sateliti ili upige simu."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Ili uweze kupiga simu, kwanza katisha muunganisho wa setilaiti."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Unaweza kutuma na kupokea ujumbe bila mtandao wa simu au Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Maelezo ya dharura"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Mmiliki"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Gusa tena ili uangalie maelezo"</string>
     <string name="emergency_enable_radio_dialog_title" msgid="2667568200755388829">"Simu ya dharura"</string>
-    <string name="single_emergency_number_title" msgid="8413371079579067196">"Nambari ya dharura"</string>
+    <string name="single_emergency_number_title" msgid="8413371079579067196">"Namba ya dharura"</string>
     <string name="numerous_emergency_numbers_title" msgid="8972398932506755510">"Nambari za dharura"</string>
     <string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"Gusa tena ili upige <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>"</string>
     <string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"Inawasha redio..."</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Weka eSIM Inayoweza Kuondolewa kama Chaguomsingi"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Nishati ya Redio ya Vifaa vya Mkononi"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Kifaa cha Kuiga Hakifanyi Kazi (Muundo wa Utatuzi pekee)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Hali ya Setilaiti ya Jaribio la Mtoa Huduma (Muundo wa Utatuzi pekee)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Kujaribu hali ya msaada halisi wa mtandaoni kupitia setilaiti (Muundo wa Utatuzi pekee)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Angalia Kitabu cha Anwani katika SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ona Nambari za Simu Zilizobainishwa"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Angalia Nambari Zilizowekwa na Mtoa Huduma"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 620d4c0..24a1a8c 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"அழைப்பு அமைப்பு"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"நிர்வாகிப் பயனர் மட்டுமே அழைப்பிற்கான அமைப்புகளை மாற்ற முடியும்."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"நிர்வாகி/பணிக்கணக்கு பயனர் மட்டுமே அமைப்புகளை மாற்றலாம்."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"மொபைல் நெட்வொர்க் அமைப்புகளை மாற்றும் வசதியைச் சாதன உரிமையாளர் முடக்கியுள்ளார்."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"வழக்கமான அழைப்பிற்கு, அவசரகாலத் திரும்ப அழைக்கும் பயன்முறையிலிருந்து வெளியேறவும்."</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\nஇந்தச் சாதனத்தில் 2G முடக்கப்பட்டுள்ளதால் இணைப்பு பாதிக்கப்பட்டிருக்கலாம். தொடர, அமைப்புகளுக்குச் சென்று \'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\nஇந்தச் சாதனத்தில் 2G முடக்கப்பட்டுள்ளதால் இணைப்பு பாதிக்கப்பட்டிருக்கலாம். தொடர, அமைப்புகளுக்குச் சென்று \'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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"அழைப்புகளை ஹோல்டு செய்ய முடியாது."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"அழைக்க, வயர்லெஸ் நெட்வொர்க்குடன் இணைக்கவும்."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"அழைக்க, வைஃபை அழைப்பை இயக்கவும்."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"அழைப்பை மேற்கொள்ள சாட்டிலைட் பயன்முறையை முடக்கவும்."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"அழைக்க, முதலில் சாட்டிலைட் இணைப்பை ஆஃப் செய்யவும்."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"மொபைல்/வைஃபை நெட்வொர்க் இல்லாமல் நீங்கள் மெசேஜ்களை அனுப்பலாம் பெறலாம்."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"அவசரத் தகவல்"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"உரிமையாளர்"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"தகவலைப் பார்க்க, மீண்டும் தட்டவும்"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"அகற்றக்கூடிய eSIMமை இயல்பாக அமை"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"மொபைல் ரேடியோ பவர்"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"சாதனம் \'வேலை செய்யவில்லை\' என்பதை சிமுலேட் செய்தல் (பிழைதிருத்தப் பதிப்பில் மட்டும்)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mock மொபைல் நிறுவன சாட்டிலைட் பயன்முறை (பிழைதிருத்த பதிப்பு மட்டும்)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"அசல் சாட்டிலைட் eSOS பயன்முறை (பிழைதிருத்தப் பதிப்பு மட்டும்)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"சிம் முகவரிப் புத்தகத்தைக் காட்டு"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"நிலையான அழைப்பு எண்களைக் காட்டு"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"சேவை அழைப்பு எண்களைக் காட்டு"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index da15813..ba6a581 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"కాల్ సెట్టింగ్‌లు"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"కాల్ సెట్టింగ్‌లను నిర్వాహక వినియోగదారు మాత్రమే మార్చగలరు."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"ఫోన్ ఖాతా సెట్టింగ్‌లను అడ్మిన్ లేదా వర్క్ యూజర్ మాత్రమే మార్చగలరు."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"పరికర ఓనర్ మొబైల్ నెట్‌వర్క్ సెట్టింగ్‌లను మార్చగల సామర్థ్యాన్ని పరిమితం చేశారు."</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>
@@ -382,9 +383,9 @@
     <string name="enable_disable_atr" msgid="821714821057385390">"ప్రాంతపు ట్రాఫిక్ రిపోర్ట్‌లు"</string>
     <string name="atr_enable" msgid="1799097759998768186">"ప్రాంతపు ట్రాఫిక్ రిపోర్ట్‌లు ప్రారంభించబడ్డాయి"</string>
     <string name="atr_disable" msgid="6456758173289065766">"ప్రాంతపు ట్రాఫిక్ రిపోర్ట్‌లు నిలిపివేయబడ్డాయి"</string>
-    <string name="enable_disable_lafs" msgid="7448060358300805661">"స్థానిక విమానాశ్రయ విమాన షెడ్యూల్‌లు"</string>
-    <string name="lafs_enable" msgid="3125783406052655690">"స్థానిక విమానాశ్రయ విమాన షెడ్యూల్‌లు ప్రారంభించబడ్డాయి"</string>
-    <string name="lafs_disable" msgid="7326815066813851447">"స్థానిక విమానాశ్రయ విమాన షెడ్యూల్‌లు నిలిపివేయబడ్డాయి"</string>
+    <string name="enable_disable_lafs" msgid="7448060358300805661">"స్థానిక విమానాశ్రయ విమాన షెడ్యూళ్లు"</string>
+    <string name="lafs_enable" msgid="3125783406052655690">"స్థానిక విమానాశ్రయ విమాన షెడ్యూళ్లు ప్రారంభించబడ్డాయి"</string>
+    <string name="lafs_disable" msgid="7326815066813851447">"స్థానిక విమానాశ్రయ విమాన షెడ్యూళ్లు నిలిపివేయబడ్డాయి"</string>
     <string name="enable_disable_restaurants" msgid="3873247081569423019">"రెస్టారెంట్‌లు"</string>
     <string name="restaurants_enable" msgid="5810452674239139572">"రెస్టారెంట్‌లు ప్రారంభించబడ్డాయి"</string>
     <string name="restaurants_disable" msgid="2733507854548413505">"రెస్టారెంట్‌లు నిలిపివేయబడ్డాయి"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"సాధారణ కాల్ చేయడానికి అత్యవసర కాల్‌బ్యాక్ మోడ్ నుండి నిష్క్రమించండి."</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\nఈ పరికరంలో 2G డిజేబుల్ చేయబడింది, ఇది మీ కనెక్టివిటీని ప్రభావితం చేస్తూ ఉండవచ్చు. సెట్టింగ్‌లకు వెళ్లి, \'కొనసాగించడానికి 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\nఈ పరికరంలో 2G డిజేబుల్ చేయబడింది, ఇది మీ కనెక్టివిటీని ప్రభావితం చేస్తూ ఉండవచ్చు. సెట్టింగ్‌లకు వెళ్లి, \'కొనసాగించడానికి 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"కాల్స్‌ను హోల్డ్ చేయలేరు."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"కాల్ చేయడానికి వైర్‌లెస్ నెట్‌వర్క్‌కు కనెక్ట్ చేయండి."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"కాల్‌ను చేయడానికి Wi-Fi కాలింగ్‌ను ప్రారంభించండి."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"కాల్ చేయడానికి ఉపగ్రహ మోడ్‌ను డిజేబుల్ చేయండి."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"కాల్ చేయడానికి, ముందుగా శాటిలైట్ కనెక్షన్‌ను ముగించండి."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"మీరు మొబైల్ లేదా Wi-Fi నెట్‌వర్క్ లేకుండా మెసేజ్‌లను పంపవచ్చు, స్వీకరించవచ్చు."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"అత్యవసర సమాచారం"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"యజమాని"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"సమాచారాన్ని చూడడానికి మళ్లీ నొక్కండి"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"తీసివేయగలిగే eSIMని ఆటోమేటిక్ సెట్టింగ్‌గా సెట్ చేయండి"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"మొబైల్ రేడియో పవర్"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"పరికరాన్ని సిమ్యులేట్ చేయడం అందుబాటులో లేదు (డీబగ్ బిల్డ్ మోడ్‌లో మాత్రమే)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"మాక్ క్యారియర్ శాటిలైట్ మోడ్ (డీబగ్ బిల్డ్ మోడ్‌లో మాత్రమే)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"రియల్ శాటిలైట్ eSOS మోడ్‌ను టెస్ట్ చేయండి (డీబగ్ బిల్డ్ మోడ్‌లో మాత్రమే)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM అడ్రస్‌ పుస్తకాన్ని చూడండి"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ఫిక్స్‌డ్ డయలింగ్ నంబర్‌లను చూడండి"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"సర్వీస్ డయలింగ్ నంబర్‌లను చూడండి"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 1ada10d..1994bdf 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"การตั้งค่าการโทร"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"ผู้ใช้ระดับผู้ดูแลระบบเท่านั้นที่สามารถเปลี่ยนแปลงการตั้งค่าการโทรได้"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"เฉพาะผู้ดูแลระบบหรือผู้ใช้ที่ทำงานเท่านั้นที่สามารถเปลี่ยนการตั้งค่าบัญชีของโทรศัพท์ได้"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"เจ้าของอุปกรณ์ได้จำกัดความสามารถในการเปลี่ยนการตั้งค่าเครือข่ายมือถือ"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"โปรดออกจากโหมดการโทรกลับกรณีฉุกเฉินเพื่อโทรไปยังหมายเลขที่ไม่ใช่หมายเลขฉุกเฉิน"</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\nอุปกรณ์นี้ปิดใช้งาน 2G อยู่ซึ่งอาจส่งผลต่อการเชื่อมต่อ โปรดไปที่การตั้งค่าและเปิด \"อนุญาตให้ใช้ 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\nอุปกรณ์นี้ปิดใช้งาน 2G อยู่ซึ่งอาจส่งผลต่อการเชื่อมต่อ โปรดไปที่การตั้งค่าและเปิด \"อนุญาตให้ใช้ 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"ไม่สามารถถือสายรอได้"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"เชื่อมต่อเครือข่ายไร้สายเพื่อโทรออก"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"เปิดใช้การโทรผ่าน Wi-Fi เพื่อโทรออก"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"ปิดโหมดดาวเทียมเพื่อโทรออก"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"หากต้องการโทรออก ให้หยุดการเชื่อมต่อดาวเทียมก่อน"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"คุณรับส่งข้อความผ่านดาวเทียมได้โดยไม่ต้องใช้เครือข่ายมือถือหรือ Wi-Fi"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ข้อมูลสำหรับกรณีฉุกเฉิน"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"เจ้าของ"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"แตะอีกครั้งเพื่อดูข้อมูล"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"กำหนดให้ eSIM แบบนำออกได้เป็นค่าเริ่มต้น"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"กำลังส่งของวิทยุเครือข่ายมือถือ"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"จําลองความไม่พร้อมให้บริการ (บิลด์การแก้ไขข้อบกพร่องเท่านั้น)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"โหมดดาวเทียมของผู้ให้บริการจำลอง (บิลด์การแก้ไขข้อบกพร่องเท่านั้น)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"ทดสอบโหมด eSOS ของดาวเทียมจริง (บิลด์การแก้ไขข้อบกพร่องเท่านั้น)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"ดูสมุดที่อยู่ของซิม"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"ดูการจำกัดหมายเลขโทรออก"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"ดูหมายเลขรับบริการโทรออก"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 81d5bd3..7dd659f 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Mga setting ng tawag"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Ang admin user lang ang maaaring magbago sa mga setting ng tawag."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Ang admin o user sa trabaho lang ang puwedeng magbago sa mga setting ng account ng telepono."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Pinaghigpitan ng may-ari ng device ang kakayahang baguhin ang mga setting ng mobile network."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Mga Setting (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Error sa mga setting ng tawag"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Binabasa ang mga setting…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Lumabas sa emergency callback mode upang makapagsagawa ng hindi pang-emergency na pagtawag."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Hindi nakarehistro sa network."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Hindi available ang mobile network."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Hindi available ang mobile network.\n\nKumonekta sa wireless network para tumawag.\n\nNaka-disable ang 2G sa device na ito, na posibleng nakakaapekto sa iyong pagkakonekta. Pumunta sa Mga Setting at i-enable ang Payagan ang 2G para magpatuloy."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Hindi available ang mobile network. Kumonekta sa isang wireless network upang tumawag."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Hindi available ang mobile network.\n\nKumonekta sa wireless network para tumawag.\n\nNaka-disable ang 2G sa device na ito, na posibleng nakakaapekto sa iyong pagkakonekta. Pumunta sa Mga Setting at i-enable ang Payagan ang 2G para magpatuloy."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Upang tumawag, maglagay ng wastong numero."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Nabigo ang tawag."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Hindi maidaragdag ang tawag na ito sa ngayon. Maaari mong subukang makipag-ugnayan sa pamamagitan ng pagpapadala ng isang mensahe."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Hindi makakapag-hold ng mga tawag."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Kumonekta sa isang wireless network upang makatawag."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"I-enable ang pagtawag sa Wi-Fi upang tumawag."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"I-disable ang satellite mode para tumawag."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Para tumawag, wakasan muna ang koneksyon sa satellite."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Puwede kang magpadala at tumanggap ng mga mensahe nang walang mobile o Wi-Fi network."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Impormasyong pang-emergency"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"May-ari"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"I-tap muli para tingnan ang impormasyon"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Itakda na Default ang Naaalis na eSIM"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobile Radio Power"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Mag-simulate ng Hindi Gumagana (Build sa Pag-debug lang)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Satellite Mode ng Mock Carrier (Debug Build lang)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Test real satellite eSOS mode (Build sa Pag-debug lang)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Tingnan ang Address Book ng SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Tingnan ang Mga Fixed Dialing Number"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Tingnan ang Mga Service Dialing Number"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 40eb5e7..3bb1dc5 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Çağrı ayarları"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Çağrı ayarları sadece yönetici tarafından değiştirilebilir."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Telefon hesabı ayarları, yalnızca yönetici veya iş kullanıcısı tarafından değiştirilebilir."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Cihaz sahibi, mobil ağ ayarlarını değiştirme özelliğini kısıtladı."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Ayarlar (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Çağrı ayarları hatası"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Ayarlar okunuyor..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Acil durum çağrısı dışında bir çağrı yapmak için acil durumda geri aranma modundan çıkın."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ağda kayıtlı değil."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mobil ağ kullanılamıyor."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobil ağ kullanılamıyor.\n\nArama yapmak için kablosuz ağa bağlanın.\n\nBu cihazda 2G devre dışı olduğundan bağlantınız etkilenebilir. Devam etmek için Ayarlar\'a gidip \"2G\'ye izin ver\" ayarını etkinleştirin."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobil ağ kullanılamıyor. Telefon etmek için kablosuz ağa bağlanın."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobil ağ kullanılamıyor.\n\nArama yapmak için kablosuz ağa bağlanın.\n\nBu cihazda 2G devre dışı olduğundan bağlantınız etkilenebilir. Devam etmek için Ayarlar\'a gidip \"2G\'ye izin ver\" ayarını etkinleştirin."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Arama yapmak için geçerli bir numara girin."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Sesli arama başarısız oldu."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Çağrı şu anda eklenemiyor. Mesaj göndererek ulaşmayı deneyebilirsiniz."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Çağrılar beklemeye alınamıyor."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Telefon etmek için kablosuz ağa bağlanın."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Telefon etmek için Kablosuz çağrı\'yı etkinleştirin."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Arama yapmak için uydu modunu devre dışı bırakın."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Arama yapmak için önce uydu bağlantısını sonlandırın."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Mobil veya kablosuz ağa bağlı olmadan mesaj alıp gönderebilirsiniz."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Acil durum bilgisi"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Sahip"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Bilgileri görüntülemek için tekrar dokunun"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Çıkarılabilir eSIM\'i Varsayılan Yap"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Mobil Radyo Gücü"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Hizmet Dışı Simülasyonu (Yalnızca Hata Ayıklama Derlemesi)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Örnek operatör uydu modu (yalnızca hata ayıklama derlemesi)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Gerçek uydu eSOS modunu test et (yalnızca hata ayıklama derlemesi)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM Adres Defterini Görüntüle"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Sabit Arama Numaralarını Görüntüle"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Hizmet Arama Numaralarını Görüntüle"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 345d8e7..0a994dc 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Налаштування викликів"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Налаштування викликів може змінювати лише адміністратор."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Налаштування облікового запису телефона може змінювати лише співробітник, який із ним працює, або адміністратор."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Власник пристрою заборонив змінювати налаштування мобільної мережі."</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Щоб зателефонувати на звичайний номер, вимкніть режим екстрених викликів."</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\nНа цьому пристрої вимкнено 2G, що може вплинути на з’єднання. Щоб продовжити, перейдіть у налаштування й увімкніть \"Дозволити 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\nНа цьому пристрої вимкнено 2G, що може вплинути на з’єднання. Щоб продовжити, перейдіть у налаштування й увімкніть \"Дозволити 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Не можна призупиняти виклики."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Щоб зателефонувати, під’єднайтеся до бездротової мережі."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Щоб мати змогу телефонувати, увімкніть виклики через Wi-Fi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Щоб зателефонувати, вимкніть режим супутника."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Щоб зателефонувати, спершу відключіть супутниковий зв’язок."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Ви можете надсилати й отримувати повідомлення, не використовуючи Wi-Fi або мобільну мережу."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Дані для екстрених випадків"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Власник"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Торкніться ще раз, щоб переглянути відомості"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Установити знімну eSIM-карту як карту за умовчанням"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Потужність мобільного радіо"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Імітація знаходження поза зоною обслуговування (лише складання для налагодження)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Режим супутника оператора Mock (лише складання для налагодження)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Тестувати реальний режим супутникового сигналу SOS (лише складання для налагодження)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Переглянути адресну книгу SIM-карти"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Переглянути фіксовані номери"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Переглянути службові номери"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 520f493..840cc56 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"کال کی ترتیبات"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"صرف منتظم صارف ہی کال کی ترتیبات تبدیل کر سکتا ہے۔"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"صرف منتظم یا دفتر کا صارف ہی فون کے اکاؤنٹ کی ترتیبات تبدیل کر سکتا ہے۔"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"آلہ کے مالک نے موبائل نیٹ ورک کی ترتیبات کو تبدیل کرنے کی صلاحیت کو محدود کر دیا ہے۔"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"غیر ایمرجنسی کال کرنے کیلئے ایمرجنسی کال بیک موڈ سے اخراج کریں۔"</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\n‫2G اس آلے پر غیر فعال ہے، جو آپ کی کنیکٹیوٹی کو متاثر کر سکتا ہے۔ ترتیبات پر جائیں اور \'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\n‫2G اس آلے پر غیر فعال ہے، جو آپ کی کنیکٹیوٹی کو متاثر کر سکتا ہے۔ ترتیبات پر جائیں اور \'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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"کالز کو ہولڈ نہیں کیا جا سکتا۔"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"کال کرنے کیلئے کسی وائرلیس نیٹ ورک سے منسلک ہوں۔"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"‏کال کرنے کیلئے Wi-Fi کالنگ فعال کریں۔"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"کال کرنے کیلئے سیٹلائٹ موڈ کو غیرفعال کریں"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"کال کرنے کے لیے، پہلے سیٹلائٹ کنکشن ختم کریں۔"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"‏آپ موبائل یا Wi-Fi نیٹ ورک کے بغیر پیغامات بھیج اور موصول کر سکتے ہیں۔"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"ایمرجنسی معلومات"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"مالک"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"معلومات دیکھنے کیلئے دوبارہ تھپتھپائیں"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"‏ہٹانے لائق eSIM کو بطور ڈیفالٹ سیٹ کریں"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"موبائل ریڈیو پاور"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"\'سروس دستیاب نہیں ہے\' موڈ کو سمیولیٹ کریں (صرف ڈیبگ بلڈ کیلئے)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"موک کیریئر سیٹلائٹ موڈ (صرف ڈیبگ بلڈ)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"‏اصل سیٹلائٹ eSOS وضع کی جانچ کریں (صرف ڈیبگ بلڈ)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"‏SIM ایڈریس بک دیکھیں"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"فکسڈ ڈائلنگ نمبرز دیکھیں"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"سروس ڈائلنگ نمبرز دیکھیں"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 19d5563..10b7667 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Chaqiruv sozlamalari"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Faqat administrator qo‘ng‘iroq sozlamalarini o‘zgartirishi mumkin."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Telefondagi hisob sozlamalarini faqat administrator yoki ishxona foydalanuvchisi oʻzgartirishi mumkin."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Qurilma egasi mobil tarmoq sozlamalarini oʻzgartirish imkoniyatini cheklagan."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Sozlamalar (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Chaqiruv sozlamalarida xato"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Sozlamalar olinmoqda…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Odatiy qo‘ng‘iroq qilish uchun favqulodda qayta qo‘ng‘iroq rejimidan chiqing."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Tarmoqda ro‘yxatdan o‘tmagan."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Uyali tarmoq mavjud emas."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Mobil tarmoq ishlamayapti.\n\nTelefon qilish uchun simsiz tarmoqqa ulaning.\n\nBu qurilmada 2G yoqilmagan va aloqaga taʼsir qilishi mumkin. Davom etish uchun Sozlamalar orqali 2G ulanishga ruxsat bering."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Mobil tarmoqdan foydalanib bo‘lmaydi. Qo‘ng‘iroq qilish uchun Wi-Fi tarmog‘iga ulaning."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Mobil tarmoq ishlamayapti.\n\nTelefon qilish uchun simsiz tarmoqqa ulaning.\n\nBu qurilmada 2G yoqilmagan va aloqaga taʼsir qilishi mumkin. Davom etish uchun Sozlamalar orqali 2G ulanishga ruxsat bering."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Qo‘ng‘iroq qilish uchun raqamni to‘g‘ri kiriting."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Chaqiruv amalga oshmadi."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Qo‘ng‘iroq qilib bo‘lmayapti. Xabar yuborib ko‘ring."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Qo‘ng‘iroqlarni ushlab turib bo‘lmadi."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Qo‘ng‘iroq qilish uchun simsiz tarmoqqa ulaning"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Qo‘ng‘iroq qilish uchun Wi-Fi qo‘ng‘iroqlar funksiyasini yoqing."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Telefon qilish uchun sputnik rejimini faolsizlantiring."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Telefon qilish uchun avval sputnik orqali aloqani uzing."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Mobil yoki Wi-Fi tarmoqsiz xabarlarni yuborish va qabul qilish mumkin."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Favqulodda vaziyatlar uchun axborot"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Egasi"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Axborotni ochish uchun yana bir marta bosing"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Olinadigan eSIM kartani birlamchi qilib belgilash"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Radio signal quvvati"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Xizmatdan tashqari simulyatsiya (faqat nosozliklarni aniqlash dasturi uchun)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Soxta operator sputnik rejimi (faqat debag nashrida)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Haqiqiy sputnik eSOS rejimini sinash (faqat debag nashrida)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"SIM kartadagi abonentlar ro‘yxatini ochish"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Ruxsat etilgan raqamlar ro‘yxatini ochish"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Xizmatlarni terish raqamlarini ochish"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index ebaf17f..5935a58 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Cài đặt cuộc gọi"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Chỉ người dùng quản trị mới có thể thay đổi cài đặt cuộc gọi."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Chỉ quản trị viên hoặc người dùng tài khoản cho công việc mới có thể thay đổi chế độ cài đặt tài khoản điện thoại."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Chủ sở hữu thiết bị đã hạn chế khả năng thay đổi chế độ cài đặt mạng di động."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Cài đặt (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Lỗi cài đặt cuộc gọi"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Đang đọc các tùy chọn cài đặt…"</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Thoát khỏi chế độ gọi lại khẩn cấp để thực hiện cuộc gọi không khẩn cấp."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Chưa được đăng ký trên mạng."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Mạng di động không khả dụng."</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Không có mạng di động.\n\nHãy kết nối với mạng không dây để gọi điện.\n\n2G đã bị tắt trên thiết bị này. Điều này có thể ảnh hưởng đến khả năng kết nối của bạn. Chuyển đến phần Cài đặt rồi bật tuỳ chọn Cho phép 2G để tiếp tục."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Hiện không có mạng di động. Hãy kết nối với mạng không dây để thực hiện cuộc gọi."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Không có mạng di động.\n\nHãy kết nối với mạng không dây để gọi điện.\n\n2G đã bị tắt trên thiết bị này. Điều này có thể ảnh hưởng đến khả năng kết nối của bạn. Chuyển đến phần Cài đặt rồi bật cài đặt Cho phép 2G để tiếp tục."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Để thực hiện cuộc gọi, hãy nhập một số hợp lệ."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Cuộc gọi không thành công."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Không thể thêm cuộc gọi tại thời điểm này. Bạn có thể cố gắng liên hệ bằng cách gửi tin nhắn."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Không thể giữ cuộc gọi."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Kết nối với mạng không dây để thực hiện cuộc gọi."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Bật gọi điện qua Wi-Fi để thực hiện cuộc gọi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Hãy tắt chế độ vệ tinh để gọi điện."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Để gọi điện, trước tiên hãy tắt kết nối vệ tinh."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Bạn có thể gửi và nhận tin nhắn mà không cần mạng di động hoặc mạng Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Thông tin khẩn cấp"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Chủ sở hữu"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Nhấn lại để xem thông tin"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Đặt eSIM có thể tháo rời là Mặc định"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Cường độ của sóng di động"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Mô phỏng thiết bị không hoạt động (chỉ dành cho bản gỡ lỗi)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Mô phỏng chế độ vệ tinh của nhà mạng (chỉ dành cho Bản gỡ lỗi)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Thử nghiệm chế độ eSOS thực tế qua vệ tinh (chỉ bản gỡ lỗi)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Xem sổ địa chỉ trên SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Xem số gọi định sẵn"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Xem số quay số dịch vụ"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 8fabe04..a53e592 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"通话设置"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"只有管理员用户才能更改通话设置。"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"电话账号设置只能由管理员或工作资料用户更改。"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"设备所有者对更改移动网络设置的功能进行了限制。"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"要拨打非紧急电话,请先退出紧急回拨模式。"</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\n此设备已停用 2G,这可能会影响您的连接。如需继续操作,请前往“设置”并启用“允许启用 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\n此设备已停用 2G,这可能会影响您的连接。如需继续操作,请前往“设置”并启用“允许启用 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"无法保持通话。"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"需连接至无线网络才能拨打电话。"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"启用 WLAN 通话功能以拨打电话。"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"停用卫星模式才能拨打电话。"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"如要拨打电话,请先结束卫星连接。"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"您无需使用移动网络或 Wi-Fi 网络便能收发消息。"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"急救信息"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"所有者"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"再次点按即可查看信息"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"将可卸载的 eSIM 卡设为默认 eSIM 卡"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"移动无线装置电源"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"模拟服务终止(仅限调试 build)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"模拟运营商卫星模式(仅限调试 build)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"测试真实的卫星 eSOS 模式(仅限调试 build)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"查看 SIM 卡通讯录"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"查看固定拨号号码"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"查看服务拨号号码"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 0fadc35..a338e3b 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"通話設定"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"只有管理員可以變更通話設定。"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"只有管理員或工作設定檔使用者才可以變更手機帳戶設定。"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"裝置擁有者已限制變更流動網絡設定的能力。"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"離開緊急回撥模式即可撥打非緊急電話。"</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\n此裝置已停用 2G,可能影響到裝置的連接性。請先前往「設定」開啟「允許 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"無法保留通話。"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"連接無線網絡,以撥打電話。"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"啟用 Wi-Fi 通話功能以撥打電話。"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"如要撥打電話,請停用衛星模式。"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"如要撥打電話,請先中斷衛星連接。"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"你可在沒有流動/Wi-Fi 網絡的情況下收發訊息。"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"緊急資料"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"擁有者"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"再次輕按即可查看資訊"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"將可移除的 eSIM 卡設為預設值"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"流動無線電的電源"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"模擬沒有服務 (僅限偵錯版本)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"模擬流動網絡供應商衛星模式 (僅限偵錯版本)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"測試「緊急衛星連接」真實模式 (僅限偵錯版本)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"查看 SIM 卡通訊錄"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"查看固定撥號"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"查看服務撥號"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index c2aa76c..99e2912 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"通話設定"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"只有管理員使用者可以變更通話設定。"</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"只有管理員或公司內部使用者可以變更手機帳戶設定。"</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"裝置擁有者限制了變更行動網路設定的功能。"</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>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"結束緊急回撥模式,以便撥打非緊急電話。"</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"尚未註冊網路。"</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"無法使用 Google 行動服務網路。"</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"無法使用行動網路。\n\n如要撥打電話,請連線至無線網路。\n\n這部裝置已停用 2G,這可能會影響連線能力。請前往「設定」並啟用「允許啟用 2G」,再繼續操作。"</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"無法使用行動網路。連上 Wi-Fi 網路即可撥打電話。"</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"無法使用行動網路。\n\n如要撥打電話,請連線至無線網路。\n\n這部裝置已停用 2G,這可能會影響連線能力。請前往「設定」並啟用「允許啟用 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>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"無法保留通話。"</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"連上無線網路即可撥打電話。"</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"請啟用 Wi-Fi 通話功能以撥打電話。"</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"如要撥打電話,請停用衛星模式。"</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"如要撥打電話,請先結束衛星連線。"</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"你可以收發訊息,沒有行動/Wi-Fi 網路也無妨。"</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"緊急救援資訊"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"擁有者"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"再次輕觸即可查看資訊"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"將可移除的 eSIM 卡設為預設 eSIM 卡"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"行動無線電電源"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"模擬無法使用服務的情況 (僅限偵錯版本)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"模擬電信業者衛星模式 (僅限偵錯版本)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"實際測試衛星緊急求救模式 (僅限偵錯版本)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"查看 SIM 通訊錄"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"查看固定撥號"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"查看服務撥號號碼"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 452a3c8..12ac0bc 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -134,6 +134,7 @@
     <string name="updating_title" msgid="6130548922615719689">"Izilungiselelo zekholi"</string>
     <string name="call_settings_admin_user_only" msgid="7238947387649986286">"Izilungiselelo zekholi zingaguqulwa kuphela ngumsebenzisi oyinhloko."</string>
     <string name="phone_account_settings_user_restriction" msgid="9142685151087208396">"Amasethingi e-akhawunti yefoni angashintshwa kuphela umphathi noma umsebenzisi wasemsebenzini."</string>
+    <string name="phone_account_no_config_mobile_networks" msgid="7351062247756521227">"Umnikazi wedivayisi ukhawule amandla okushintsha amasethingi enethiwekhi yeselula."</string>
     <string name="call_settings_with_label" msgid="8460230435361579511">"Izilungiselelo (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="error_updating_title" msgid="2024290892676808965">"Iphutha lokulungiselela ikholi"</string>
     <string name="reading_settings" msgid="1605904432450871183">"Ifunda izilungiselelo..."</string>
@@ -542,7 +543,9 @@
     <string name="incall_error_ecm_emergency_only" msgid="5622379058883722080">"Phuma kwimodi yokushayela emuva yesiko esiphuthumayo ukuze wenze ikholi yemodi engaphuthumi."</string>
     <string name="incall_error_emergency_only" msgid="8786127461027964653">"Ayibhalisiwe kwinethiwekhi."</string>
     <string name="incall_error_out_of_service" msgid="1927265196942672791">"Inethiwekhi yefoni ayitholakali"</string>
+    <string name="incall_error_out_of_service_2g" msgid="904434080740846116">"Inethiwekhi yeselula ayitholakali.\n\nXhuma kunethiwekhi e-wireless ukuze ufone.\n\nU-2G ukhutshaziwe kule divayisi, okungenzeka kunomthelela ekuxhumaneni kwakho. Iya Kumasethingi bese uvula u-Vumela u-2G ukuze uqhubeke."</string>
     <string name="incall_error_out_of_service_wfc" msgid="4497663185857190885">"Inethiwekhi yeselula ayitholakali. Xhumeka kunethiwekhi engenantambo ukuze wenze ikholi."</string>
+    <string name="incall_error_out_of_service_wfc_2g_user" msgid="8218768986365299663">"Inethiwekhi yeselula ayitholakali.\n\nXhuma kunethiwekhi e-wireless ukuze ufone.\n\nU-2G ukhutshaziwe kule divayisi, okungenzeka kunomthelela ekuxhumaneni kwakho. Iya Kumasethingi bese uvula u-Vumela u-2G ukuze uqhubeke."</string>
     <string name="incall_error_no_phone_number_supplied" msgid="8680831089508851894">"Ukuze wenze ikholi, faka inombolo evumelekile."</string>
     <string name="incall_error_call_failed" msgid="393508653582682539">"Ikholi ihlulekile."</string>
     <string name="incall_error_cannot_add_call" msgid="5425764862628655443">"Ikholi ayikwazi ukungezwa ngalesi sikhathi. Ungazama ukufinyelela ngokuthumela umlayezo."</string>
@@ -557,7 +560,8 @@
     <string name="incall_error_supp_service_hold" msgid="8535056414643540997">"Ayikwazi ukubamba amakholi."</string>
     <string name="incall_error_wfc_only_no_wireless_network" msgid="5860742792811400109">"Xhumeka kunethiwekhi engenantambo ukuze wenze ikholi."</string>
     <string name="incall_error_promote_wfc" msgid="9164896813931363415">"Nika amandla ukushaya kwevoyisimeyili ukuze wenze ikholi."</string>
-    <string name="incall_error_satellite_enabled" msgid="1936541518147323016">"Khubaza umumo wesethelayithi ukuze wenze ikholi."</string>
+    <string name="incall_error_satellite_enabled" msgid="5247740814607087814">"Ukuze ufone, qala ngokuvala uxhumano lwesathelayithi."</string>
+    <string name="incall_error_carrier_roaming_satellite_mode" msgid="678603203562886361">"Ungathumela futhi wamukele imilayezo ngaphandle kwenethiwekhi yeselula noma ye-Wi-Fi."</string>
     <string name="emergency_information_hint" msgid="9208897544917793012">"Ulwazi lwesimo esiphuthumayo"</string>
     <string name="emergency_information_owner_hint" msgid="6256909888049185316">"Umnikazi"</string>
     <string name="emergency_information_confirm_hint" msgid="5109017615894918914">"Thepha futhi ukuze ubuke ulwazi"</string>
@@ -841,6 +845,8 @@
     <string name="removable_esim_string" msgid="7931369811671787649">"Setha i-eSim Esusekayo Njengezenzakalelayo"</string>
     <string name="radio_info_radio_power" msgid="8805595022160471587">"Amandla erediyo yeselula"</string>
     <string name="simulate_out_of_service_string" msgid="7787925611727597193">"Lingisa okuthi Ayikho Isevisi (Umakhiwo Wokususa Iphutha kuphela)"</string>
+    <string name="mock_carrier_roaming_satellite_string" msgid="4796300252858292593">"Imodi Yesethelayithi Yenkampani Yenethiwekhi ye-Mock (Susa Iphutha Esakhiweni kuphela)"</string>
+    <string name="esos_satellite_string" msgid="7274794226125968657">"Hlola imodi yesathelayithi yangempela ye-eSOS (Ukwakhiwa Kokususa Iphutha kuphela)"</string>
     <string name="radioInfo_menu_viewADN" msgid="4533179730908559846">"Buka incwadi yekheli le-SIM"</string>
     <string name="radioInfo_menu_viewFDN" msgid="1847236480527032061">"Buka Izinombolo Zokudayela Okungaguquki"</string>
     <string name="radioInfo_menu_viewSDN" msgid="2613431584522392842">"Buka Izinombolo Zokudayela Isevisi"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index f8aeb5e..cdef37e 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -318,13 +318,6 @@
     <string-array name="thermal_mitigation_allowlisted_packages" translatable="false">
     </string-array>
 
-    <!-- Array of carriers that don't care about NGRAN's preference in the preferred emergency
-         network scan list after SIM is removed. -->
-    <integer-array name="config_carriers_ignore_ngran_preference_when_sim_removed">
-        <!-- 001-01 Test SIM -->
-        <item>1911</item>
-    </integer-array>
-
     <!-- Array of countries that active SIM is needed for emergency calls. Values should be
          ISO3166 country codes in lowercase. -->
     <string-array name="config_countries_require_sim_for_emergency" translatable="false">
@@ -335,6 +328,16 @@
         <item>sg</item>
         <!-- b/198393826 -->
         <item>de</item>
+        <!-- b/334773484 -->
+        <item>gb</item>
+        <item>fr</item>
+        <item>be</item>
+        <item>ro</item>
+        <item>si</item>
+        <item>hr</item>
+        <item>gr</item>
+        <item>bg</item>
+        <item>my</item>
     </string-array>
 
     <!-- Array of countries that a normal service capable subscription is preferred
@@ -346,8 +349,45 @@
         <item>sg</item>
     </string-array>
 
+    <!-- Array of countries that a CS preferred scan is preferred after CSFB failure
+         due to the failure of extended service request. Values should be ISO3166
+         country codes in lowercase. -->
+    <string-array name="config_countries_prefer_cs_preferred_scan_after_csfb_failure"
+            translatable="false">
+        <!-- b/300022457 -->
+        <item>us</item>
+    </string-array>
+
+    <!-- Array of countries that GERAN is preferred than UTRAN and EUTRAN when SIM is absent.
+         Values should be ISO3166 country codes in lowercase. -->
+    <string-array name="config_countries_prefer_geran_when_sim_absent"
+            translatable="false">
+        <!-- b/335537430 -->
+        <item>cn</item>
+    </string-array>
+
+    <!-- Dynamic routing of emergency calls: trying normal routing if it's available.
+         Otherwise, emergency routing. -->
+    <!-- TODO (b/346398725: temporary code, cleanup) -->
+    <bool name="dynamic_routing_emergency_enabled">false</bool>
+
+    <!-- Array of countries that the dynamic routing is supported.
+         Values should be ISO3166 country codes in lowercase. -->
+    <string-array name="config_countries_dynamic_routing_emergency_enabled"
+            translatable="false">
+    </string-array>
+
+    <!-- Array of emergency numbers for dynamic routing.
+         Values are the tuples of Country ISO, MNC, and numbers. -->
+    <string-array name="config_dynamic_routing_emergency_numbers"
+            translatable="false">
+    </string-array>
+
     <!-- The component name(a flattened ComponentName string) for the telephony domain selection
          service. The device should fallback to the modem based domain selection architecture
          if this is not configured. -->
     <string name="config_domain_selection_service_component_name" translatable="false"></string>
+
+    <!-- Whether to turn off OEM-enabled satellite during emergency call -->
+    <bool name="config_turn_off_oem_enabled_satellite_during_emergency_call">false</bool>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 61143c9..87e7095 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -291,6 +291,8 @@
     <string name="call_settings_admin_user_only">Call settings can only be changed by the admin user.</string>
     <!-- Toast in Phone Account settings when asked to launch settings for a secondary/guest user -->
     <string name="phone_account_settings_user_restriction">Phone account settings can only be changed by the admin or work user.</string>
+    <!-- Toast in Phone Account settings when asked to launch settings when DISALLOW_CONFIG_MOBILE_NETWORKS is true -->
+    <string name="phone_account_no_config_mobile_networks">The device owner has restricted the ability to change mobile network settings.</string>
     <!-- Title of the "Call settings" settings screen, with a text label identifying which SIM the settings are for. -->
     <string name="call_settings_with_label">Settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
     <!-- Title of the alert dialog displayed if an error occurs while updating Call settings -->
@@ -1206,8 +1208,13 @@
     <string name="incall_error_emergency_only">Not registered on network.</string>
     <!-- In-call screen: call failure message displayed in an error dialog -->
     <string name="incall_error_out_of_service">Mobile network not available.</string>
+    <!-- In-call screen: call failure message displayed in an error dialog if 2G is disabled -->
+    <string name="incall_error_out_of_service_2g">Mobile network not available.\n\nConnect to a wireless network to make a call.\n\n2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable "Allow 2G" to continue.</string>
     <!-- In-call screen: call failure message displayed in an error dialog -->
     <string name="incall_error_out_of_service_wfc">Mobile network is not available. Connect to a wireless network to make a call.</string>
+    <!-- In-call screen: call failure message displayed in an error dialog if the user disabled 2G -->
+    <string name="incall_error_out_of_service_wfc_2g_user">Mobile network is not available.\n\nConnect to a wireless network to make a call.\n\n2G is disabled on this device, which may be impacting your connectivity. Go to Settings and enable "Allow 2G" to continue.</string>
+
     <!-- In-call screen: call failure message displayed in an error dialog -->
     <string name="incall_error_no_phone_number_supplied">To place a call, enter a valid number.</string>
     <!-- In-call screen: call failure message displayed in an error dialog -->
@@ -1240,7 +1247,9 @@
     <!-- In-call screen: call failure message displayed in an error dialog when the user is connected to a wireless network, but wifi calling is turned off. [CHAR_LIMIT=NONE] -->
     <string name="incall_error_promote_wfc">Enable Wi-Fi calling to make a call.</string>
     <!-- In-call screen: call failure message displayed in an error dialog when the satellite modem is on. [CHAR_LIMIT=NONE] -->
-    <string name="incall_error_satellite_enabled">Disable satellite mode to make a call.</string>
+    <string name="incall_error_satellite_enabled">To make a call, first end the satellite connection.</string>
+    <!-- In-call screen: call failure message displayed in an error dialog when device is connected to carrier roaming satellite network [CHAR_LIMIT=NONE] -->
+    <string name="incall_error_carrier_roaming_satellite_mode">You can send and receive messages without a mobile or Wi-Fi network.</string>
 
     <!-- Hint for the button of emergency information -->
     <string name="emergency_information_hint">Emergency information</string>
@@ -2019,6 +2028,11 @@
     <!-- Title for simulating device out of service. -->
     <string name="simulate_out_of_service_string">Simulate Out of Service (Debug Build only)</string>
 
+    <!-- Title for simulating SIM capable of satellite. -->
+    <string name="mock_carrier_roaming_satellite_string">Mock Carrier Satellite Mode (Debug Build only)</string>
+    <!-- Title for trigger real satellite eSOS. -->
+    <string name="esos_satellite_string">Test real satellite eSOS mode (Debug Build only)</string>
+
     <!-- Phone Info screen. Menu item label.  Used for diagnostic info screens, precise translation isn't needed -->
     <string name="radioInfo_menu_viewADN">View SIM Address Book</string>
     <!-- Phone Info screen. Menu item label.  Used for diagnostic info screens, precise translation isn't needed -->
@@ -2180,6 +2194,8 @@
     <string name="radio_info_nr_frequency">NR Frequency:</string>
     <!-- Radio Info screen. Label for a status item.  Used for diagnostic info screens, precise translation isn't needed -->
     <string name="radio_info_network_slicing_config" translatable="false">Network Slicing Config:</string>
+    <!-- Radio Info screen. Label for a status item.  Used for diagnostic info screens, precise translation isn't needed -->
+    <string name="radio_info_euicc_info" translatable="false">eUICC info:</string>
 
     <!-- Band Mode Selection -->
     <!-- Band mode screen.  Title of activity. -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 19798f0..435e3a6 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -202,6 +202,11 @@
         <item name="android:colorAccent">@color/dialer_theme_color</item>
         <item name="android:dialogTheme">@style/DialerAlertDialogTheme</item>
         <item name="android:homeAsUpIndicator">@drawable/ic_back_arrow</item>
+
+        <!--
+            TODO(b/309578419): Make activities handle insets properly and then remove this.
+        -->
+        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
     </style>
 
     <style name="DialerAlertDialogTheme"
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 145df41..1dfcde7 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -58,6 +58,7 @@
 import com.android.ims.ImsManager;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.flags.Flags;
 import com.android.phone.settings.PhoneAccountSettingsFragment;
 import com.android.phone.settings.SuppServicesUiUtil;
 import com.android.phone.settings.VoicemailSettingsActivity;
@@ -113,6 +114,7 @@
     private PreferenceScreen mVoicemailSettingsScreen;
     private SwitchPreference mEnableVideoCalling;
     private Preference mButtonWifiCalling;
+    private boolean mDisallowedConfig = false;
 
     /*
      * Click Listeners, handle click based on objects attached to UI.
@@ -263,6 +265,14 @@
             return;
         }
 
+        // Check if mobile network configs are restricted.
+        if (Flags.ensureAccessToCallSettingsIsRestricted() &&
+                userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
+            mDisallowedConfig = true;
+            Log.i(LOG_TAG, "Mobile network configs are restricted, disabling mobile network "
+                    + "settings");
+        }
+
         mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
         mPhone = mSubscriptionInfoHelper.getPhone();
         mSubscriptionInfoHelper.setActionBarTitle(
@@ -467,7 +477,7 @@
         if (mImsMgr.isVtEnabledByPlatform() && mImsMgr.isVtProvisionedOnDevice()
                 && (carrierConfig.getBoolean(
                         CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
-                || isDataEnabled)) {
+                || isDataEnabled) && !mDisallowedConfig) {
             boolean currentValue =
                     mImsMgr.isEnhanced4gLteModeSettingEnabledByUser()
                     ? mImsMgr.isVtEnabledByUser() : false;
diff --git a/src/com/android/phone/CallForwardEditPreference.java b/src/com/android/phone/CallForwardEditPreference.java
index d1c8303..b877112 100644
--- a/src/com/android/phone/CallForwardEditPreference.java
+++ b/src/com/android/phone/CallForwardEditPreference.java
@@ -26,6 +26,7 @@
 import com.android.internal.telephony.CommandException;
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.Flags;
 
 import java.util.HashMap;
 import java.util.Locale;
@@ -34,6 +35,9 @@
     private static final String LOG_TAG = "CallForwardEditPreference";
 
     private static final String SRC_TAGS[]       = {"{0}"};
+
+    private static final int DEFAULT_NO_REPLY_TIMER_FOR_CFNRY = 20;
+
     private CharSequence mSummaryOnTemplate;
     /**
      * Remembers which button was clicked by a user. If no button is clicked yet, this should have
@@ -154,7 +158,14 @@
                         .getCarrierConfigForSubId(mPhone.getSubId());
                 if (carrierConfig.getBoolean(
                         CarrierConfigManager.KEY_SUPPORT_NO_REPLY_TIMER_FOR_CFNRY_BOOL, true)) {
-                    time = 20;
+                    if (Flags.setNoReplyTimerForCfnry()) {
+                        // Get timer value from carrier config
+                        time = carrierConfig.getInt(
+                                CarrierConfigManager.KEY_NO_REPLY_TIMER_FOR_CFNRY_SEC_INT,
+                                DEFAULT_NO_REPLY_TIMER_FOR_CFNRY);
+                    } else {
+                        time = DEFAULT_NO_REPLY_TIMER_FOR_CFNRY;
+                    }
                 }
             }
             final String number = getPhoneNumber();
diff --git a/src/com/android/phone/CallWaitingSwitchPreference.java b/src/com/android/phone/CallWaitingSwitchPreference.java
index 00407f3..a5bc92e 100644
--- a/src/com/android/phone/CallWaitingSwitchPreference.java
+++ b/src/com/android/phone/CallWaitingSwitchPreference.java
@@ -35,6 +35,8 @@
     private int mUpdateStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
     private int mQueryStatus = TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR;
     private boolean mUssdMode = false;
+    private boolean mCwEnabled = false;
+    private boolean mCwClicked = false;
 
     public CallWaitingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
@@ -60,6 +62,7 @@
         PersistableBundle bundle = configManager.getConfigForSubId(phone.getSubId());
         mUssdMode = (bundle != null) ? bundle.getBoolean(
                 CarrierConfigManager.KEY_USE_CALL_WAITING_USSD_BOOL, false) : false;
+        mCwEnabled = false;
 
         if (!skipReading) {
             Log.d(LOG_TAG, "init getCallWaitingStatus");
@@ -101,7 +104,9 @@
     @Override
     protected void onClick() {
         super.onClick();
-        mTelephonyManager.setCallWaitingEnabled(isChecked(), mExecutor, this::updateStatusCallBack);
+        mCwEnabled = isChecked();
+        mCwClicked = true;
+        mTelephonyManager.setCallWaitingEnabled(mCwEnabled, mExecutor, this::updateStatusCallBack);
         if (mTcpListener != null) {
             mIsDuringUpdateProcess = true;
             mTcpListener.onStarted(this, false);
@@ -145,6 +150,8 @@
                 if (mTcpListener != null) {
                     mTcpListener.onError(CallWaitingSwitchPreference.this, error);
                 }
+                handleCwFallbackOnError();
+                setChecked(mCwEnabled);
             } else if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_UNKNOWN_ERROR
                     || (mIsDuringUpdateProcess && (
                     mUpdateStatus != TelephonyManager.CALL_WAITING_STATUS_ENABLED
@@ -153,14 +160,21 @@
                 if (mTcpListener != null) {
                     mTcpListener.onError(CallWaitingSwitchPreference.this, RESPONSE_ERROR);
                 }
+                handleCwFallbackOnError();
+                setChecked(mCwEnabled);
             } else {
-                if (mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_ENABLED) {
-                    setChecked(true);
-                } else {
-                    setChecked(false);
-                }
+                mCwEnabled = mQueryStatus == TelephonyManager.CALL_WAITING_STATUS_ENABLED;
+                setChecked(mCwEnabled);
             }
             mIsDuringUpdateProcess = false;
+            mCwClicked = false;
+        }
+    }
+
+    private void handleCwFallbackOnError() {
+        // Recover initial state before onClick.
+        if (mCwClicked) {
+            mCwEnabled = !mCwEnabled;
         }
     }
 }
diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index 5fe8708..a608b1b 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -263,7 +263,7 @@
         setTurnScreenOn(true);
 
         CarrierConfigManager configMgr = getSystemService(CarrierConfigManager.class);
-        PersistableBundle carrierConfig =
+        PersistableBundle carrierConfig = configMgr == null ? null :
                 configMgr.getConfigForSubId(SubscriptionManager.getDefaultVoiceSubscriptionId());
 
         mShortcutViewConfig = new ShortcutViewUtils.Config(this, carrierConfig, mEntryType);
@@ -313,12 +313,14 @@
         // Check whether we should show the onscreen "Dial" button and co.
         // Read carrier config through the public API because PhoneGlobals is not available when we
         // run as a secondary user.
-        if (carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL)) {
+        if (carrierConfig != null
+                && carrierConfig.getBoolean(
+                    CarrierConfigManager.KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL)) {
             mDialButton.setOnClickListener(this);
         } else {
             mDialButton.setVisibility(View.GONE);
         }
-        mIsWfcEmergencyCallingWarningEnabled = carrierConfig.getInt(
+        mIsWfcEmergencyCallingWarningEnabled = carrierConfig != null && carrierConfig.getInt(
                 CarrierConfigManager.KEY_EMERGENCY_NOTIFICATION_DELAY_INT) > -1;
         maybeShowWfcEmergencyCallingWarning();
 
diff --git a/src/com/android/phone/ImsProvisioningController.java b/src/com/android/phone/ImsProvisioningController.java
index b2e34ae..d2c720b 100644
--- a/src/com/android/phone/ImsProvisioningController.java
+++ b/src/com/android/phone/ImsProvisioningController.java
@@ -70,6 +70,7 @@
 import com.android.ims.RcsFeatureManager;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.PhoneConfigurationManager;
+import com.android.internal.telephony.flags.FeatureFlags;
 import com.android.internal.telephony.util.HandlerExecutor;
 import com.android.telephony.Rlog;
 
@@ -92,6 +93,7 @@
     @VisibleForTesting
     protected static final int EVENT_MULTI_SIM_CONFIGURATION_CHANGE = 3;
     private static final int EVENT_PROVISIONING_VALUE_CHANGED = 4;
+    private static final int EVENT_NOTIFY_INIT_PROVISIONED_VALUE = 5;
 
     // Provisioning Keys that are handled via AOSP cache and not sent to the ImsService
     private static final int[] LOCAL_IMS_CONFIG_KEYS = {
@@ -121,6 +123,11 @@
             CAPABILITY_TYPE_CALL_COMPOSER
     };
 
+    private static final int[] LOCAL_RCS_CAPABILITY = {
+            CAPABILITY_TYPE_OPTIONS_UCE,
+            CAPABILITY_TYPE_PRESENCE_UCE
+    };
+
     /**
      * map the MmTelCapabilities.MmTelCapability and
      * CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT
@@ -199,6 +206,7 @@
     private final SparseArray<ProvisioningCallbackManager> mProvisioningCallbackManagersSlotMap =
             new SparseArray<>();
     private final ImsProvisioningLoader mImsProvisioningLoader;
+    private final FeatureFlags mFeatureFlags;
 
     private int mNumSlot;
 
@@ -253,6 +261,18 @@
                             + " value : " + (int) msg.obj);
                     updateCapabilityTechFromKey(msg.arg1, msg.arg2, (int) msg.obj);
                     break;
+                case EVENT_NOTIFY_INIT_PROVISIONED_VALUE:
+                    int slotId = msg.arg1;
+                    int subId = msg.arg2;
+                    IFeatureProvisioningCallback callback =
+                            (IFeatureProvisioningCallback) msg.obj;
+                    log("slotId " + slotId + " subId " + subId
+                            + " callback " + (callback != null));
+
+                    // Notify MmTel Provisioning Status
+                    notifyMmTelProvisioningStatus(slotId, subId, callback);
+                    notifyRcsProvisioningStatus(slotId, subId, callback);
+                    break;
                 default:
                     log("unknown message " + msg);
                     break;
@@ -508,6 +528,13 @@
 
                 // notify provisioning key value to ImsService
                 setInitialProvisioningKeys(mSubId);
+
+                if (mFeatureFlags.notifyInitialImsProvisioningStatus()) {
+                    // Notify MmTel provisioning value based on capability and radio tech.
+                    if (mProvisioningCallbackManagersSlotMap.get(mSlotId).hasCallblacks()) {
+                        notifyMmTelProvisioningStatus(mSlotId, mSubId, null);
+                    }
+                }
             } else {
                 // wait until subId is valid
                 mRequiredNotify = true;
@@ -740,6 +767,13 @@
 
                 // notify provisioning key value to ImsService
                 setInitialProvisioningKeys(mSubId);
+
+                if (mFeatureFlags.notifyInitialImsProvisioningStatus()) {
+                    if (mProvisioningCallbackManagersSlotMap.get(mSlotId).hasCallblacks()) {
+                        // Notify RCS provisioning value based on capability and radio tech.
+                        notifyRcsProvisioningStatus(mSlotId, mSubId, null);
+                    }
+                }
             } else {
                 // wait until subId is valid
                 mRequiredNotify = true;
@@ -828,7 +862,7 @@
     @VisibleForTesting
     public ImsProvisioningController(PhoneGlobals app, int numSlot, Looper looper,
             MmTelFeatureConnector mmTelFeatureConnector, RcsFeatureConnector rcsFeatureConnector,
-            ImsProvisioningLoader imsProvisioningLoader) {
+            ImsProvisioningLoader imsProvisioningLoader, FeatureFlags featureFlags) {
         log("ImsProvisioningController");
         mApp = app;
         mNumSlot = numSlot;
@@ -841,6 +875,7 @@
         mTelephonyRegistryManager.addOnSubscriptionsChangedListener(
                 mSubChangedListener, mHandler::post);
         mImsProvisioningLoader = imsProvisioningLoader;
+        mFeatureFlags = featureFlags;
 
         PhoneConfigurationManager.registerForMultiSimConfigChange(mHandler,
                 EVENT_MULTI_SIM_CONFIGURATION_CHANGE, null);
@@ -924,7 +959,8 @@
      * create an instance
      */
     @VisibleForTesting
-    public static ImsProvisioningController make(PhoneGlobals app, int numSlot) {
+    public static ImsProvisioningController make(PhoneGlobals app, int numSlot,
+            FeatureFlags featureFlags) {
         synchronized (ImsProvisioningController.class) {
             if (sInstance == null) {
                 Rlog.i(TAG, "ImsProvisioningController created");
@@ -932,7 +968,7 @@
                 handlerThread.start();
                 sInstance = new ImsProvisioningController(app, numSlot, handlerThread.getLooper(),
                         ImsManager::getConnector, RcsFeatureManager::getConnector,
-                        new ImsProvisioningLoader(app));
+                        new ImsProvisioningLoader(app), featureFlags);
             }
         }
         return sInstance;
@@ -966,6 +1002,11 @@
         try {
             mProvisioningCallbackManagersSlotMap.get(slotId).registerCallback(callback);
             log("Feature Provisioning Callback registered.");
+
+            if (mFeatureFlags.notifyInitialImsProvisioningStatus()) {
+                mHandler.sendMessage(mHandler.obtainMessage(EVENT_NOTIFY_INIT_PROVISIONED_VALUE,
+                        getSlotId(subId), subId, (Object) callback));
+            }
         } catch (NullPointerException e) {
             logw("can not access callback manager to add callback");
         }
@@ -1639,6 +1680,90 @@
         return true;
     }
 
+    private void notifyMmTelProvisioningStatus(int slotId, int subId,
+            @Nullable IFeatureProvisioningCallback callback) {
+        int value = ImsProvisioningLoader.STATUS_NOT_SET;
+        int[] techArray;
+        for (int capability : LOCAL_MMTEL_CAPABILITY) {
+            techArray = getTechsFromCarrierConfig(subId, capability, /*isMmTle*/true);
+            if (techArray == null) {
+                continue;
+            }
+
+            for (int radioTech : techArray) {
+                value = mImsProvisioningLoader.getProvisioningStatus(subId, FEATURE_MMTEL,
+                        capability, radioTech);
+                if (value == ImsProvisioningLoader.STATUS_NOT_SET) {
+                    // Not yet provisioned
+                    continue;
+                }
+
+                value = (value == ImsProvisioningLoader.STATUS_PROVISIONED)
+                        ? PROVISIONING_VALUE_ENABLED : PROVISIONING_VALUE_DISABLED;
+
+                // Notify all registered callbacks
+                if (callback == null) {
+                    mProvisioningCallbackManagersSlotMap.get(slotId)
+                            .notifyProvisioningCapabilityChanged(
+                                    new FeatureProvisioningData(
+                                            capability,
+                                            radioTech,
+                                            getBoolValue(value),
+                                            /*isMmTle*/true));
+                } else {
+                    try {
+                        callback.onFeatureProvisioningChanged(capability, radioTech,
+                                getBoolValue(value));
+                    } catch (RemoteException e) {
+                        logw("notifyMmTelProvisioningStatus callback is not available");
+                    }
+                }
+            }
+        }
+    }
+
+    private void notifyRcsProvisioningStatus(int slotId, int subId,
+            @Nullable IFeatureProvisioningCallback callback) {
+        int value = ImsProvisioningLoader.STATUS_NOT_SET;
+        int[] techArray;
+        for (int capability : LOCAL_RCS_CAPABILITY) {
+            techArray = getTechsFromCarrierConfig(subId, capability, /*isMmTle*/false);
+            if (techArray == null) {
+                continue;
+            }
+
+            for (int radioTech : techArray) {
+                value = mImsProvisioningLoader.getProvisioningStatus(subId, FEATURE_RCS,
+                        capability, radioTech);
+                if (value == ImsProvisioningLoader.STATUS_NOT_SET) {
+                    // Not yet provisioned
+                    continue;
+                }
+
+                value = (value == ImsProvisioningLoader.STATUS_PROVISIONED)
+                        ? PROVISIONING_VALUE_ENABLED : PROVISIONING_VALUE_DISABLED;
+
+                // Notify all registered callbacks
+                if (callback == null) {
+                    mProvisioningCallbackManagersSlotMap.get(slotId)
+                            .notifyProvisioningCapabilityChanged(
+                                    new FeatureProvisioningData(
+                                            capability,
+                                            radioTech,
+                                            getBoolValue(value),
+                                            /*isMmTle*/false));
+                } else {
+                    try {
+                        callback.onRcsFeatureProvisioningChanged(capability, radioTech,
+                                getBoolValue(value));
+                    } catch (RemoteException e) {
+                        logw("notifyRcsProvisioningStatus callback is not available");
+                    }
+                }
+            }
+        }
+    }
+
     private void log(String s) {
         Rlog.d(TAG, s);
     }
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 2ae39df..d0d92c6 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -78,11 +78,13 @@
 import com.android.internal.telephony.imsphone.ImsPhone;
 import com.android.internal.telephony.imsphone.ImsPhoneCallTracker;
 import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
 import com.android.internal.telephony.uicc.UiccPort;
 import com.android.internal.telephony.uicc.UiccProfile;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.phone.settings.SettingsConstants;
 import com.android.phone.vvm.CarrierVvmPackageInstalledReceiver;
+import com.android.services.telephony.domainselection.DynamicRoutingController;
 import com.android.services.telephony.rcs.TelephonyRcsService;
 
 import java.io.FileDescriptor;
@@ -90,6 +92,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Global state for the telephony subsystem when running in the primary
@@ -188,13 +191,15 @@
                     ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED,
                     ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED,
                     ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED,
-                    ROAMING_NOTIFICATION_REASON_DEFAULT_DATA_SUBS_CHANGED})
+                    ROAMING_NOTIFICATION_REASON_DEFAULT_DATA_SUBS_CHANGED,
+                    ROAMING_NOTIFICATION_REASON_DISCONNECTED_SINGLE_NETWORK})
     public @interface RoamingNotificationReason {}
     private static final int ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED = 0;
     private static final int ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED = 1;
     private static final int ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED = 2;
     private static final int ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED = 3;
     private static final int ROAMING_NOTIFICATION_REASON_DEFAULT_DATA_SUBS_CHANGED = 4;
+    private static final int ROAMING_NOTIFICATION_REASON_DISCONNECTED_SINGLE_NETWORK = 5;
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
@@ -213,6 +218,14 @@
     private int mCurrentRoamingNotification = ROAMING_NOTIFICATION_NO_NOTIFICATION;
 
     /**
+     * If true, update roaming notifications after the Internet is completely disconnected. If
+     * carrier allows only a single data network, wait until the Internet connection is completely
+     * disconnected and then update the roaming notification once more to check if
+     * ONLY_ALLOWED_SINGLE_NETWORK disallow reason is disappeared.
+     */
+    private AtomicBoolean mWaitForInternetDisconnection = new AtomicBoolean(false);
+
+    /**
      * Reasons that have already shown notification to prevent duplicate shows for the same reason.
      */
     private ArraySet<String> mShownNotificationReasons = new ArraySet<>();
@@ -251,7 +264,8 @@
     private FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
 
     private class PhoneAppCallback extends TelephonyCallback implements
-            TelephonyCallback.ServiceStateListener {
+            TelephonyCallback.ServiceStateListener,
+            TelephonyCallback.DataConnectionStateListener {
         private final int mSubId;
 
         PhoneAppCallback(int subId) {
@@ -265,6 +279,23 @@
             handleServiceStateChanged(serviceState, mSubId);
         }
 
+        @Override
+        public void onDataConnectionStateChanged(int state, int networkType) {
+            if (mSubId == mDefaultDataSubId && state == TelephonyManager.DATA_DISCONNECTED) {
+                // onDataConnectionStateChanged is an event about the state of exact DataNetwork,
+                // but since the DataNetwork of internet may not have been completely removed from
+                // the DataNetworkController list, The post handler event expects the internet data
+                // network to be completely removed from the DataNetworkController list.
+                mHandler.post(() -> {
+                    if (mWaitForInternetDisconnection.compareAndSet(true, false)) {
+                        Log.d(LOG_TAG, "onDisconnectedInternetDataNetwork.");
+                        updateDataRoamingStatus(
+                                ROAMING_NOTIFICATION_REASON_DISCONNECTED_SINGLE_NETWORK);
+                    }
+                });
+            }
+        }
+
         public int getSubId() {
             return mSubId;
         }
@@ -342,11 +373,23 @@
                     break;
 
                 case EVENT_DATA_ROAMING_DISCONNECTED:
-                    notificationMgr.showDataRoamingNotification(msg.arg1, false);
+                    if (SubscriptionManagerService.getInstance()
+                            .isEsimBootStrapProvisioningActiveForSubId(msg.arg1)) {
+                        Log.i(LOG_TAG,
+                                "skip notification/warnings during esim bootstrap activation");
+                    } else {
+                        notificationMgr.showDataRoamingNotification(msg.arg1, false);
+                    }
                     break;
 
                 case EVENT_DATA_ROAMING_CONNECTED:
-                    notificationMgr.showDataRoamingNotification(msg.arg1, true);
+                    if (SubscriptionManagerService.getInstance()
+                            .isEsimBootStrapProvisioningActiveForSubId(msg.arg1)) {
+                        Log.i(LOG_TAG,
+                                "skip notification/warnings during esim bootstrap activation");
+                    } else {
+                        notificationMgr.showDataRoamingNotification(msg.arg1, true);
+                    }
                     break;
 
                 case EVENT_DATA_ROAMING_OK:
@@ -476,7 +519,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;
@@ -522,6 +567,7 @@
                 boolean isSuplDdsSwitchRequiredForEmergencyCall = getResources()
                         .getBoolean(R.bool.config_gnss_supl_requires_default_data_for_emergency);
                 EmergencyStateTracker.make(this, isSuplDdsSwitchRequiredForEmergencyCall);
+                DynamicRoutingController.getInstance().initialize(this);
             }
 
             // Only bring up ImsResolver if the device supports having an IMS stack.
@@ -534,7 +580,7 @@
                         R.string.config_ims_rcs_package);
                 ImsResolver.make(this, defaultImsMmtelPackage,
                         defaultImsRcsPackage, PhoneFactory.getPhones().length,
-                        new ImsFeatureBinderRepository());
+                        new ImsFeatureBinderRepository(), mFeatureFlags);
                 ImsResolver.getInstance().initialize();
 
                 // With the IMS phone created, load static config.xml values from the phone process
@@ -594,11 +640,12 @@
                 mImsStateCallbackController =
                         ImsStateCallbackController.make(this, PhoneFactory.getPhones().length);
                 mTelephonyRcsService = new TelephonyRcsService(this,
-                        PhoneFactory.getPhones().length);
+                        PhoneFactory.getPhones().length, mFeatureFlags);
                 mTelephonyRcsService.initialize();
                 imsRcsController.setRcsService(mTelephonyRcsService);
                 mImsProvisioningController =
-                        ImsProvisioningController.make(this, PhoneFactory.getPhones().length);
+                        ImsProvisioningController.make(this, PhoneFactory.getPhones().length,
+                                mFeatureFlags);
             }
 
             // Create the CallNotifier singleton, which handles
@@ -993,10 +1040,9 @@
      * When roaming, if mobile data cannot be established due to data roaming not enabled, we need
      * to notify the user so they can enable it through settings. Vise versa if the condition
      * changes, we need to dismiss the notification.
-     * @param reason to inform which event is called for notification update.
+     * @param notificationReason to inform which event is called for notification update.
      */
-    private void updateDataRoamingStatus(@RoamingNotificationReason int reason) {
-        if (VDBG) Log.v(LOG_TAG, "updateDataRoamingStatus");
+    private void updateDataRoamingStatus(@RoamingNotificationReason int notificationReason) {
         Phone phone = getPhone(mDefaultDataSubId);
         if (phone == null) {
             Log.w(LOG_TAG, "Can't get phone with sub id = " + mDefaultDataSubId);
@@ -1009,20 +1055,59 @@
             return;
         }
 
+        List<DataDisallowedReason> disallowReasons = phone.getDataNetworkController()
+                .getInternetDataDisallowedReasons();
+
+        if (mFeatureFlags.roamingNotificationForSingleDataNetwork()) {
+            if (disallowReasons.contains(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)
+                    && disallowReasons.contains(DataDisallowedReason.ROAMING_DISABLED)
+                    && (notificationReason == ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED
+                            || notificationReason
+                                    == ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED)) {
+                // If the ONLY_ALLOWED_SINGLE_NETWORK disallow reason has not yet been removed due
+                // to a change in mobile_data (including roaming_data) settings, update roaming
+                // notification again after the Internet is completely disconnected to check
+                // ONLY_ALLOWED_SINGLE_NETWORK disallow reason is removed.
+                mWaitForInternetDisconnection.set(true);
+                Log.d(LOG_TAG, "updateDataRoamingStatus,"
+                        + " wait for internet disconnection for single data network");
+            } else if (!disallowReasons.contains(DataDisallowedReason.ONLY_ALLOWED_SINGLE_NETWORK)
+                    && mWaitForInternetDisconnection.compareAndSet(true, false)) {
+                // If the ONLY_ALLOWED_SINGLE_NETWORK disallow reason has been removed,
+                // no longer wait for Internet disconnection.
+                Log.d(LOG_TAG, "updateDataRoamingStatus,"
+                        + " cancel to wait for internet disconnection for single data network");
+            }
+        }
+
+        updateDataRoamingStatus(notificationReason, disallowReasons, serviceState);
+    }
+
+    /**
+     * When roaming, if mobile data cannot be established due to data roaming not enabled, we need
+     * to notify the user so they can enable it through settings. Vise versa if the condition
+     * changes, we need to dismiss the notification.
+     * @param notificationReason to inform which event is called for notification update.
+     * @param disallowReasons List of reasons why internet data is not allowed. An empty list if
+     *                       internet is allowed.
+     * @param serviceState Service state from phone
+     */
+    private void updateDataRoamingStatus(@RoamingNotificationReason int notificationReason,
+            List<DataDisallowedReason> disallowReasons, ServiceState serviceState) {
+
+        if (VDBG) Log.v(LOG_TAG, "updateDataRoamingStatus");
         String roamingNumeric = serviceState.getOperatorNumeric();
         String roamingNumericReason = "RoamingNumeric=" + roamingNumeric;
-        String callingReason = "CallingReason=" + reason;
+        String callingReason = "CallingReason=" + notificationReason;
         boolean dataIsNowRoaming = serviceState.getDataRoaming();
         boolean dataAllowed;
         boolean notAllowedDueToRoamingOff;
-        List<DataDisallowedReason> reasons = phone.getDataNetworkController()
-                .getInternetDataDisallowedReasons();
-        dataAllowed = reasons.isEmpty();
-        notAllowedDueToRoamingOff = (reasons.size() == 1
-                && reasons.contains(DataDisallowedReason.ROAMING_DISABLED));
+        dataAllowed = disallowReasons.isEmpty();
+        notAllowedDueToRoamingOff = (disallowReasons.size() == 1
+                && disallowReasons.contains(DataDisallowedReason.ROAMING_DISABLED));
         StringBuilder sb = new StringBuilder("updateDataRoamingStatus");
         sb.append(" dataAllowed=").append(dataAllowed);
-        sb.append(", reasons=").append(reasons);
+        sb.append(", disallowReasons=").append(disallowReasons);
         sb.append(", dataIsNowRoaming=").append(dataIsNowRoaming);
         sb.append(", ").append(roamingNumericReason);
         sb.append(", ").append(callingReason);
@@ -1033,8 +1118,8 @@
 
         // Determine if a given roaming numeric has never been shown.
         boolean shownInThisNumeric = false;
-        if (reason == ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED
-                || reason == ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED) {
+        if (notificationReason == ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED
+                || notificationReason == ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED) {
             shownInThisNumeric = mShownNotificationReasons.contains(roamingNumericReason);
         }
         // Determine if a notification has never been shown by given calling reason.
@@ -1045,7 +1130,7 @@
                 mShownNotificationReasons.add(roamingNumericReason);
             }
             if (!shownForThisReason
-                    && reason == ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED) {
+                    && notificationReason == ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED) {
                 mShownNotificationReasons.add(callingReason);
             }
             // No need to show it again if we never cancelled it explicitly.
@@ -1072,7 +1157,7 @@
                 mShownNotificationReasons.add(roamingNumericReason);
             }
             if (!shownForThisReason
-                    && reason == ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED) {
+                    && notificationReason == ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED) {
                 mShownNotificationReasons.add(callingReason);
             }
             boolean shouldShowRoamingNotification = shouldShowRoamingNotification(roamingNumeric);
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 3919d40..dc4290d 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -157,9 +157,11 @@
 import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.telephony.satellite.INtnSignalStrengthCallback;
 import android.telephony.satellite.ISatelliteCapabilitiesCallback;
+import android.telephony.satellite.ISatelliteCommunicationAllowedStateCallback;
 import android.telephony.satellite.ISatelliteDatagramCallback;
 import android.telephony.satellite.ISatelliteModemStateCallback;
 import android.telephony.satellite.ISatelliteProvisionStateCallback;
+import android.telephony.satellite.ISatelliteSupportedStateCallback;
 import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
 import android.telephony.satellite.NtnSignalStrength;
 import android.telephony.satellite.NtnSignalStrengthCallback;
@@ -258,8 +260,10 @@
 import com.android.phone.vvm.RemoteVvmTaskManager;
 import com.android.phone.vvm.VisualVoicemailSettingsUtil;
 import com.android.phone.vvm.VisualVoicemailSmsFilterConfig;
+import com.android.server.feature.flags.Flags;
 import com.android.services.telephony.TelecomAccountRegistry;
 import com.android.services.telephony.TelephonyConnectionService;
+import com.android.services.telephony.domainselection.TelephonyDomainSelectionService;
 import com.android.telephony.Rlog;
 
 import java.io.ByteArrayOutputStream;
@@ -423,17 +427,18 @@
 
     private final PhoneGlobals mApp;
     private FeatureFlags mFeatureFlags;
+    private com.android.server.telecom.flags.FeatureFlags mTelecomFeatureFlags;
     private final CallManager mCM;
     private final ImsResolver mImsResolver;
 
     private final SatelliteController mSatelliteController;
     private final SatelliteAccessController mSatelliteAccessController;
     private final UserManager mUserManager;
-    private final AppOpsManager mAppOps;
     private final MainThreadHandler mMainThreadHandler;
     private final SharedPreferences mTelephonySharedPreferences;
     private final PhoneConfigurationManager mPhoneConfigurationManager;
     private final RadioInterfaceCapabilityController mRadioInterfaceCapabilities;
+    private AppOpsManager mAppOps;
     private PackageManager mPackageManager;
     private final int mVendorApiLevel;
 
@@ -1588,7 +1593,7 @@
                         // This is for the implementation of carrierRestrictionStatus.
                         CallerCallbackInfo callbackInfo = (CallerCallbackInfo) request.argument;
                         Consumer<Integer> callback = callbackInfo.getConsumer();
-                        int callerCarrierId = callbackInfo.getCarrierId();
+                        Set<Integer> callerCarrierIds = callbackInfo.getCarrierIds();
                         int lockStatus = TelephonyManager.CARRIER_RESTRICTION_STATUS_UNKNOWN;
                         if (ar.exception == null && ar.result instanceof CarrierRestrictionRules) {
                             CarrierRestrictionRules carrierRestrictionRules =
@@ -1603,8 +1608,10 @@
                                 Rlog.e(LOG_TAG, "CarrierIdentifier exception = " + ex);
                             }
                             lockStatus = carrierRestrictionRules.getCarrierRestrictionStatus();
-                            if (carrierId != -1 && callerCarrierId == carrierId && lockStatus
-                                    == TelephonyManager.CARRIER_RESTRICTION_STATUS_RESTRICTED) {
+                            int restrictedStatus =
+                                    TelephonyManager.CARRIER_RESTRICTION_STATUS_RESTRICTED;
+                            if (carrierId != -1 && callerCarrierIds.contains(carrierId) &&
+                                    lockStatus == restrictedStatus) {
                                 lockStatus = TelephonyManager
                                         .CARRIER_RESTRICTION_STATUS_RESTRICTED_TO_CALLER;
                             }
@@ -2464,6 +2471,7 @@
     private PhoneInterfaceManager(PhoneGlobals app, FeatureFlags featureFlags) {
         mApp = app;
         mFeatureFlags = featureFlags;
+        mTelecomFeatureFlags = new com.android.server.telecom.flags.FeatureFlagsImpl();
         mCM = PhoneGlobals.getInstance().mCM;
         mImsResolver = ImsResolver.getInstance();
         mSatelliteController = SatelliteController.getInstance();
@@ -2723,6 +2731,10 @@
 
         // For async handler to identify request type
         private static final int SUPPLY_PIN_COMPLETE = 100;
+        private static final int SUPPLY_PIN_DELAYED  = 101;
+        private static final int SUPPLY_PIN_DELAYED_TIMER_IN_MILLIS = 10000;
+        private static final UUID SUPPLY_PIN_UUID = UUID.fromString(
+                "d3768135-4323-491d-a6c8-bda01fc89040");
 
         UnlockSim(int phoneId, IccCard simCard) {
             mPhoneId = phoneId;
@@ -2761,9 +2773,17 @@
                                         mResult = PhoneConstants.PIN_RESULT_SUCCESS;
                                     }
                                     mDone = true;
+                                    removeMessages(SUPPLY_PIN_DELAYED);
                                     UnlockSim.this.notifyAll();
                                 }
                                 break;
+                            case SUPPLY_PIN_DELAYED:
+                                if(!mDone) {
+                                    String logStr = "Delay in receiving SIM PIN response ";
+                                    if (DBG) log(logStr);
+                                    AnomalyReporter.reportAnomaly(SUPPLY_PIN_UUID, logStr);
+                                }
+                                break;
                         }
                     }
                 };
@@ -2802,6 +2822,8 @@
             while (!mDone) {
                 try {
                     Log.d(LOG_TAG, "wait for done");
+                    mHandler.sendEmptyMessageDelayed(SUPPLY_PIN_DELAYED,
+                            SUPPLY_PIN_DELAYED_TIMER_IN_MILLIS);
                     wait();
                 } catch (InterruptedException e) {
                     // Restore the interrupted status
@@ -3940,6 +3962,15 @@
         mApp.enforceCallingOrSelfPermission(permission.SATELLITE_COMMUNICATION, message);
     }
 
+    /**
+     * Make sure the caller has PACKAGE_USAGE_STATS permission.
+     * @param message - log message to print.
+     * @throws SecurityException if the caller does not have the required permission
+     */
+    private void enforcePackageUsageStatsPermission(String message) {
+        mApp.enforceCallingOrSelfPermission(permission.PACKAGE_USAGE_STATS, message);
+    }
+
     private String createTelUrl(String number) {
         if (TextUtils.isEmpty(number)) {
             return null;
@@ -8787,12 +8818,18 @@
     }
 
     /**
-     * Returns the service state information on specified subscription.
+     * Returns the service state information on specified SIM slot.
      */
     @Override
-    public ServiceState getServiceStateForSubscriber(int subId,
-            boolean renounceFineLocationAccess, boolean renounceCoarseLocationAccess,
-            String callingPackage, String callingFeatureId) {
+    public ServiceState getServiceStateForSlot(int slotIndex, boolean renounceFineLocationAccess,
+            boolean renounceCoarseLocationAccess, String callingPackage, String callingFeatureId) {
+        Phone phone = PhoneFactory.getPhone(slotIndex);
+        if (phone == null) {
+            loge("getServiceStateForSlot retuning null for invalid slotIndex=" + slotIndex);
+            return null;
+        }
+
+        int subId = phone.getSubId();
         if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
                 mApp, subId, callingPackage, callingFeatureId, "getServiceStateForSubscriber")) {
             return null;
@@ -8811,7 +8848,7 @@
                                     .setCallingFeatureId(callingFeatureId)
                                     .setCallingPid(Binder.getCallingPid())
                                     .setCallingUid(Binder.getCallingUid())
-                                    .setMethod("getServiceStateForSubscriber")
+                                    .setMethod("getServiceStateForSlot")
                                     .setLogAsInfo(true)
                                     .setMinSdkVersionForFine(Build.VERSION_CODES.Q)
                                     .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
@@ -8829,7 +8866,7 @@
                                     .setCallingFeatureId(callingFeatureId)
                                     .setCallingPid(Binder.getCallingPid())
                                     .setCallingUid(Binder.getCallingUid())
-                                    .setMethod("getServiceStateForSubscriber")
+                                    .setMethod("getServiceStateForSlot")
                                     .setLogAsInfo(true)
                                     .setMinSdkVersionForCoarse(Build.VERSION_CODES.Q)
                                     .setMinSdkVersionForFine(Integer.MAX_VALUE)
@@ -8839,26 +8876,18 @@
                     coarseLocationResult == LocationAccessPolicy.LocationPermissionResult.ALLOWED;
         }
 
-        final Phone phone = getPhone(subId);
-        if (phone == null) {
-            return null;
-        }
-
         final long identity = Binder.clearCallingIdentity();
-
-        boolean isCallingPackageDataService = phone.getDataServicePackages()
-                .contains(callingPackage);
         try {
-            // isActiveSubId requires READ_PHONE_STATE, which we already check for above
             SubscriptionInfoInternal subInfo = getSubscriptionManagerService()
                     .getSubscriptionInfoInternal(subId);
-            if (subInfo == null || !subInfo.isActive()) {
-                Rlog.d(LOG_TAG, "getServiceStateForSubscriber returning null for inactive "
-                        + "subId=" + subId);
+            if (subInfo != null && !subInfo.isActive()) {
+                log("getServiceStateForSlot returning null for inactive subId=" + subId);
                 return null;
             }
 
             ServiceState ss = phone.getServiceState();
+            boolean isCallingPackageDataService = phone.getDataServicePackages()
+                    .contains(callingPackage);
 
             // Scrub out the location info in ServiceState depending on what level of access
             // the caller has.
@@ -9243,15 +9272,15 @@
         enforceTelephonyFeatureWithException(packageName,
                 PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION, "getCarrierRestrictionStatus");
 
-        int carrierId = validateCallerAndGetCarrierId(packageName);
-        if (carrierId == CarrierAllowListInfo.INVALID_CARRIER_ID) {
+        Set<Integer> carrierIds = validateCallerAndGetCarrierIds(packageName);
+        if (carrierIds.contains(CarrierAllowListInfo.INVALID_CARRIER_ID)) {
             Rlog.e(LOG_TAG, "getCarrierRestrictionStatus: caller is not registered");
             throw new SecurityException("Not an authorized caller");
         }
         final long identity = Binder.clearCallingIdentity();
         try {
             Consumer<Integer> consumer = FunctionalUtils.ignoreRemoteException(callback::accept);
-            CallerCallbackInfo callbackInfo = new CallerCallbackInfo(consumer, carrierId);
+            CallerCallbackInfo callbackInfo = new CallerCallbackInfo(consumer, carrierIds);
             sendRequestAsync(CMD_GET_ALLOWED_CARRIERS, callbackInfo);
         } finally {
             Binder.restoreCallingIdentity(identity);
@@ -9266,9 +9295,9 @@
     }
 
     @VisibleForTesting
-    public int validateCallerAndGetCarrierId(String packageName) {
+    public Set<Integer> validateCallerAndGetCarrierIds(String packageName) {
         CarrierAllowListInfo allowListInfo = CarrierAllowListInfo.loadInstance(mApp);
-        return allowListInfo.validateCallerAndGetCarrierId(packageName);
+        return allowListInfo.validateCallerAndGetCarrierIds(packageName);
     }
 
     /**
@@ -9425,7 +9454,11 @@
                     + android.Manifest.permission.DUMP);
             return;
         }
-        DumpsysHandler.dump(mApp, fd, writer, args);
+        try {
+            DumpsysHandler.dump(mApp, fd, writer, args);
+        } catch (Exception e) {
+            writer.println("Failed to dump phone information: " + e);
+        }
     }
 
     @Override
@@ -9468,7 +9501,7 @@
         try {
             if (reason == TelephonyManager.DATA_ENABLED_REASON_USER && enabled
                     && null != callingPackage && opEnableMobileDataByUser()) {
-                mAppOps.noteOp(AppOpsManager.OPSTR_ENABLE_MOBILE_DATA_BY_USER,
+                mAppOps.noteOpNoThrow(AppOpsManager.OPSTR_ENABLE_MOBILE_DATA_BY_USER,
                         callingUid, callingPackage, null, null);
             }
             Phone phone = getPhone(subId);
@@ -12899,8 +12932,16 @@
     public void persistEmergencyCallDiagnosticData(@NonNull String dropboxTag, boolean enableLogcat,
             long logcatStartTimestampMillis, boolean enableTelecomDump,
             boolean enableTelephonyDump) {
-        mApp.enforceCallingPermission(android.Manifest.permission.DUMP,
-                "persistEmergencyCallDiagnosticData");
+        // Verify that the caller has READ_DROPBOX_DATA permission.
+        if (mTelecomFeatureFlags.telecomResolveHiddenDependencies()
+                && Flags.enableReadDropboxPermission()) {
+            mApp.enforceCallingPermission(permission.READ_DROPBOX_DATA,
+                    "persistEmergencyCallDiagnosticData");
+        } else {
+            // Otherwise, enforce legacy permission.
+            mApp.enforceCallingPermission(android.Manifest.permission.DUMP,
+                    "persistEmergencyCallDiagnosticData");
+        }
         final long identity = Binder.clearCallingIdentity();
         try {
             persistEmergencyCallDiagnosticDataInternal(dropboxTag, enableLogcat,
@@ -12985,6 +13026,34 @@
     }
 
     /**
+     * Returns whether the AOSP domain selection service is supported.
+     *
+     * @return {@code true} if the AOSP domain selection service is supported,
+     *         {@code false} otherwise.
+     */
+    @Override
+    public boolean isAospDomainSelectionService() {
+        mApp.enforceCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+                "isAospDomainSelectionService");
+
+        final long identity = Binder.clearCallingIdentity();
+        try {
+            if (DomainSelectionResolver.getInstance().isDomainSelectionSupported()) {
+                String dssComponentName = mApp.getResources().getString(
+                        R.string.config_domain_selection_service_component_name);
+                ComponentName componentName = ComponentName.createRelative(mApp.getPackageName(),
+                        TelephonyDomainSelectionService.class.getName());
+                Log.i(LOG_TAG, "isAospDomainSelectionService dss=" + dssComponentName
+                        + ", aosp=" + componentName.flattenToString());
+                return TextUtils.equals(componentName.flattenToString(), dssComponentName);
+            }
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+        return false;
+    }
+
+    /**
      * Request to enable or disable the satellite modem and demo mode. If the satellite modem is
      * enabled, this may also disable the cellular modem, and if the satellite modem is disabled,
      * this may also re-enable the cellular modem.
@@ -13024,7 +13093,7 @@
                     }
                     if (isAllowed) {
                         mSatelliteController.requestSatelliteEnabled(
-                                subId, enableSatellite, enableDemoMode, callback);
+                                subId, enableSatellite, enableDemoMode, isEmergency, callback);
                     } else {
                         result.accept(SATELLITE_RESULT_ACCESS_BARRED);
                     }
@@ -13035,7 +13104,7 @@
         } else {
             // No need to check if satellite is allowed at current location when disabling satellite
             mSatelliteController.requestSatelliteEnabled(
-                    subId, enableSatellite, enableDemoMode, callback);
+                    subId, enableSatellite, enableDemoMode, isEmergency, callback);
         }
     }
 
@@ -13412,7 +13481,7 @@
      *
      * @param subId The subId of the subscription to request for.
      * @param reason Reason for disallowing satellite communication for carrier.
-     * @param callback Listener for the {@link SatelliteManager.SatelliteError} result of the
+     * @param callback Listener for the {@link SatelliteManager.SatelliteResult} result of the
      * operation.
      *
      * @throws SecurityException if the caller doesn't have required permission.
@@ -13435,7 +13504,7 @@
      *
      * @param subId The subId of the subscription to request for.
      * @param reason Reason for disallowing satellite communication.
-     * @param callback Listener for the {@link SatelliteManager.SatelliteError} result of the
+     * @param callback Listener for the {@link SatelliteManager.SatelliteResult} result of the
      * operation.
      *
      * @throws SecurityException if the caller doesn't have required permission.
@@ -13454,7 +13523,7 @@
 
     /**
      * Get reasons for disallowing satellite communication, as requested by
-     * {@link #addSatelliteAttachRestrictionForCarrier(int, int, IIntegerConsumer)}.
+     * {@link #addAttachRestrictionForCarrier(int, int, IIntegerConsumer)}.
      *
      * @param subId The subId of the subscription to request for.
      *
@@ -13590,6 +13659,40 @@
     }
 
     /**
+     * Registers for the satellite supported state changed.
+     *
+     * @param subId The subId of the subscription to register for supported state changed.
+     * @param callback The callback to handle the satellite supported state changed event.
+     *
+     * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
+     *
+     * @throws SecurityException if the caller doesn't have the required permission.
+     */
+    @Override
+    @SatelliteManager.SatelliteResult public int registerForSatelliteSupportedStateChanged(
+            int subId, @NonNull ISatelliteSupportedStateCallback callback) {
+        enforceSatelliteCommunicationPermission("registerForSatelliteSupportedStateChanged");
+        return mSatelliteController.registerForSatelliteSupportedStateChanged(subId, callback);
+    }
+
+    /**
+     * Unregisters for the satellite supported state changed.
+     * If callback was not registered before, the request will be ignored.
+     *
+     * @param subId The subId of the subscription to unregister for supported state changed.
+     * @param callback The callback that was passed to
+     * {@link #registerForSatelliteSupportedStateChanged(int, ISatelliteSupportedStateCallback)}.
+     *
+     * @throws SecurityException if the caller doesn't have the required permission.
+     */
+    @Override
+    public void unregisterForSatelliteSupportedStateChanged(
+            int subId, @NonNull ISatelliteSupportedStateCallback callback) {
+        enforceSatelliteCommunicationPermission("unregisterForSatelliteSupportedStateChanged");
+        mSatelliteController.unregisterForSatelliteSupportedStateChanged(subId, callback);
+    }
+
+    /**
      * This API can be used by only CTS to update satellite vendor service package name.
      *
      * @param servicePackageName The package name of the satellite vendor service.
@@ -13682,6 +13785,26 @@
     }
 
     /**
+     * This API can be used by only CTS to override the boolean configs used by the
+     * DatagramController module.
+     *
+     * @param enable Whether to enable or disable boolean config.
+     * @return {@code true} if the boolean config is set successfully, {@code false} otherwise.
+     */
+    public boolean setDatagramControllerBooleanConfig(
+            boolean reset, int booleanType, boolean enable) {
+        Log.d(LOG_TAG, "setDatagramControllerBooleanConfig: booleanType=" + booleanType
+                + ", reset=" + reset + ", enable=" + enable);
+        TelephonyPermissions.enforceShellOnly(
+                Binder.getCallingUid(), "setDatagramControllerBooleanConfig");
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp,
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID,
+                "ssetDatagramControllerBooleanConfig");
+        return mSatelliteController.setDatagramControllerBooleanConfig(reset, booleanType, enable);
+    }
+
+
+    /**
      * This API can be used by only CTS to override the timeout durations used by the
      * SatelliteController module.
      *
@@ -13820,6 +13943,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.
@@ -13994,19 +14143,19 @@
      */
     private static class CallerCallbackInfo {
         private final Consumer<Integer> mConsumer;
-        private final int mCarrierId;
+        private final Set<Integer> mCarrierIds;
 
-        public CallerCallbackInfo(Consumer<Integer> consumer, int carrierId) {
+        public CallerCallbackInfo(Consumer<Integer> consumer, Set<Integer> carrierIds) {
             mConsumer = consumer;
-            mCarrierId = carrierId;
+            mCarrierIds = carrierIds;
         }
 
         public Consumer<Integer> getConsumer() {
             return mConsumer;
         }
 
-        public int getCarrierId() {
-            return mCarrierId;
+        public Set<Integer> getCarrierIds() {
+            return mCarrierIds;
         }
     }
 
@@ -14021,6 +14170,16 @@
     }
 
     /*
+     * PhoneInterfaceManager is a singleton. Unit test calls the init() with context.
+     * But the context that is passed in is unused if the phone app is already alive.
+     * In this case PackageManager object is different in PhoneInterfaceManager and Unit test.
+     */
+    @VisibleForTesting
+    public void setAppOpsManager(AppOpsManager appOps) {
+        mAppOps = appOps;
+    }
+
+    /*
      * PhoneInterfaceManager is a singleton. Unit test calls the init() with FeatureFlags.
      * But the FeatureFlags that is passed in is unused if the phone app is already alive.
      * In this case FeatureFlags object is different in PhoneInterfaceManager and Unit test.
@@ -14056,4 +14215,58 @@
                     methodName + " is unsupported without " + telephonyFeature);
         }
     }
+
+    /**
+     * Registers for the satellite communication allowed state changed.
+     *
+     * @param subId The subId of the subscription to register for the satellite communication
+     *              allowed state changed.
+     * @param callback The callback to handle the satellite communication allowed
+     *                 state changed event.
+     *
+     * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
+     *
+     * @throws SecurityException if the caller doesn't have the required permission.
+     */
+    @Override
+    @SatelliteManager.SatelliteResult public int registerForCommunicationAllowedStateChanged(
+            int subId, @NonNull ISatelliteCommunicationAllowedStateCallback callback) {
+        enforceSatelliteCommunicationPermission("registerForCommunicationAllowedStateChanged");
+        return mSatelliteAccessController.registerForCommunicationAllowedStateChanged(
+                subId, callback);
+    }
+
+    /**
+     * Unregisters for the satellite communication allowed state changed.
+     * If callback was not registered before, the request will be ignored.
+     *
+     * @param subId    The subId of the subscription to unregister for the satellite communication
+     *                 allowed state changed.
+     * @param callback The callback that was passed to
+     *                 {@link #registerForCommunicationAllowedStateChanged(int,
+     *                 ISatelliteCommunicationAllowedStateCallback)}.     *
+     * @throws SecurityException if the caller doesn't have the required permission.
+     */
+    @Override
+    public void unregisterForCommunicationAllowedStateChanged(
+            int subId, @NonNull ISatelliteCommunicationAllowedStateCallback callback) {
+        enforceSatelliteCommunicationPermission("unregisterForCommunicationAllowedStateChanged");
+        mSatelliteAccessController.unregisterForCommunicationAllowedStateChanged(subId, callback);
+    }
+
+    /**
+     * Request to get the {@link SatelliteSessionStats} of the satellite service.
+     *
+     * @param subId The subId of the subscription to the satellite session stats for.
+     * @param result The result receiver that returns the {@link SatelliteSessionStats}
+     *               if the request is successful or an error code if the request failed.
+     *
+     * @throws SecurityException if the caller doesn't have required permission.
+     */
+    @Override
+    public void requestSatelliteSessionStats(int subId, @NonNull ResultReceiver result) {
+        enforceModifyPermission();
+        enforcePackageUsageStatsPermission("requestSatelliteSessionStats");
+        mSatelliteController.requestSatelliteSessionStats(subId, result);
+    }
 }
diff --git a/src/com/android/phone/ServiceStateProvider.java b/src/com/android/phone/ServiceStateProvider.java
index 3fa1e58..894d1c7 100644
--- a/src/com/android/phone/ServiceStateProvider.java
+++ b/src/com/android/phone/ServiceStateProvider.java
@@ -41,6 +41,7 @@
 import android.os.Binder;
 import android.os.Build;
 import android.os.Parcel;
+import android.os.UserHandle;
 import android.telephony.LocationAccessPolicy;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
@@ -577,27 +578,31 @@
             ServiceState newSS, int subId) {
         final boolean firstUpdate = (oldSS == null) ? true : false;
 
-        // for every field, if the field has changed values, notify via the provider
+        // For every field, if the field has changed values, notify via the provider to all users
         if (firstUpdate || voiceRegStateChanged(oldSS, newSS)) {
             context.getContentResolver().notifyChange(
                     getUriForSubscriptionIdAndField(subId, VOICE_REG_STATE),
-                    /* observer= */ null, /* syncToNetwork= */ false);
+                    /* observer= */ null, /* syncToNetwork= */ false, UserHandle.USER_ALL);
         }
         if (firstUpdate || dataRegStateChanged(oldSS, newSS)) {
             context.getContentResolver().notifyChange(
-                    getUriForSubscriptionIdAndField(subId, DATA_REG_STATE), null, false);
+                    getUriForSubscriptionIdAndField(subId, DATA_REG_STATE),
+                    /* observer= */ null, /* syncToNetwork= */ false, UserHandle.USER_ALL);
         }
         if (firstUpdate || voiceRoamingTypeChanged(oldSS, newSS)) {
             context.getContentResolver().notifyChange(
-                    getUriForSubscriptionIdAndField(subId, VOICE_ROAMING_TYPE), null, false);
+                    getUriForSubscriptionIdAndField(subId, VOICE_ROAMING_TYPE),
+                    /* observer= */ null, /* syncToNetwork= */ false, UserHandle.USER_ALL);
         }
         if (firstUpdate || dataRoamingTypeChanged(oldSS, newSS)) {
             context.getContentResolver().notifyChange(
-                    getUriForSubscriptionIdAndField(subId, DATA_ROAMING_TYPE), null, false);
+                    getUriForSubscriptionIdAndField(subId, DATA_ROAMING_TYPE),
+                    /* observer= */ null, /* syncToNetwork= */ false, UserHandle.USER_ALL);
         }
         if (firstUpdate || dataNetworkTypeChanged(oldSS, newSS)) {
             context.getContentResolver().notifyChange(
-                    getUriForSubscriptionIdAndField(subId, DATA_NETWORK_TYPE), null, false);
+                    getUriForSubscriptionIdAndField(subId, DATA_NETWORK_TYPE),
+                    /* observer= */ null, /* syncToNetwork= */ false, UserHandle.USER_ALL);
         }
     }
 
@@ -635,14 +640,15 @@
     @VisibleForTesting
     public static void notifyChangeForSubId(Context context, ServiceState oldSS, ServiceState newSS,
             int subId) {
-        // if the voice or data registration or roaming state field has changed values, notify via
-        // the provider.
+        // If the voice or data registration or roaming state field has changed values, notify via
+        // the provider to all users.
         // If oldSS is null and newSS is not (e.g. first update of service state) this will also
-        // notify
+        // notify to all users.
         if (oldSS == null || voiceRegStateChanged(oldSS, newSS) || dataRegStateChanged(oldSS, newSS)
                 || voiceRoamingTypeChanged(oldSS, newSS) || dataRoamingTypeChanged(oldSS, newSS)
                 || dataNetworkTypeChanged(oldSS, newSS)) {
-            context.getContentResolver().notifyChange(getUriForSubscriptionId(subId), null, false);
+            context.getContentResolver().notifyChange(getUriForSubscriptionId(subId),
+                    /* observer= */ null, /* syncToNetwork= */ false, UserHandle.USER_ALL);
         }
     }
 
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index c55cc6c..6969275 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -193,6 +193,8 @@
             "set-satellite-pointing-ui-class-name";
     private static final String SET_DATAGRAM_CONTROLLER_TIMEOUT_DURATION =
             "set-datagram-controller-timeout-duration";
+    private static final String SET_DATAGRAM_CONTROLLER_BOOLEAN_CONFIG =
+            "set-datagram-controller-boolean-config";
 
     private static final String SET_SATELLITE_CONTROLLER_TIMEOUT_DURATION =
             "set-satellite-controller-timeout-duration";
@@ -205,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";
@@ -402,6 +406,8 @@
                 return handleSetSatellitePointingUiClassNameCommand();
             case SET_DATAGRAM_CONTROLLER_TIMEOUT_DURATION:
                 return handleSetDatagramControllerTimeoutDuration();
+            case SET_DATAGRAM_CONTROLLER_BOOLEAN_CONFIG:
+                return handleSetDatagramControllerBooleanConfig();
             case SET_SATELLITE_CONTROLLER_TIMEOUT_DURATION:
                 return handleSetSatelliteControllerTimeoutDuration();
             case SET_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE:
@@ -414,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);
             }
@@ -3416,6 +3424,47 @@
         return 0;
     }
 
+    private int handleSetDatagramControllerBooleanConfig() {
+        PrintWriter errPw = getErrPrintWriter();
+        boolean reset = false;
+        int booleanType = 0;
+        boolean enable = false;
+
+        String opt;
+        while ((opt = getNextOption()) != null) {
+            switch (opt) {
+                case "-d": {
+                    enable = Boolean.parseBoolean(getNextArgRequired());
+                    break;
+                }
+                case "-r": {
+                    reset = true;
+                    break;
+                }
+                case "-t": {
+                    booleanType = Integer.parseInt(getNextArgRequired());
+                    break;
+                }
+            }
+        }
+        Log.d(LOG_TAG, "setDatagramControllerBooleanConfig: enable="
+                + enable + ", reset=" + reset + ", booleanType=" + booleanType);
+
+        try {
+            boolean result = mInterface.setDatagramControllerBooleanConfig(
+                    reset, booleanType, enable);
+            if (VDBG) {
+                Log.v(LOG_TAG, "setDatagramControllerBooleanConfig result = " + result);
+            }
+            getOutPrintWriter().println(result);
+        } catch (RemoteException e) {
+            Log.w(LOG_TAG, "setDatagramControllerBooleanConfig: error = " + e.getMessage());
+            errPw.println("Exception: " + e.getMessage());
+            return -1;
+        }
+        return 0;
+    }
+
     private int handleSetSatelliteControllerTimeoutDuration() {
         PrintWriter errPw = getErrPrintWriter();
         boolean reset = false;
@@ -3654,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]}
@@ -3883,7 +3987,7 @@
     /**
      * Building the string that can be used to build the JsonObject which supports to stub the data
      * in CarrierAllowListInfo for CTS testing. sample format is like
-     * {"com.android.example":{"carrierId":"10000","callerSHA1Id":["XXXXXXXXXXXXXX"]}}
+     * {"com.android.example":{"carrierIds":[10000],"callerSHA256Ids":["XXXXXXXXXXXXXX"]}}
      */
     private String convertToJsonString(int index, String param) {
 
@@ -3895,7 +3999,7 @@
                 break;
             case 1:
                 jSonString =
-                        "{" + QUOTES + token[0] + QUOTES + ":" + QUOTES + token[1] + QUOTES + ",";
+                        "{" + QUOTES + token[0] + QUOTES + ":" + "[" + token[1] + "],";
                 break;
             case 2:
                 jSonString =
diff --git a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
index 5da52d6..3e44062 100644
--- a/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
+++ b/src/com/android/phone/euicc/EuiccUiDispatcherActivity.java
@@ -113,7 +113,7 @@
     @Nullable
     Intent resolveEuiccUiIntent() {
         EuiccManager euiccManager = (EuiccManager) getSystemService(Context.EUICC_SERVICE);
-        if (!euiccManager.isEnabled()) {
+        if (euiccManager == null || !euiccManager.isEnabled()) {
             Log.w(TAG, "eUICC not enabled");
             return null;
         }
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index 36280e9..be7179e 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -17,34 +17,51 @@
 package com.android.phone.satellite.accesscontrol;
 
 import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_PROVISIONED;
+import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_SUPPORTED;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_LOCATION_NOT_AVAILABLE;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
 
+import static com.android.internal.telephony.satellite.SatelliteController.SATELLITE_SHARED_PREF;
+
 import android.annotation.ArrayRes;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.location.Location;
 import android.location.LocationManager;
 import android.location.LocationRequest;
+import android.os.AsyncResult;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
+import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.provider.DeviceConfig;
 import android.telecom.TelecomManager;
 import android.telephony.AnomalyReporter;
+import android.telephony.DropBoxManagerLoggerBackend;
+import android.telephony.PersistentLogger;
 import android.telephony.Rlog;
+import android.telephony.SubscriptionManager;
+import android.telephony.satellite.ISatelliteCommunicationAllowedStateCallback;
+import android.telephony.satellite.ISatelliteProvisionStateCallback;
+import android.telephony.satellite.ISatelliteSupportedStateCallback;
+import android.telephony.satellite.SatelliteManager;
 import android.text.TextUtils;
 import android.util.Pair;
 
+import com.android.internal.R;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.Phone;
@@ -52,15 +69,22 @@
 import com.android.internal.telephony.TelephonyCountryDetector;
 import com.android.internal.telephony.flags.FeatureFlags;
 import com.android.internal.telephony.satellite.SatelliteConfig;
+import com.android.internal.telephony.satellite.SatelliteConstants;
 import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.internal.telephony.satellite.metrics.AccessControllerMetricsStats;
+import com.android.internal.telephony.satellite.metrics.ConfigUpdaterMetricsStats;
+import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
+import com.android.internal.telephony.util.TelephonyUtils;
 import com.android.phone.PhoneGlobals;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 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;
@@ -71,6 +95,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -112,56 +137,120 @@
     private static SatelliteAccessController sInstance;
 
     /** Feature flags to control behavior and errors. */
-    @NonNull private final FeatureFlags mFeatureFlags;
+    @NonNull
+    private final FeatureFlags mFeatureFlags;
     @GuardedBy("mLock")
-    @Nullable protected SatelliteOnDeviceAccessController mSatelliteOnDeviceAccessController;
-    @NonNull private final LocationManager mLocationManager;
-    @NonNull private final TelecomManager mTelecomManager;
-    @NonNull private final TelephonyCountryDetector mCountryDetector;
-    @NonNull private final SatelliteController mSatelliteController;
-    @NonNull private final ResultReceiver mInternalSatelliteAllowResultReceiver;
-    @NonNull protected final Object mLock = new Object();
+    @Nullable
+    protected SatelliteOnDeviceAccessController mSatelliteOnDeviceAccessController;
+    @NonNull
+    private final LocationManager mLocationManager;
+    @NonNull
+    private final TelecomManager mTelecomManager;
+    @NonNull
+    private final TelephonyCountryDetector mCountryDetector;
+    @NonNull
+    private final SatelliteController mSatelliteController;
+    @NonNull
+    private final ControllerMetricsStats mControllerMetricsStats;
+    @NonNull
+    private final AccessControllerMetricsStats mAccessControllerMetricsStats;
+    @NonNull
+    private final ResultReceiver mInternalSatelliteSupportedResultReceiver;
+    @NonNull
+    private final ResultReceiver mInternalSatelliteProvisionedResultReceiver;
+    @NonNull
+    private final ISatelliteSupportedStateCallback mInternalSatelliteSupportedStateCallback;
+    @NonNull
+    private final ISatelliteProvisionStateCallback mInternalSatelliteProvisionStateCallback;
+    @NonNull
+    protected final Object mLock = new Object();
     @GuardedBy("mLock")
     @NonNull
     private final Set<ResultReceiver> mSatelliteAllowResultReceivers = new HashSet<>();
-    @NonNull private List<String> mSatelliteCountryCodes;
+    @NonNull
+    private List<String> mSatelliteCountryCodes;
     private boolean mIsSatelliteAllowAccessControl;
-    @Nullable private File mSatelliteS2CellFile;
+    @Nullable
+    private File mSatelliteS2CellFile;
     private long mLocationFreshDurationNanos;
     @GuardedBy("mLock")
     private boolean mIsOverlayConfigOverridden = false;
-    @NonNull private List<String> mOverriddenSatelliteCountryCodes;
+    @NonNull
+    private List<String> mOverriddenSatelliteCountryCodes;
     private boolean mOverriddenIsSatelliteAllowAccessControl;
-    @Nullable private File mOverriddenSatelliteS2CellFile;
+    @Nullable
+    private File mOverriddenSatelliteS2CellFile;
     private long mOverriddenLocationFreshDurationNanos;
     @GuardedBy("mLock")
     @NonNull
     private final Map<SatelliteOnDeviceAccessController.LocationToken, Boolean>
             mCachedAccessRestrictionMap = new LinkedHashMap<>() {
-                @Override
-                protected boolean removeEldestEntry(
-                        Entry<SatelliteOnDeviceAccessController.LocationToken, Boolean> eldest) {
-                    return size() > MAX_CACHE_SIZE;
-                }
-            };
+        @Override
+        protected boolean removeEldestEntry(
+                Entry<SatelliteOnDeviceAccessController.LocationToken, Boolean> eldest) {
+            return size() > MAX_CACHE_SIZE;
+        }
+    };
     @GuardedBy("mLock")
     @Nullable
     CancellationSignal mLocationRequestCancellationSignal = null;
     private int mS2Level = DEFAULT_S2_LEVEL;
     @GuardedBy("mLock")
-    @Nullable private Location mFreshLastKnownLocation = null;
+    @Nullable
+    private Location mFreshLastKnownLocation = null;
 
     /** These are used for CTS test */
     private Path mCtsSatS2FilePath = null;
-    private static final String GOOGLE_US_SAN_SAT_S2_FILE_NAME = "google_us_san_sat_s2.dat";
+    protected static final String GOOGLE_US_SAN_SAT_S2_FILE_NAME = "google_us_san_sat_s2.dat";
+
+    /** These are for config updater config data */
+    private static final String SATELLITE_ACCESS_CONTROL_DATA_DIR = "satellite_access_control";
+    private static final String CONFIG_UPDATER_S2_CELL_FILE_NAME = "config_updater_sat_s2.dat";
+    private static final int MIN_S2_LEVEL = 0;
+    private static final int MAX_S2_LEVEL = 30;
+    private static final String CONFIG_UPDATER_SATELLITE_COUNTRY_CODES_KEY =
+            "config_updater_satellite_country_codes";
+    private static final String CONFIG_UPDATER_SATELLITE_IS_ALLOW_ACCESS_CONTROL_KEY =
+            "config_updater_satellite_is_allow_access_control";
+
+    private static final String LATEST_SATELLITE_COMMUNICATION_ALLOWED_SET_TIME_KEY =
+            "latest_satellite_communication_allowed_set_time";
+    private static final String LATEST_SATELLITE_COMMUNICATION_ALLOWED_KEY =
+            "latest_satellite_communication_allowed";
+
+    private SharedPreferences mSharedPreferences;
+    private final ConfigUpdaterMetricsStats mConfigUpdaterMetricsStats;
+    @Nullable
+    private PersistentLogger mPersistentLogger = null;
+
+    /**
+     * Map key: binder of the callback, value: callback to receive the satellite communication
+     * allowed state changed events.
+     */
+    private final ConcurrentHashMap<IBinder, ISatelliteCommunicationAllowedStateCallback>
+            mSatelliteCommunicationAllowedStateChangedListeners = new ConcurrentHashMap<>();
+    private final Object mSatelliteCommunicationAllowStateLock = new Object();
+    @GuardedBy("mSatelliteCommunicationAllowStateLock")
+    private boolean mCurrentSatelliteAllowedState = false;
+
+    private static final long ALLOWED_STATE_CACHE_VALID_DURATION_HOURS =
+            Duration.ofHours(4).toNanos();
+    private boolean mLatestSatelliteCommunicationAllowed;
+    private long mLatestSatelliteCommunicationAllowedSetTime;
+
+    private long mLocationQueryStartTimeMillis;
+    private long mOnDeviceLookupStartTimeMillis;
+    private long mTotalCheckingStartTimeMillis;
 
     /**
      * Create a SatelliteAccessController instance.
      *
-     * @param context The context associated with the {@link SatelliteAccessController} instance.
-     * @param featureFlags The FeatureFlags that are supported.
-     * @param locationManager The LocationManager for querying current location of the device.
-     * @param looper The Looper to run the SatelliteAccessController on.
+     * @param context                           The context associated with the
+     *                                          {@link SatelliteAccessController} instance.
+     * @param featureFlags                      The FeatureFlags that are supported.
+     * @param locationManager                   The LocationManager for querying current location of
+     *                                          the device.
+     * @param looper                            The Looper to run the SatelliteAccessController on.
      * @param satelliteOnDeviceAccessController The on-device satellite access controller instance.
      */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@@ -171,36 +260,107 @@
             @Nullable SatelliteOnDeviceAccessController satelliteOnDeviceAccessController,
             @Nullable File s2CellFile) {
         super(looper);
+        if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
+            mPersistentLogger = new PersistentLogger(
+                    DropBoxManagerLoggerBackend.getInstance(context));
+        }
         mFeatureFlags = featureFlags;
         mLocationManager = locationManager;
         mTelecomManager = telecomManager;
         mSatelliteOnDeviceAccessController = satelliteOnDeviceAccessController;
         mCountryDetector = TelephonyCountryDetector.getInstance(context);
         mSatelliteController = SatelliteController.getInstance();
+        mControllerMetricsStats = ControllerMetricsStats.getInstance();
+        mAccessControllerMetricsStats = AccessControllerMetricsStats.getInstance();
+        initSharedPreferences(context);
         loadOverlayConfigs(context);
+        // loadConfigUpdaterConfigs has to be called after loadOverlayConfigs
+        // since config updater config has higher priority and thus can override overlay config
+        loadConfigUpdaterConfigs();
         mSatelliteController.registerForConfigUpdateChanged(this, EVENT_CONFIG_DATA_UPDATED,
                 context);
         if (s2CellFile != null) {
             mSatelliteS2CellFile = s2CellFile;
         }
-        mInternalSatelliteAllowResultReceiver = new ResultReceiver(this) {
+        mInternalSatelliteSupportedResultReceiver = new ResultReceiver(this) {
             @Override
             protected void onReceiveResult(int resultCode, Bundle resultData) {
-                handleSatelliteAllowResultFromSatelliteController(resultCode, resultData);
+                handleIsSatelliteSupportedResult(resultCode, resultData);
             }
         };
+        mInternalSatelliteProvisionedResultReceiver = new ResultReceiver(this) {
+            @Override
+            protected void onReceiveResult(int resultCode, Bundle resultData) {
+                handleIsSatelliteProvisionedResult(resultCode, resultData);
+            }
+        };
+
+        mConfigUpdaterMetricsStats = ConfigUpdaterMetricsStats.getOrCreateInstance();
+
+        mInternalSatelliteSupportedStateCallback = new ISatelliteSupportedStateCallback.Stub() {
+            @Override
+            public void onSatelliteSupportedStateChanged(boolean isSupported) {
+                logd("onSatelliteSupportedStateChanged: isSupported=" + isSupported);
+                if (isSupported) {
+                    requestIsCommunicationAllowedForCurrentLocation(
+                            SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, new ResultReceiver(null) {
+                                @Override
+                                protected void onReceiveResult(int resultCode, Bundle resultData) {
+                                    // do nothing
+                                }
+                            });
+                }
+            }
+        };
+        mSatelliteController.registerForSatelliteSupportedStateChanged(
+                SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
+                mInternalSatelliteSupportedStateCallback);
+
+        mInternalSatelliteProvisionStateCallback = new ISatelliteProvisionStateCallback.Stub() {
+            @Override
+            public void onSatelliteProvisionStateChanged(boolean isProvisioned) {
+                logd("onSatelliteProvisionStateChanged: isProvisioned=" + isProvisioned);
+                if (isProvisioned) {
+                    requestIsCommunicationAllowedForCurrentLocation(
+                            SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, new ResultReceiver(null) {
+                                @Override
+                                protected void onReceiveResult(int resultCode, Bundle resultData) {
+                                    // do nothing
+                                }
+                            });
+                }
+            }
+        };
+        mSatelliteController.registerForSatelliteProvisionStateChanged(
+                SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
+                mInternalSatelliteProvisionStateCallback);
+
         // Init the SatelliteOnDeviceAccessController so that the S2 level can be cached
         initSatelliteOnDeviceAccessController();
     }
 
+    private void updateCurrentSatelliteAllowedState(boolean isAllowed) {
+        plogd("updateCurrentSatelliteAllowedState");
+        synchronized (mSatelliteCommunicationAllowStateLock) {
+            if (isAllowed != mCurrentSatelliteAllowedState) {
+                plogd("updatedValue = " + isAllowed + " | mCurrentSatelliteAllowedState = "
+                        + mCurrentSatelliteAllowedState);
+                mCurrentSatelliteAllowedState = isAllowed;
+                notifySatelliteCommunicationAllowedStateChanged(isAllowed);
+            }
+        }
+    }
+
     /** @return the singleton instance of {@link SatelliteAccessController} */
     public static synchronized SatelliteAccessController getOrCreateInstance(
             @NonNull Context context, @NonNull FeatureFlags featureFlags) {
         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;
@@ -220,10 +380,11 @@
                 cleanupOnDeviceAccessControllerResources();
                 break;
             case EVENT_CONFIG_DATA_UPDATED:
-                updateSatelliteConfigData((Context) msg.obj);
+                AsyncResult ar = (AsyncResult) msg.obj;
+                updateSatelliteConfigData((Context) ar.userObj);
                 break;
             default:
-                logw("SatelliteAccessControllerHandler: unexpected message code: " + msg.what);
+                plogw("SatelliteAccessControllerHandler: unexpected message code: " + msg.what);
                 break;
         }
     }
@@ -231,8 +392,8 @@
     /**
      * Request to get whether satellite communication is allowed for the current location.
      *
-     * @param subId The subId of the subscription to check whether satellite communication is
-     *              allowed for the current location for.
+     * @param subId  The subId of the subscription to check whether satellite communication is
+     *               allowed for the current location for.
      * @param result The result receiver that returns whether satellite communication is allowed
      *               for the current location if the request is successful or an error code
      *               if the request failed.
@@ -240,7 +401,7 @@
     public void requestIsCommunicationAllowedForCurrentLocation(int subId,
             @NonNull ResultReceiver result) {
         if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
-            logd("oemEnabledSatelliteFlag is disabled");
+            plogd("oemEnabledSatelliteFlag is disabled");
             result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
             return;
         }
@@ -255,10 +416,10 @@
             @Nullable String s2CellFile, long locationFreshDurationNanos,
             @Nullable List<String> satelliteCountryCodes) {
         if (!isMockModemAllowed()) {
-            logd("setSatelliteAccessControllerOverlayConfigs: mock modem is not allowed");
+            plogd("setSatelliteAccessControllerOverlayConfigs: mock modem is not allowed");
             return false;
         }
-        logd("setSatelliteAccessControlOverlayConfigs: reset=" + reset
+        plogd("setSatelliteAccessControlOverlayConfigs: reset=" + reset
                 + ", isAllowed" + isAllowed + ", s2CellFile=" + s2CellFile
                 + ", locationFreshDurationNanos=" + locationFreshDurationNanos
                 + ", satelliteCountryCodes=" + ((satelliteCountryCodes != null)
@@ -273,7 +434,7 @@
                 if (!TextUtils.isEmpty(s2CellFile)) {
                     mOverriddenSatelliteS2CellFile = getTestSatelliteS2File(s2CellFile);
                     if (!mOverriddenSatelliteS2CellFile.exists()) {
-                        logd("The overriding file "
+                        plogd("The overriding file "
                                 + mOverriddenSatelliteS2CellFile.getAbsolutePath()
                                 + " does not exist");
                         mOverriddenSatelliteS2CellFile = null;
@@ -294,20 +455,21 @@
         return true;
     }
 
-    private File getTestSatelliteS2File(String fileName) {
-        logd("getTestSatelliteS2File: fileName=" + fileName);
+    protected File getTestSatelliteS2File(String fileName) {
+        plogd("getTestSatelliteS2File: fileName=" + fileName);
         if (TextUtils.equals(fileName, GOOGLE_US_SAN_SAT_S2_FILE_NAME)) {
             mCtsSatS2FilePath = copyTestSatS2FileToPhoneDirectory(GOOGLE_US_SAN_SAT_S2_FILE_NAME);
             if (mCtsSatS2FilePath != null) {
                 return mCtsSatS2FilePath.toFile();
             } else {
-                loge("getTestSatelliteS2File: mCtsSatS2FilePath is null");
+                ploge("getTestSatelliteS2File: mCtsSatS2FilePath is null");
             }
         }
         return new File(fileName);
     }
 
-    @Nullable private static Path copyTestSatS2FileToPhoneDirectory(String sourceFileName) {
+    @Nullable
+    private static Path copyTestSatS2FileToPhoneDirectory(String sourceFileName) {
         PhoneGlobals phoneGlobals = PhoneGlobals.getInstance();
         File ctsFile = phoneGlobals.getDir("cts", Context.MODE_PRIVATE);
         if (!ctsFile.exists()) {
@@ -330,12 +492,72 @@
         return targetSatS2FilePath;
     }
 
+    @Nullable
+    private static File copySatS2FileToLocalDirectory(@NonNull File sourceFile) {
+        PhoneGlobals phoneGlobals = PhoneGlobals.getInstance();
+        File satelliteAccessControlFile = phoneGlobals.getDir(
+                SATELLITE_ACCESS_CONTROL_DATA_DIR, Context.MODE_PRIVATE);
+        if (!satelliteAccessControlFile.exists()) {
+            satelliteAccessControlFile.mkdirs();
+        }
+
+        Path targetDir = satelliteAccessControlFile.toPath();
+        Path targetSatS2FilePath = targetDir.resolve(CONFIG_UPDATER_S2_CELL_FILE_NAME);
+        try {
+            InputStream inputStream = new FileInputStream(sourceFile);
+            if (inputStream == null) {
+                loge("copySatS2FileToPhoneDirectory: Resource=" + sourceFile.getAbsolutePath()
+                        + " not found");
+                return null;
+            } else {
+                Files.copy(inputStream, targetSatS2FilePath, StandardCopyOption.REPLACE_EXISTING);
+            }
+        } catch (IOException ex) {
+            loge("copySatS2FileToPhoneDirectory: ex=" + ex);
+            return null;
+        }
+        return targetSatS2FilePath.toFile();
+    }
+
+    @Nullable
+    private File getConfigUpdaterSatS2CellFileFromLocalDirectory() {
+        PhoneGlobals phoneGlobals = PhoneGlobals.getInstance();
+        File satelliteAccessControlFile = phoneGlobals.getDir(
+                SATELLITE_ACCESS_CONTROL_DATA_DIR, Context.MODE_PRIVATE);
+        if (!satelliteAccessControlFile.exists()) {
+            return null;
+        }
+
+        Path satelliteAccessControlFileDir = satelliteAccessControlFile.toPath();
+        Path configUpdaterSatS2FilePath = satelliteAccessControlFileDir.resolve(
+                CONFIG_UPDATER_S2_CELL_FILE_NAME);
+        return configUpdaterSatS2FilePath.toFile();
+    }
+
+    private boolean isS2CellFileValid(@NonNull File s2CellFile) {
+        try {
+            SatelliteOnDeviceAccessController satelliteOnDeviceAccessController =
+                    SatelliteOnDeviceAccessController.create(s2CellFile);
+            int s2Level = satelliteOnDeviceAccessController.getS2Level();
+            if (s2Level < MIN_S2_LEVEL || s2Level > MAX_S2_LEVEL) {
+                ploge("isS2CellFileValid: invalid s2 level = " + s2Level);
+                satelliteOnDeviceAccessController.close();
+                return false;
+            }
+            satelliteOnDeviceAccessController.close();
+        } catch (Exception ex) {
+            ploge("isS2CellFileValid: Got exception in reading the file, ex=" + ex);
+            return false;
+        }
+        return true;
+    }
+
     private void cleanUpCtsResources() {
         if (mCtsSatS2FilePath != null) {
             try {
                 Files.delete(mCtsSatS2FilePath);
             } catch (IOException ex) {
-                loge("cleanUpCtsResources: ex=" + ex);
+                ploge("cleanUpCtsResources: ex=" + ex);
             }
         }
     }
@@ -346,56 +568,167 @@
     }
 
     /**
-     * Update country codes, S2CellFile and satellite region allowed by ConfigUpdater
-     * or CarrierConfig
+     * @param countryCodes list of country code (two letters based on the ISO 3166-1).
+     * @return {@code true} if the countryCode is valid {@code false} otherwise.
      */
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
-    public void updateSatelliteConfigData(Context context) {
-        logd("updateSatelliteConfigData");
-
-        SatelliteConfig satelliteConfig = mSatelliteController.getSatelliteConfig();
-        if (satelliteConfig != null  && satelliteConfig.getSatelliteS2CellFile(context) != null) {
-            logd("Check mSatelliteS2CellFile from ConfigUpdater");
-            Path pathSatelliteS2CellFile = satelliteConfig.getSatelliteS2CellFile(context);
-            mSatelliteS2CellFile = pathSatelliteS2CellFile.toFile();
-            if (mSatelliteS2CellFile != null && !mSatelliteS2CellFile.exists()) {
-                loge("The satellite S2 cell file " + mSatelliteS2CellFile.getName()
-                        + " does not exist");
-                mSatelliteS2CellFile = null;
+    private boolean isValidCountryCodes(@Nullable List<String> countryCodes) {
+        if (countryCodes == null || countryCodes.isEmpty()) {
+            return false;
+        }
+        for (String countryCode : countryCodes) {
+            if (!TelephonyUtils.isValidCountryCode(countryCode)) {
+                ploge("invalid country code : " + countryCode);
+                return false;
             }
         }
+        return true;
+    }
 
-        if (mSatelliteS2CellFile == null) {
-            logd("Check mSatelliteS2CellFile from CarrierConfig");
-            String satelliteS2CellFileName = getSatelliteS2CellFileFromOverlayConfig(context);
-            mSatelliteS2CellFile = TextUtils.isEmpty(satelliteS2CellFileName)
-                    ? null : new File(satelliteS2CellFileName);
-            if (mSatelliteS2CellFile != null && !mSatelliteS2CellFile.exists()) {
-                loge("The satellite S2 cell file " + mSatelliteS2CellFile.getName()
-                        + " does not exist");
-                mSatelliteS2CellFile = null;
-            }
+    private boolean updateSharedPreferencesCountryCodes(
+            @NonNull Context context, @NonNull List<String> value) {
+        if (mSharedPreferences == null) {
+            plogd("updateSharedPreferencesCountryCodes: mSharedPreferences is null");
+            initSharedPreferences(context);
         }
+        if (mSharedPreferences == null) {
+            ploge("updateSharedPreferencesCountryCodes: mSharedPreferences is null");
+            return false;
+        }
+        try {
+            mSharedPreferences.edit().putStringSet(
+                    CONFIG_UPDATER_SATELLITE_COUNTRY_CODES_KEY, new HashSet<>(value)).apply();
+            return true;
+        } catch (Exception ex) {
+            ploge("updateSharedPreferencesCountryCodes error : " + ex);
+            return false;
+        }
+    }
 
-        if (mSatelliteS2CellFile == null) {
-            logd("Since mSatelliteS2CellFile is null, don't need to refer other configurations");
+    private boolean updateSharedPreferencesIsAllowAccessControl(
+            @NonNull Context context, boolean value) {
+        if (mSharedPreferences == null) {
+            plogd("updateSharedPreferencesIsAllowAccessControl: mSharedPreferences is null");
+            initSharedPreferences(context);
+        }
+        if (mSharedPreferences == null) {
+            ploge("updateSharedPreferencesIsAllowAccessControl: mSharedPreferences is null");
+            return false;
+        }
+        try {
+            mSharedPreferences.edit().putBoolean(
+                    CONFIG_UPDATER_SATELLITE_IS_ALLOW_ACCESS_CONTROL_KEY,
+                    value).apply();
+            return true;
+        } catch (Exception ex) {
+            ploge("updateSharedPreferencesIsAllowAccessControl error: " + ex);
+            return false;
+        }
+    }
+
+    private void persistLatestSatelliteCommunicationAllowedState() {
+        if (mSharedPreferences == null) {
+            ploge("persistLatestSatelliteCommunicationAllowedState: mSharedPreferences is null");
             return;
         }
 
-        if (satelliteConfig != null
-                && !satelliteConfig.getDeviceSatelliteCountryCodes().isEmpty()) {
-            logd("update mSatelliteCountryCodes by ConfigUpdater");
-            mSatelliteCountryCodes = satelliteConfig.getDeviceSatelliteCountryCodes();
-        } else {
-            mSatelliteCountryCodes = getSatelliteCountryCodesFromOverlayConfig(context);
+        try {
+            mSharedPreferences.edit().putLong(LATEST_SATELLITE_COMMUNICATION_ALLOWED_SET_TIME_KEY,
+                    mLatestSatelliteCommunicationAllowedSetTime).apply();
+            mSharedPreferences.edit().putBoolean(LATEST_SATELLITE_COMMUNICATION_ALLOWED_KEY,
+                    mLatestSatelliteCommunicationAllowed).apply();
+        } catch (Exception ex) {
+            ploge("persistLatestSatelliteCommunicationAllowedState error : " + ex);
+        }
+    }
+
+    /**
+     * Update country codes and S2CellFile with the new data from ConfigUpdater
+     */
+    private void updateSatelliteConfigData(Context context) {
+        plogd("updateSatelliteConfigData");
+
+        SatelliteConfig satelliteConfig = mSatelliteController.getSatelliteConfig();
+        if (satelliteConfig == null) {
+            ploge("satelliteConfig is null");
+            mConfigUpdaterMetricsStats.reportOemAndCarrierConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_NO_SATELLITE_DATA);
+            return;
         }
 
-        if (satelliteConfig != null && satelliteConfig.isSatelliteDataForAllowedRegion() != null) {
-            logd("update mIsSatelliteAllowAccessControl by ConfigUpdater");
-            mIsSatelliteAllowAccessControl = satelliteConfig.isSatelliteDataForAllowedRegion();
-        } else {
-            mIsSatelliteAllowAccessControl = getSatelliteAccessAllowFromOverlayConfig(context);
+        List<String> satelliteCountryCodes = satelliteConfig.getDeviceSatelliteCountryCodes();
+        if (!isValidCountryCodes(satelliteCountryCodes)) {
+            plogd("country codes is invalid");
+            mConfigUpdaterMetricsStats.reportOemConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_COUNTRY_CODE);
+            return;
         }
+
+        Boolean isSatelliteDataForAllowedRegion = satelliteConfig.isSatelliteDataForAllowedRegion();
+        if (isSatelliteDataForAllowedRegion == null) {
+            ploge("Satellite allowed is not configured with country codes");
+            mConfigUpdaterMetricsStats.reportOemConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_S2_CELL_FILE);
+            return;
+        }
+
+        File configUpdaterS2CellFile = satelliteConfig.getSatelliteS2CellFile(context);
+        if (configUpdaterS2CellFile == null || !configUpdaterS2CellFile.exists()) {
+            plogd("No S2 cell file configured or the file does not exist");
+            mConfigUpdaterMetricsStats.reportOemConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_S2_CELL_FILE);
+            return;
+        }
+
+        if (!isS2CellFileValid(configUpdaterS2CellFile)) {
+            ploge("The configured S2 cell file is not valid");
+            mConfigUpdaterMetricsStats.reportOemConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_DEVICE_DATA_INVALID_S2_CELL_FILE);
+            return;
+        }
+
+        File localS2CellFile = copySatS2FileToLocalDirectory(configUpdaterS2CellFile);
+        if (localS2CellFile == null || !localS2CellFile.exists()) {
+            ploge("Fail to copy S2 cell file to local directory");
+            mConfigUpdaterMetricsStats.reportOemConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_IO_ERROR);
+            return;
+        }
+
+        if (!updateSharedPreferencesCountryCodes(context, satelliteCountryCodes)) {
+            ploge("Fail to copy country coeds into shared preferences");
+            localS2CellFile.delete();
+            mConfigUpdaterMetricsStats.reportOemConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_IO_ERROR);
+            return;
+        }
+
+        if (!updateSharedPreferencesIsAllowAccessControl(
+                context, isSatelliteDataForAllowedRegion.booleanValue())) {
+            ploge("Fail to copy allow access control into shared preferences");
+            localS2CellFile.delete();
+            mConfigUpdaterMetricsStats.reportOemConfigError(
+                    SatelliteConstants.CONFIG_UPDATE_RESULT_IO_ERROR);
+            return;
+        }
+
+        mSatelliteS2CellFile = localS2CellFile;
+        mSatelliteCountryCodes = satelliteCountryCodes;
+        mIsSatelliteAllowAccessControl = satelliteConfig.isSatelliteDataForAllowedRegion();
+        plogd("Use s2 cell file=" + mSatelliteS2CellFile.getAbsolutePath() + ", country codes="
+                + String.join(",", mSatelliteCountryCodes)
+                + ", mIsSatelliteAllowAccessControl=" + mIsSatelliteAllowAccessControl
+                + " from ConfigUpdater");
+
+        // Clean up resources so that the new config data will be used when serving new requests
+        cleanupOnDeviceAccessControllerResources();
+
+        // Clean up cached data based on previous geofence data
+        synchronized (mLock) {
+            plogd("clear mCachedAccessRestrictionMap");
+            mCachedAccessRestrictionMap.clear();
+        }
+
+        mConfigUpdaterMetricsStats.reportConfigUpdateSuccess();
     }
 
     private void loadOverlayConfigs(@NonNull Context context) {
@@ -405,10 +738,65 @@
         mSatelliteS2CellFile = TextUtils.isEmpty(satelliteS2CellFileName)
                 ? null : new File(satelliteS2CellFileName);
         if (mSatelliteS2CellFile != null && !mSatelliteS2CellFile.exists()) {
-            loge("The satellite S2 cell file " + satelliteS2CellFileName + " does not exist");
+            ploge("The satellite S2 cell file " + satelliteS2CellFileName + " does not exist");
             mSatelliteS2CellFile = null;
         }
         mLocationFreshDurationNanos = getSatelliteLocationFreshDurationFromOverlayConfig(context);
+        mAccessControllerMetricsStats.setConfigDataSource(
+                SatelliteConstants.CONFIG_DATA_SOURCE_DEVICE_CONFIG);
+    }
+
+    private void loadConfigUpdaterConfigs() {
+        if (mSharedPreferences == null) {
+            ploge("loadConfigUpdaterConfigs : mSharedPreferences is null");
+            return;
+        }
+
+        Set<String> countryCodes =
+                mSharedPreferences.getStringSet(CONFIG_UPDATER_SATELLITE_COUNTRY_CODES_KEY, null);
+
+        if (countryCodes == null || countryCodes.isEmpty()) {
+            ploge("config updater country codes are either null or empty");
+            return;
+        }
+
+        boolean isSatelliteAllowAccessControl =
+                mSharedPreferences.getBoolean(
+                        CONFIG_UPDATER_SATELLITE_IS_ALLOW_ACCESS_CONTROL_KEY, true);
+
+        File s2CellFile = getConfigUpdaterSatS2CellFileFromLocalDirectory();
+        if (s2CellFile == null) {
+            ploge("s2CellFile is null");
+            return;
+        }
+
+        plogd("use config updater config data");
+        mSatelliteS2CellFile = s2CellFile;
+        mSatelliteCountryCodes = countryCodes.stream().collect(Collectors.toList());
+        mIsSatelliteAllowAccessControl = isSatelliteAllowAccessControl;
+        mAccessControllerMetricsStats.setConfigDataSource(
+                SatelliteConstants.CONFIG_DATA_SOURCE_CONFIG_UPDATER);
+    }
+
+    private void loadCachedLatestSatelliteCommunicationAllowedState() {
+        if (mSharedPreferences == null) {
+            ploge("loadCachedLatestSatelliteCommunicationAllowedState: mSharedPreferences is null");
+            return;
+        }
+
+        try {
+            mLatestSatelliteCommunicationAllowedSetTime =
+                    mSharedPreferences.getLong(LATEST_SATELLITE_COMMUNICATION_ALLOWED_SET_TIME_KEY,
+                            0);
+            mLatestSatelliteCommunicationAllowed =
+                    mSharedPreferences.getBoolean(LATEST_SATELLITE_COMMUNICATION_ALLOWED_KEY,
+                            false);
+        } catch (Exception ex) {
+            ploge("loadCachedLatestSatelliteCommunicationAllowedState: ex=" + ex);
+        }
+        plogd("mLatestSatelliteCommunicationAllowedSetTime="
+                + mLatestSatelliteCommunicationAllowedSetTime
+                + ", mLatestSatelliteCommunicationAllowed=" + mLatestSatelliteCommunicationAllowed);
     }
 
     private long getLocationFreshDurationNanos() {
@@ -420,7 +808,8 @@
         }
     }
 
-    @NonNull private List<String> getSatelliteCountryCodes() {
+    @NonNull
+    private List<String> getSatelliteCountryCodes() {
         synchronized (mLock) {
             if (mIsOverlayConfigOverridden) {
                 return mOverriddenSatelliteCountryCodes;
@@ -429,7 +818,8 @@
         }
     }
 
-    @Nullable private File getSatelliteS2CellFile() {
+    @Nullable
+    private File getSatelliteS2CellFile() {
         synchronized (mLock) {
             if (mIsOverlayConfigOverridden) {
                 return mOverriddenSatelliteS2CellFile;
@@ -452,62 +842,95 @@
         synchronized (mLock) {
             mSatelliteAllowResultReceivers.add(requestArguments.second);
             if (mSatelliteAllowResultReceivers.size() > 1) {
-                logd("requestIsCommunicationAllowedForCurrentLocation is already being "
+                plogd("requestIsCommunicationAllowedForCurrentLocation is already being "
                         + "processed");
                 return;
             }
-            mSatelliteController.requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                    requestArguments.first, mInternalSatelliteAllowResultReceiver);
+            mTotalCheckingStartTimeMillis = System.currentTimeMillis();
+            mSatelliteController.requestIsSatelliteSupported(
+                    requestArguments.first, mInternalSatelliteSupportedResultReceiver);
         }
     }
 
     private void handleWaitForCurrentLocationTimedOutEvent() {
-        logd("Timed out to wait for current location");
+        plogd("Timed out to wait for current location");
         synchronized (mLock) {
             if (mLocationRequestCancellationSignal != null) {
                 mLocationRequestCancellationSignal.cancel();
                 mLocationRequestCancellationSignal = null;
                 onCurrentLocationAvailable(null);
             } else {
-                loge("handleWaitForCurrentLocationTimedOutEvent: "
+                ploge("handleWaitForCurrentLocationTimedOutEvent: "
                         + "mLocationRequestCancellationSignal is null");
             }
         }
     }
 
-    private void handleSatelliteAllowResultFromSatelliteController(
-            int resultCode, Bundle resultData) {
-        logd("handleSatelliteAllowResultFromSatelliteController: resultCode=" + resultCode);
+    private void handleIsSatelliteSupportedResult(int resultCode, Bundle resultData) {
+        plogd("handleIsSatelliteSupportedResult: resultCode=" + resultCode);
         synchronized (mLock) {
             if (resultCode == SATELLITE_RESULT_SUCCESS) {
-                if (resultData.containsKey(KEY_SATELLITE_COMMUNICATION_ALLOWED)) {
-                    boolean isSatelliteAllowed = resultData.getBoolean(
-                            KEY_SATELLITE_COMMUNICATION_ALLOWED);
-                    if (!isSatelliteAllowed) {
-                        logd("Satellite is not allowed by modem");
-                        sendSatelliteAllowResultToReceivers(resultCode, resultData);
+                if (resultData.containsKey(KEY_SATELLITE_SUPPORTED)) {
+                    boolean isSatelliteSupported = resultData.getBoolean(KEY_SATELLITE_SUPPORTED);
+                    if (!isSatelliteSupported) {
+                        plogd("Satellite is not supported");
+                        Bundle bundle = new Bundle();
+                        bundle.putBoolean(SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED,
+                                false);
+                        sendSatelliteAllowResultToReceivers(resultCode, bundle, false);
                     } else {
-                        checkSatelliteAccessRestrictionForCurrentLocation();
+                        plogd("Satellite is supported");
+                        checkSatelliteAccessRestrictionUsingGPS();
                     }
                 } else {
-                    loge("KEY_SATELLITE_COMMUNICATION_ALLOWED does not exist.");
-                    sendSatelliteAllowResultToReceivers(resultCode, resultData);
+                    ploge("KEY_SATELLITE_SUPPORTED does not exist.");
+                    sendSatelliteAllowResultToReceivers(resultCode, resultData, false);
                 }
-            } else if (resultCode == SATELLITE_RESULT_REQUEST_NOT_SUPPORTED) {
-                checkSatelliteAccessRestrictionForCurrentLocation();
             } else {
-                sendSatelliteAllowResultToReceivers(resultCode, resultData);
+                sendSatelliteAllowResultToReceivers(resultCode, resultData, false);
             }
         }
     }
 
-    private void sendSatelliteAllowResultToReceivers(int resultCode, Bundle resultData) {
+    private void handleIsSatelliteProvisionedResult(int resultCode, Bundle resultData) {
+        plogd("handleIsSatelliteProvisionedResult: resultCode=" + resultCode);
+        synchronized (mLock) {
+            if (resultCode == SATELLITE_RESULT_SUCCESS) {
+                if (resultData.containsKey(KEY_SATELLITE_PROVISIONED)) {
+                    boolean isSatelliteProvisioned =
+                            resultData.getBoolean(KEY_SATELLITE_PROVISIONED);
+                    if (!isSatelliteProvisioned) {
+                        plogd("Satellite is not provisioned");
+                        Bundle bundle = new Bundle();
+                        bundle.putBoolean(SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED,
+                                false);
+                        sendSatelliteAllowResultToReceivers(resultCode, bundle, false);
+                    } else {
+                        plogd("Satellite is provisioned");
+                        checkSatelliteAccessRestrictionUsingGPS();
+                    }
+                } else {
+                    ploge("KEY_SATELLITE_PROVISIONED does not exist.");
+                    sendSatelliteAllowResultToReceivers(resultCode, resultData, false);
+                }
+            } else {
+                sendSatelliteAllowResultToReceivers(resultCode, resultData, false);
+            }
+        }
+    }
+
+    private void sendSatelliteAllowResultToReceivers(int resultCode, Bundle resultData,
+            boolean allowed) {
+        if (resultCode == SATELLITE_RESULT_SUCCESS) {
+            updateCurrentSatelliteAllowedState(allowed);
+        }
         synchronized (mLock) {
             for (ResultReceiver resultReceiver : mSatelliteAllowResultReceivers) {
                 resultReceiver.send(resultCode, resultData);
             }
             mSatelliteAllowResultReceivers.clear();
         }
+        reportMetrics(resultCode, allowed);
     }
 
     /**
@@ -517,13 +940,17 @@
         synchronized (mLock) {
             List<String> networkCountryIsoList = mCountryDetector.getCurrentNetworkCountryIso();
             if (!networkCountryIsoList.isEmpty()) {
-                logd("Use current network country codes=" + String.join(", ",
+                plogd("Use current network country codes=" + String.join(", ",
                         networkCountryIsoList));
 
+                boolean allowed = isSatelliteAccessAllowedForLocation(networkCountryIsoList);
                 Bundle bundle = new Bundle();
-                bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED,
-                        isSatelliteAccessAllowedForLocation(networkCountryIsoList));
-                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle);
+                bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, allowed);
+                mAccessControllerMetricsStats
+                        .setAccessControlType(
+                                SatelliteConstants.ACCESS_CONTROL_TYPE_NETWORK_COUNTRY_CODE)
+                        .setCountryCodes(networkCountryIsoList);
+                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle, allowed);
             } else {
                 if (shouldUseOnDeviceAccessController()) {
                     // This will be an asynchronous check when it needs to wait for the current
@@ -538,6 +965,59 @@
     }
 
     /**
+     * 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()) {
+                plogd("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 {
+                plogv("location query is not allowed");
+                Bundle bundle = new Bundle();
+                bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle, false);
+            }
+        }
+    }
+
+    /**
+     * @return {@code true} if the latest query was executed within the predefined valid duration,
+     * {@code false} otherwise.
+     */
+    private boolean isCommunicationAllowedCacheValid() {
+        if (mLatestSatelliteCommunicationAllowedSetTime > 0) {
+            long currentTime = SystemClock.elapsedRealtimeNanos();
+            if ((currentTime - mLatestSatelliteCommunicationAllowedSetTime)
+                    <= ALLOWED_STATE_CACHE_VALID_DURATION_HOURS) {
+                logv("isCommunicationAllowedCacheValid: cache is valid");
+                return true;
+            }
+        }
+        logv("isCommunicationAllowedCacheValid: cache is expired");
+        return false;
+    }
+
+    private void executeLocationQuery() {
+        plogv("executeLocationQuery");
+        synchronized (mLock) {
+            mFreshLastKnownLocation = getFreshLastKnownLocation();
+            checkSatelliteAccessRestrictionUsingOnDeviceData();
+        }
+    }
+
+    /**
      * This function synchronously checks if satellite is allowed at current location using cached
      * country codes.
      */
@@ -558,12 +1038,14 @@
             // Use cached network country codes
             countryCodeList = networkCountryCodeInfoMap.keySet().stream().toList();
         }
-        logd("Use cached country codes=" + String.join(", ", countryCodeList));
+        plogd("Use cached country codes=" + String.join(", ", countryCodeList));
+        mAccessControllerMetricsStats.setAccessControlType(
+                SatelliteConstants.ACCESS_CONTROL_TYPE_CACHED_COUNTRY_CODE);
 
+        boolean allowed = isSatelliteAccessAllowedForLocation(countryCodeList);
         Bundle bundle = new Bundle();
-        bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED,
-                isSatelliteAccessAllowedForLocation(countryCodeList));
-        sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle);
+        bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, allowed);
+        sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle, allowed);
     }
 
     /**
@@ -572,14 +1054,19 @@
      * from location service.
      */
     private void checkSatelliteAccessRestrictionUsingOnDeviceData() {
+        mOnDeviceLookupStartTimeMillis = System.currentTimeMillis();
         synchronized (mLock) {
-            logd("Use on-device data");
+            plogd("Use on-device data");
             if (mFreshLastKnownLocation != null) {
+                mAccessControllerMetricsStats.setAccessControlType(
+                        SatelliteConstants.ACCESS_CONTROL_TYPE_LAST_KNOWN_LOCATION);
                 checkSatelliteAccessRestrictionForLocation(mFreshLastKnownLocation);
                 mFreshLastKnownLocation = null;
             } else {
                 Location freshLastKnownLocation = getFreshLastKnownLocation();
                 if (freshLastKnownLocation != null) {
+                    mAccessControllerMetricsStats.setAccessControlType(
+                            SatelliteConstants.ACCESS_CONTROL_TYPE_LAST_KNOWN_LOCATION);
                     checkSatelliteAccessRestrictionForLocation(freshLastKnownLocation);
                 } else {
                     queryCurrentLocation();
@@ -591,10 +1078,11 @@
     private void queryCurrentLocation() {
         synchronized (mLock) {
             if (mLocationRequestCancellationSignal != null) {
-                logd("Request for current location was already sent to LocationManager");
+                plogd("Request for current location was already sent to LocationManager");
                 return;
             }
             mLocationRequestCancellationSignal = new CancellationSignal();
+            mLocationQueryStartTimeMillis = System.currentTimeMillis();
             mLocationManager.getCurrentLocation(LocationManager.GPS_PROVIDER,
                     new LocationRequest.Builder(0)
                             .setQuality(LocationRequest.QUALITY_HIGH_ACCURACY)
@@ -607,14 +1095,37 @@
     }
 
     private void onCurrentLocationAvailable(@Nullable Location location) {
-        logd("onCurrentLocationAvailable " + (location != null));
+        plogd("onCurrentLocationAvailable " + (location != null));
         synchronized (mLock) {
             stopWaitForCurrentLocationTimer();
             mLocationRequestCancellationSignal = null;
+            mAccessControllerMetricsStats.setLocationQueryTime(mLocationQueryStartTimeMillis);
+            Bundle bundle = new Bundle();
             if (location != null) {
+                plogd("onCurrentLocationAvailable: lat=" + Rlog.pii(TAG, location.getLatitude())
+                        + ", long=" + Rlog.pii(TAG, location.getLongitude()));
+                if (location.isMock() && !isMockModemAllowed()) {
+                    logd("location is mock");
+                    bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                    sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle, false);
+                    return;
+                }
+                mAccessControllerMetricsStats.setAccessControlType(
+                        SatelliteConstants.ACCESS_CONTROL_TYPE_CURRENT_LOCATION);
                 checkSatelliteAccessRestrictionForLocation(location);
             } else {
-                checkSatelliteAccessRestrictionUsingCachedCountryCodes();
+                plogd("current location is not available");
+                if (isCommunicationAllowedCacheValid()) {
+                    plogd("onCurrentLocationAvailable: 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_LOCATION_NOT_AVAILABLE, bundle, false);
+                }
             }
         }
     }
@@ -631,28 +1142,46 @@
                     satelliteAllowed = mCachedAccessRestrictionMap.get(locationToken);
                 } else {
                     if (!initSatelliteOnDeviceAccessController()) {
-                        loge("Failed to init SatelliteOnDeviceAccessController");
-                        checkSatelliteAccessRestrictionUsingCachedCountryCodes();
+                        ploge("Failed to init SatelliteOnDeviceAccessController");
+                        Bundle bundle = new Bundle();
+                        bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                        sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+                                false);
                         return;
                     }
                     satelliteAllowed = mSatelliteOnDeviceAccessController
                             .isSatCommunicationAllowedAtLocation(locationToken);
                     updateCachedAccessRestrictionMap(locationToken, satelliteAllowed);
                 }
+                mAccessControllerMetricsStats.setOnDeviceLookupTime(mOnDeviceLookupStartTimeMillis);
                 Bundle bundle = new Bundle();
                 bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, satelliteAllowed);
-                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle);
+                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+                        satelliteAllowed);
+                mLatestSatelliteCommunicationAllowed = satelliteAllowed;
+                mLatestSatelliteCommunicationAllowedSetTime = SystemClock.elapsedRealtimeNanos();
+                persistLatestSatelliteCommunicationAllowedState();
             } catch (Exception ex) {
-                loge("checkSatelliteAccessRestrictionForLocation: ex=" + ex);
+                ploge("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);
+                    plogd("checkSatelliteAccessRestrictionForLocation: cache is still valid, "
+                            + "using it");
+                } else {
+                    bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, false);
+                }
+                sendSatelliteAllowResultToReceivers(SATELLITE_RESULT_SUCCESS, bundle,
+                        mLatestSatelliteCommunicationAllowed);
             }
         }
     }
 
-    private void updateCachedAccessRestrictionMap(@NonNull
-            SatelliteOnDeviceAccessController.LocationToken locationToken,
+    private void updateCachedAccessRestrictionMap(
+            @NonNull SatelliteOnDeviceAccessController.LocationToken locationToken,
             boolean satelliteAllowed) {
         synchronized (mLock) {
             mCachedAccessRestrictionMap.put(locationToken, satelliteAllowed);
@@ -723,7 +1252,8 @@
         return false;
     }
 
-    @Nullable private Location getFreshLastKnownLocation() {
+    @Nullable
+    private Location getFreshLastKnownLocation() {
         Location lastKnownLocation = getLastKnownLocation();
         if (lastKnownLocation != null) {
             long lastKnownLocationAge =
@@ -738,14 +1268,23 @@
     private boolean isInEmergency() {
         // Check if emergency call is ongoing
         if (mTelecomManager.isInEmergencyCall()) {
+            plogd("In emergency call");
             return true;
         }
+
         // Check if the device is in emergency callback mode
         for (Phone phone : PhoneFactory.getPhones()) {
             if (phone.isInEcm()) {
+                plogd("In emergency callback mode");
                 return true;
             }
         }
+
+        // Check if satellite is in emergency mode
+        if (mSatelliteController.isInEmergencyMode()) {
+            plogd("In satellite emergency mode");
+            return true;
+        }
         return false;
     }
 
@@ -759,14 +1298,29 @@
                 result = location;
             }
         }
-        return result;
+
+        if (result == null || isMockModemAllowed()) {
+            return result;
+        }
+
+        return result.isMock() ? null : result;
+    }
+
+    private void initSharedPreferences(@NonNull Context context) {
+        try {
+            mSharedPreferences =
+                    context.getSharedPreferences(SATELLITE_SHARED_PREF, Context.MODE_PRIVATE);
+        } catch (Exception e) {
+            ploge("Cannot get default shared preferences: " + e);
+        }
     }
 
     /**
      * @return {@code true} if successfully initialize the {@link SatelliteOnDeviceAccessController}
      * instance, {@code false} otherwise.
      * @throws IllegalStateException in case of getting any exception in creating the
-     * {@link SatelliteOnDeviceAccessController} instance and the device is using a user build.
+     *                               {@link SatelliteOnDeviceAccessController} instance and the
+     *                               device is using a user build.
      */
     private boolean initSatelliteOnDeviceAccessController() throws IllegalStateException {
         synchronized (mLock) {
@@ -783,9 +1337,9 @@
                         SatelliteOnDeviceAccessController.create(getSatelliteS2CellFile());
                 restartKeepOnDeviceAccessControllerResourcesTimer();
                 mS2Level = mSatelliteOnDeviceAccessController.getS2Level();
-                logd("mS2Level=" + mS2Level);
+                plogd("mS2Level=" + mS2Level);
             } catch (Exception ex) {
-                loge("Got exception in creating an instance of SatelliteOnDeviceAccessController,"
+                ploge("Got exception in creating an instance of SatelliteOnDeviceAccessController,"
                         + " ex=" + ex + ", sat s2 file="
                         + getSatelliteS2CellFile().getAbsolutePath());
                 reportAnomaly(UUID_CREATE_ON_DEVICE_ACCESS_CONTROLLER_EXCEPTION,
@@ -802,13 +1356,13 @@
 
     private void cleanupOnDeviceAccessControllerResources() {
         synchronized (mLock) {
-            logd("cleanupOnDeviceAccessControllerResources="
+            plogd("cleanupOnDeviceAccessControllerResources="
                     + (mSatelliteOnDeviceAccessController != null));
             if (mSatelliteOnDeviceAccessController != null) {
                 try {
                     mSatelliteOnDeviceAccessController.close();
                 } catch (Exception ex) {
-                    loge("cleanupOnDeviceAccessControllerResources: ex=" + ex);
+                    ploge("cleanupOnDeviceAccessControllerResources: ex=" + ex);
                 }
                 mSatelliteOnDeviceAccessController = null;
                 stopKeepOnDeviceAccessControllerResourcesTimer();
@@ -915,7 +1469,7 @@
     private void startWaitForCurrentLocationTimer() {
         synchronized (mLock) {
             if (hasMessages(EVENT_WAIT_FOR_CURRENT_LOCATION_TIMEOUT)) {
-                logw("WaitForCurrentLocationTimer is already started");
+                plogw("WaitForCurrentLocationTimer is already started");
                 removeMessages(EVENT_WAIT_FOR_CURRENT_LOCATION_TIMEOUT);
             }
             sendEmptyMessageDelayed(EVENT_WAIT_FOR_CURRENT_LOCATION_TIMEOUT,
@@ -932,7 +1486,7 @@
     private void restartKeepOnDeviceAccessControllerResourcesTimer() {
         synchronized (mLock) {
             if (hasMessages(EVENT_KEEP_ON_DEVICE_ACCESS_CONTROLLER_RESOURCES_TIMEOUT)) {
-                logd("KeepOnDeviceAccessControllerResourcesTimer is already started. "
+                plogd("KeepOnDeviceAccessControllerResourcesTimer is already started. "
                         + "Restarting it...");
                 removeMessages(EVENT_KEEP_ON_DEVICE_ACCESS_CONTROLLER_RESOURCES_TIMEOUT);
             }
@@ -948,7 +1502,7 @@
     }
 
     private void reportAnomaly(@NonNull String uuid, @NonNull String log) {
-        loge(log);
+        ploge(log);
         AnomalyReporter.reportAnomaly(UUID.fromString(uuid), log);
     }
 
@@ -960,7 +1514,7 @@
     /**
      * Posts the specified command to be executed on the main thread and returns immediately.
      *
-     * @param command command to be executed on the main thread
+     * @param command  command to be executed on the main thread
      * @param argument additional parameters required to perform of the operation
      */
     private void sendRequestAsync(int command, @NonNull Object argument) {
@@ -968,6 +1522,130 @@
         msg.sendToTarget();
     }
 
+    /**
+     * Registers for the satellite communication allowed state changed.
+     *
+     * @param subId    The subId of the subscription to register for the satellite communication
+     *                 allowed state changed.
+     * @param callback The callback to handle the satellite communication allowed state changed
+     *                 event.
+     * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
+     */
+    @SatelliteManager.SatelliteResult
+    public int registerForCommunicationAllowedStateChanged(int subId,
+            @NonNull ISatelliteCommunicationAllowedStateCallback callback) {
+        if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+            plogd("registerForCommunicationAllowedStateChanged: oemEnabledSatelliteFlag is "
+                    + "disabled");
+            return SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
+        }
+
+        mSatelliteCommunicationAllowedStateChangedListeners.put(callback.asBinder(), callback);
+        return SATELLITE_RESULT_SUCCESS;
+    }
+
+    /**
+     * Unregisters for the satellite communication allowed state changed.
+     * If callback was not registered before, the request will be ignored.
+     *
+     * @param subId    The subId of the subscription to unregister for the satellite communication
+     *                 allowed state changed.
+     * @param callback The callback that was passed to
+     *                 {@link #registerForCommunicationAllowedStateChanged(int,
+     *                 ISatelliteCommunicationAllowedStateCallback)}.
+     */
+    public void unregisterForCommunicationAllowedStateChanged(
+            int subId, @NonNull ISatelliteCommunicationAllowedStateCallback callback) {
+        if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+            plogd("unregisterForCommunicationAllowedStateChanged: "
+                    + "oemEnabledSatelliteFlag is disabled");
+            return;
+        }
+
+        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;
+                persistLatestSatelliteCommunicationAllowedState();
+            } else if ("clear_cache_only".equalsIgnoreCase(state)) {
+                mLatestSatelliteCommunicationAllowedSetTime = 0;
+                mLatestSatelliteCommunicationAllowed = false;
+                persistLatestSatelliteCommunicationAllowedState();
+            } else {
+                loge("setIsSatelliteCommunicationAllowedForCurrentLocationCache: invalid state="
+                        + state);
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private void notifySatelliteCommunicationAllowedStateChanged(boolean allowState) {
+        plogd("notifySatelliteCommunicationAllowedStateChanged: allowState=" + allowState);
+
+        List<ISatelliteCommunicationAllowedStateCallback> deadCallersList = new ArrayList<>();
+        mSatelliteCommunicationAllowedStateChangedListeners.values().forEach(listener -> {
+            try {
+                listener.onSatelliteCommunicationAllowedStateChanged(allowState);
+            } catch (RemoteException e) {
+                plogd("handleEventNtnSignalStrengthChanged RemoteException: " + e);
+                deadCallersList.add(listener);
+            }
+        });
+        deadCallersList.forEach(listener -> {
+            mSatelliteCommunicationAllowedStateChangedListeners.remove(listener.asBinder());
+        });
+    }
+
+    private void reportMetrics(int resultCode, boolean allowed) {
+        if (resultCode == SATELLITE_RESULT_SUCCESS) {
+            mControllerMetricsStats.reportAllowedSatelliteAccessCount(allowed);
+        } else {
+            mControllerMetricsStats.reportFailedSatelliteAccessCheckCount();
+        }
+
+        mAccessControllerMetricsStats
+                .setLocationQueryTime(mLocationQueryStartTimeMillis)
+                .setTotalCheckingTime(mTotalCheckingStartTimeMillis)
+                .setIsAllowed(allowed)
+                .setIsEmergency(isInEmergency())
+                .setResult(resultCode)
+                .reportAccessControllerMetrics();
+        mLocationQueryStartTimeMillis = 0;
+        mOnDeviceLookupStartTimeMillis = 0;
+        mTotalCheckingStartTimeMillis = 0;
+    }
+
     private static void logd(@NonNull String log) {
         Rlog.d(TAG, log);
     }
@@ -979,4 +1657,49 @@
     private static void loge(@NonNull String log) {
         Rlog.e(TAG, log);
     }
+
+    private static void logv(@NonNull String log) {
+        Rlog.v(TAG, log);
+    }
+
+    private boolean isSatellitePersistentLoggingEnabled(
+            @NonNull Context context, @NonNull FeatureFlags featureFlags) {
+        if (featureFlags.satellitePersistentLogging()) {
+            return true;
+        }
+        try {
+            return context.getResources().getBoolean(
+                    R.bool.config_dropboxmanager_persistent_logging_enabled);
+        } catch (RuntimeException e) {
+            return false;
+        }
+    }
+
+    private void plogv(@NonNull String log) {
+        Rlog.v(TAG, log);
+        if (mPersistentLogger != null) {
+            mPersistentLogger.debug(TAG, log);
+        }
+    }
+
+    private void plogd(@NonNull String log) {
+        Rlog.d(TAG, log);
+        if (mPersistentLogger != null) {
+            mPersistentLogger.debug(TAG, log);
+        }
+    }
+
+    private void plogw(@NonNull String log) {
+        Rlog.w(TAG, log);
+        if (mPersistentLogger != null) {
+            mPersistentLogger.warn(TAG, log);
+        }
+    }
+
+    private void ploge(@NonNull String log) {
+        Rlog.e(TAG, log);
+        if (mPersistentLogger != null) {
+            mPersistentLogger.error(TAG, log);
+        }
+    }
 }
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java
index c856eb5..6c55709 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApi.java
@@ -32,15 +32,18 @@
  * @hide
  */
 public class SatelliteEntitlementApi {
+    private static final String DEFAULT_APP_NAME = "androidSatmode";
     @NonNull
     private final ServiceEntitlement mServiceEntitlement;
     private final Context mContext;
+    private final PersistableBundle mCarrierConfig;
 
     public SatelliteEntitlementApi(@NonNull Context context,
             @NonNull PersistableBundle carrierConfig, @NonNull int subId) {
         mContext = context;
         mServiceEntitlement = new ServiceEntitlement(mContext,
                 getCarrierConfigFromEntitlementServerUrl(carrierConfig), subId);
+        mCarrierConfig = carrierConfig;
     }
 
     /**
@@ -50,6 +53,7 @@
     public SatelliteEntitlementResult checkEntitlementStatus() throws ServiceEntitlementException {
         ServiceEntitlementRequest.Builder requestBuilder = ServiceEntitlementRequest.builder();
         requestBuilder.setAcceptContentType(ServiceEntitlementRequest.ACCEPT_CONTENT_TYPE_JSON);
+        requestBuilder.setAppName(getSatelliteEntitlementAppName(mCarrierConfig));
         ServiceEntitlementRequest request = requestBuilder.build();
 
         String response = mServiceEntitlement.queryEntitlementStatus(
@@ -57,7 +61,8 @@
         SatelliteEntitlementResponse satelliteEntitlementResponse =
                 new SatelliteEntitlementResponse(response);
         return new SatelliteEntitlementResult(satelliteEntitlementResponse.getEntitlementStatus(),
-                satelliteEntitlementResponse.getPlmnAllowed());
+                satelliteEntitlementResponse.getPlmnAllowed(),
+                satelliteEntitlementResponse.getPlmnBarredList());
     }
 
     @NonNull
@@ -68,4 +73,10 @@
                 "");
         return CarrierConfig.builder().setServerUrl(entitlementServiceUrl).build();
     }
+
+    @NonNull
+    private String getSatelliteEntitlementAppName(@NonNull PersistableBundle carrierConfig) {
+        return carrierConfig.getString(
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_APP_NAME_STRING, DEFAULT_APP_NAME);
+    }
 }
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
index 94362a0..307d1e6 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
@@ -16,8 +16,6 @@
 
 package com.android.phone.satellite.entitlement;
 
-import static com.android.phone.satellite.entitlement.SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_ENABLED;
-
 import static java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME;
 import static java.time.temporal.ChronoUnit.SECONDS;
 
@@ -40,15 +38,19 @@
 import android.telephony.SubscriptionManager;
 
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.ExponentialBackoff;
 import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.satellite.SatelliteConstants;
 import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.internal.telephony.satellite.metrics.EntitlementMetricsStats;
 import com.android.internal.telephony.subscription.SubscriptionManagerService;
 import com.android.libraries.entitlement.ServiceEntitlementException;
 
 import java.time.Instant;
 import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -65,7 +67,7 @@
     /** Message code used in handleMessage() */
     private static final int CMD_START_QUERY_ENTITLEMENT = 1;
     private static final int CMD_RETRY_QUERY_ENTITLEMENT = 2;
-    private static final int CMD_STOP_RETRY_QUERY_ENTITLEMENT = 3;
+    private static final int CMD_SIM_REFRESH = 3;
 
     /** Retry on next trigger event. */
     private static final int HTTP_RESPONSE_500 = 500;
@@ -74,7 +76,7 @@
     private static final int HTTP_RESPONSE_503 = 503;
     /** Default query refresh time is 1 month. */
 
-    private static final int DEFAULT_QUERY_REFRESH_DAYS = 30;
+    private static final int DEFAULT_QUERY_REFRESH_DAYS = 7;
     private static final long INITIAL_DELAY_MILLIS = TimeUnit.MINUTES.toMillis(10); // 10 min
     private static final long MAX_DELAY_MILLIS = TimeUnit.DAYS.toMillis(5); // 5 days
     private static final int MULTIPLIER = 2;
@@ -89,15 +91,26 @@
     @NonNull private final Context mContext;
     private final Object mLock = new Object();
     /** Map key : subId, value : ExponentialBackoff. */
+    @GuardedBy("mLock")
     private Map<Integer, ExponentialBackoff> mExponentialBackoffPerSub = new HashMap<>();
     /** Map key : subId, value : SatelliteEntitlementResult. */
+    @GuardedBy("mLock")
     private Map<Integer, SatelliteEntitlementResult> mSatelliteEntitlementResultPerSub =
             new HashMap<>();
     /** Map key : subId, value : the last query time to millis. */
+    @GuardedBy("mLock")
     private Map<Integer, Long> mLastQueryTimePerSub = new HashMap<>();
     /** Map key : subId, value : Count the number of retries caused by the 'ExponentialBackoff' and
      * '503 error case with the Retry-After header'. */
+    @GuardedBy("mLock")
     private Map<Integer, Integer> mRetryCountPerSub = new HashMap<>();
+    /** Map key : subId, value : Whether query is in progress. */
+    @GuardedBy("mLock")
+    private Map<Integer, Boolean> mIsEntitlementInProgressPerSub = new HashMap<>();
+    /** Map key : slotId, value : The last used subId. */
+    @GuardedBy("mLock")
+    private Map<Integer, Integer> mSubIdPerSlot = new HashMap<>();
+    @NonNull private final EntitlementMetricsStats mEntitlementMetricsStats;
 
     /**
      * Create the SatelliteEntitlementController singleton instance.
@@ -140,11 +153,6 @@
             public void onAvailable(Network network) {
                 handleInternetConnected();
             }
-
-            @Override
-            public void onLost(Network network) {
-                handleInternetDisconnected();
-            }
         };
         NetworkRequest networkrequest = new NetworkRequest.Builder()
                 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
@@ -153,6 +161,8 @@
         IntentFilter intentFilter = new IntentFilter();
         intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
         context.registerReceiver(mReceiver, intentFilter);
+        mEntitlementMetricsStats = EntitlementMetricsStats.getOrCreateInstance();
+        SatelliteController.getInstance().registerIccRefresh(this, CMD_SIM_REFRESH);
     }
 
     @Override
@@ -164,8 +174,8 @@
             case CMD_RETRY_QUERY_ENTITLEMENT:
                 handleCmdRetryQueryEntitlement(msg.arg1);
                 break;
-            case CMD_STOP_RETRY_QUERY_ENTITLEMENT:
-                stopExponentialBackoff(msg.arg1);
+            case CMD_SIM_REFRESH:
+                handleSimRefresh();
                 break;
             default:
                 logd("do not used this message");
@@ -174,14 +184,35 @@
 
     private void handleCarrierConfigChanged(int slotIndex, int subId, int carrierId,
             int specificCarrierId) {
-        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            return;
-        }
         logd("handleCarrierConfigChanged(): slotIndex(" + slotIndex + "), subId("
                 + subId + "), carrierId(" + carrierId + "), specificCarrierId("
                 + specificCarrierId + ")");
+        processSimChanged(slotIndex, subId);
+        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+            return;
+        }
 
         sendEmptyMessage(CMD_START_QUERY_ENTITLEMENT);
+        synchronized (mLock) {
+            mSubIdPerSlot.put(slotIndex, subId);
+        }
+    }
+
+    // When SIM is removed or changed, then reset the previous subId's retry related objects.
+    private void processSimChanged(int slotIndex, int subId) {
+        int previousSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        synchronized (mLock) {
+            previousSubId = mSubIdPerSlot.getOrDefault(slotIndex,
+                    SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        }
+        logd("processSimChanged prev subId:" + previousSubId);
+        if (previousSubId != subId) {
+            synchronized (mLock) {
+                mSubIdPerSlot.remove(slotIndex);
+            }
+            logd("processSimChanged resetEntitlementQueryPerSubId");
+            resetEntitlementQueryPerSubId(previousSubId);
+        }
     }
 
     private class SatelliteEntitlementControllerReceiver extends BroadcastReceiver {
@@ -201,6 +232,12 @@
         }
     }
 
+    private void handleSimRefresh() {
+        resetEntitlementQueryCounts(cmdToString(CMD_SIM_REFRESH));
+        sendMessageDelayed(obtainMessage(CMD_START_QUERY_ENTITLEMENT),
+                TimeUnit.SECONDS.toMillis(10));
+    }
+
     private boolean isInternetConnected() {
         Network activeNetwork = mConnectivityManager.getActiveNetwork();
         NetworkCapabilities networkCapabilities =
@@ -214,15 +251,6 @@
         sendEmptyMessage(CMD_START_QUERY_ENTITLEMENT);
     }
 
-    private void handleInternetDisconnected() {
-        mExponentialBackoffPerSub.forEach((key, value) -> {
-            Message message = obtainMessage();
-            message.what = CMD_STOP_RETRY_QUERY_ENTITLEMENT;
-            message.arg1 = key;
-            sendMessage(message);
-        });
-    }
-
     /**
      * Check if the device can request to entitlement server (if there is an internet connection and
      * if the throttle time has passed since the last request), and then pass the response to
@@ -230,34 +258,48 @@
      */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
     public void handleCmdStartQueryEntitlement() {
-        if (!isInternetConnected()) {
-            logd("Internet disconnected");
-            return;
-        }
-
         for (int subId : mSubscriptionManagerService.getActiveSubIdList(true)) {
-            if (!shouldQueryEntitlement(subId)) {
-                return;
+            if (!shouldStartQueryEntitlement(subId)) {
+                continue;
             }
 
             // Check the satellite service query result from the entitlement server for the
             // satellite service.
             try {
-                mSatelliteEntitlementResultPerSub.remove(subId);
-                mSatelliteEntitlementResultPerSub.put(subId, getSatelliteEntitlementApi(
-                        subId).checkEntitlementStatus());
+                synchronized (mLock) {
+                    mIsEntitlementInProgressPerSub.put(subId, true);
+                    SatelliteEntitlementResult entitlementResult =  getSatelliteEntitlementApi(
+                            subId).checkEntitlementStatus();
+                    mSatelliteEntitlementResultPerSub.put(subId, entitlementResult);
+                    mEntitlementMetricsStats.reportSuccess(subId,
+                            getEntitlementStatus(entitlementResult), false);
+                }
             } catch (ServiceEntitlementException e) {
                 loge(e.toString());
+                mEntitlementMetricsStats.reportError(subId, e.getErrorCode(), false);
                 if (!isInternetConnected()) {
-                    logd("handleCmdStartQueryEntitlement: disconnected. " + e);
+                    logd("StartQuery: disconnected. " + e);
+                    synchronized (mLock) {
+                        mIsEntitlementInProgressPerSub.remove(subId);
+                    }
                     return;
                 }
-                if (shouldHandleErrorResponse(e, subId)) {
-                    logd("handleCmdStartQueryEntitlement: handle response.");
-                    return;
+                if (isPermanentError(e)) {
+                    logd("StartQuery: shouldPermanentError.");
+                    queryCompleted(subId);
+                    continue;
+                } else if (isRetryAfterError(e)) {
+                    long retryAfterSeconds = parseSecondsFromRetryAfter(e.getRetryAfter());
+                    logd("StartQuery: next retry will be in " + TimeUnit.SECONDS.toMillis(
+                            retryAfterSeconds) + " sec");
+                    sendMessageDelayed(obtainMessage(CMD_RETRY_QUERY_ENTITLEMENT, subId, 0),
+                            TimeUnit.SECONDS.toMillis(retryAfterSeconds));
+                    stopExponentialBackoff(subId);
+                    continue;
+                } else {
+                    startExponentialBackoff(subId);
+                    continue;
                 }
-                startExponentialBackoff(subId);
-                return;
             }
             queryCompleted(subId);
         }
@@ -267,9 +309,12 @@
      * query. */
     private void resetEntitlementQueryCounts(String event) {
         logd("resetEntitlementQueryCounts: " + event);
-        mLastQueryTimePerSub = new HashMap<>();
-        mExponentialBackoffPerSub = new HashMap<>();
-        mRetryCountPerSub = new HashMap<>();
+        synchronized (mLock) {
+            mLastQueryTimePerSub = new HashMap<>();
+            mExponentialBackoffPerSub = new HashMap<>();
+            mRetryCountPerSub = new HashMap<>();
+            mIsEntitlementInProgressPerSub = new HashMap<>();
+        }
     }
 
     /**
@@ -283,65 +328,83 @@
      * MAX_RETRY_COUNT is reached using the ExponentialBackoff.
      */
     private void handleCmdRetryQueryEntitlement(int subId) {
-        logd("handleCmdRetryQueryEntitlement: " + subId);
+        if (!shouldRetryQueryEntitlement(subId)) {
+            return;
+        }
         try {
             synchronized (mLock) {
-                mSatelliteEntitlementResultPerSub.put(subId, getSatelliteEntitlementApi(
-                        subId).checkEntitlementStatus());
+                int currentRetryCount = getRetryCount(subId);
+                mRetryCountPerSub.put(subId, currentRetryCount + 1);
+                logd("[" + subId + "] retry cnt:" + getRetryCount(subId));
+                SatelliteEntitlementResult entitlementResult =  getSatelliteEntitlementApi(
+                        subId).checkEntitlementStatus();
+                mSatelliteEntitlementResultPerSub.put(subId, entitlementResult);
+                mEntitlementMetricsStats.reportSuccess(subId,
+                        getEntitlementStatus(entitlementResult), true);
             }
         } catch (ServiceEntitlementException e) {
+            loge(e.toString());
+            mEntitlementMetricsStats.reportError(subId, e.getErrorCode(), true);
+            if (!isRetryAvailable(subId)) {
+                logd("retryQuery: unavailable.");
+                queryCompleted(subId);
+                return;
+            }
             if (!isInternetConnected()) {
-                logd("retryQuery: Internet disconnected. reset the retry and after the "
-                        + "internet is connected then the first query is triggered." + e);
+                logd("retryQuery: Internet disconnected.");
                 stopExponentialBackoff(subId);
+                synchronized (mLock) {
+                    mIsEntitlementInProgressPerSub.remove(subId);
+                }
                 return;
             }
-            if (shouldHandleErrorResponse(e, subId)) {
-                logd("retryQuery: handle response.");
+            if (isPermanentError(e)) {
+                logd("retryQuery: shouldPermanentError.");
+                queryCompleted(subId);
+                return;
+            } else if (isRetryAfterError(e)) {
+                long retryAfterSeconds = parseSecondsFromRetryAfter(e.getRetryAfter());
+                logd("retryQuery: next retry will be in " + TimeUnit.SECONDS.toMillis(
+                        retryAfterSeconds) + " sec");
+                sendMessageDelayed(obtainMessage(CMD_RETRY_QUERY_ENTITLEMENT, subId, 0),
+                        TimeUnit.SECONDS.toMillis(retryAfterSeconds));
                 stopExponentialBackoff(subId);
                 return;
+            } else {
+                ExponentialBackoff exponentialBackoff = null;
+                synchronized (mLock) {
+                    exponentialBackoff = mExponentialBackoffPerSub.get(subId);
+                }
+                if (exponentialBackoff == null) {
+                    startExponentialBackoff(subId);
+                } else {
+                    exponentialBackoff.notifyFailed();
+                    logd("retryQuery: The next retry will be in "
+                            + exponentialBackoff.getCurrentDelay() + " ms.");
+                }
+                return;
             }
-            mExponentialBackoffPerSub.get(subId).notifyFailed();
-            mRetryCountPerSub.put(subId,
-                    mRetryCountPerSub.getOrDefault(subId, 0) + 1);
-            logd("handleCmdRetryQueryEntitlement:" + e + "[" + subId + "] cnt="
-                    + mRetryCountPerSub.getOrDefault(subId, 0) + "] Retrying in "
-                    + mExponentialBackoffPerSub.get(subId).getCurrentDelay() + " ms.");
         }
+        queryCompleted(subId);
     }
 
-    /** Only handle '500' and '503 with retry-after header' error responses received.
-     * If the 500 response is received, no retry until the next trigger event occurs.
-     * If the 503 response with Retry-After header, retry is attempted according to the value in the
-     * Retry-After header up to MAX_RETRY_COUNT.
-     * In other cases, it performs an exponential backoff process. */
-    private boolean shouldHandleErrorResponse(ServiceEntitlementException e, int subId) {
+    // If the 500 response is received, no retry until the next trigger event occurs.
+    private boolean isPermanentError(ServiceEntitlementException e) {
+        return e.getHttpStatus() == HTTP_RESPONSE_500;
+    }
+
+    /** If the 503 response with Retry-After header, retry is attempted according to the value in
+     * the Retry-After header up to MAX_RETRY_COUNT. */
+    private boolean isRetryAfterError(ServiceEntitlementException e) {
         int responseCode = e.getHttpStatus();
-        logd("shouldHandleErrorResponse: received the " + responseCode);
+        logd("shouldRetryAfterError: received the " + responseCode);
         if (responseCode == HTTP_RESPONSE_503 && e.getRetryAfter() != null
                 && !e.getRetryAfter().isEmpty()) {
-            if (mRetryCountPerSub.getOrDefault(subId, 0) >= MAX_RETRY_COUNT) {
-                logd("The 503 retry after reaching the " + MAX_RETRY_COUNT
-                        + "The retry will not be attempted until the next trigger event.");
-                queryCompleted(subId);
-                return true;
-            }
             long retryAfterSeconds = parseSecondsFromRetryAfter(e.getRetryAfter());
             if (retryAfterSeconds == -1) {
                 logd("Unable parsing the retry-after. try to exponential backoff.");
                 return false;
             }
-            mRetryCountPerSub.put(subId, mRetryCountPerSub.getOrDefault(subId, 0) + 1);
-            logd("[" + subId + "] cnt=" + mRetryCountPerSub.getOrDefault(subId, 0)
-                    + " Retrying in " + TimeUnit.SECONDS.toMillis(retryAfterSeconds) + " sec");
-            Message message = obtainMessage();
-            message.what = CMD_RETRY_QUERY_ENTITLEMENT;
-            message.arg1 = subId;
-            sendMessageDelayed(message, TimeUnit.SECONDS.toMillis(retryAfterSeconds));
-            return true;
-        } else if (responseCode == HTTP_RESPONSE_500) {
-            logd("The retry on the next trigger event.");
-            queryCompleted(subId);
             return true;
         }
         return false;
@@ -364,46 +427,34 @@
     }
 
     private void startExponentialBackoff(int subId) {
+        ExponentialBackoff exponentialBackoff = null;
         stopExponentialBackoff(subId);
-        mExponentialBackoffPerSub.put(subId,
-                new ExponentialBackoff(INITIAL_DELAY_MILLIS, MAX_DELAY_MILLIS,
-                        MULTIPLIER, this.getLooper(), () -> {
-                    synchronized (mLock) {
-                        if (mSatelliteEntitlementResultPerSub.containsKey(subId)) {
-                            logd("handleCmdStartQueryEntitlement: get the response "
-                                    + "successfully.");
-                            mExponentialBackoffPerSub.get(subId).stop();
-                            queryCompleted(subId);
-                            return;
+        synchronized (mLock) {
+            mExponentialBackoffPerSub.put(subId,
+                    new ExponentialBackoff(INITIAL_DELAY_MILLIS, MAX_DELAY_MILLIS,
+                            MULTIPLIER, this.getLooper(), () -> {
+                        synchronized (mLock) {
+                            sendMessage(obtainMessage(CMD_RETRY_QUERY_ENTITLEMENT, subId, 0));
                         }
-
-                        if (mRetryCountPerSub.getOrDefault(subId, 0) >= MAX_RETRY_COUNT) {
-                            logd("The ExponentialBackoff is  stopped after reaching the "
-                                    + MAX_RETRY_COUNT + ". The retry don't attempted until the"
-                                    + " refresh time expires.");
-                            mExponentialBackoffPerSub.get(subId).stop();
-                            queryCompleted(subId);
-                            return;
-                        }
-                        if (!mSatelliteEntitlementResultPerSub.containsKey(subId)) {
-                            handleCmdRetryQueryEntitlement(subId);
-                        }
-                    }
-                }));
-        mExponentialBackoffPerSub.get(subId).start();
-        mRetryCountPerSub.put(subId, mRetryCountPerSub.getOrDefault(subId, 0) + 1);
-        logd("start ExponentialBackoff [" + mRetryCountPerSub.getOrDefault(subId, 0)
-                + "] Retrying in " + mExponentialBackoffPerSub.get(subId).getCurrentDelay()
-                + " ms.");
+                    }));
+            exponentialBackoff = mExponentialBackoffPerSub.get(subId);
+        }
+        if (exponentialBackoff != null) {
+            exponentialBackoff.start();
+            logd("start ExponentialBackoff, cnt: " + getRetryCount(subId) + ". Retrying in "
+                    + exponentialBackoff.getCurrentDelay() + " ms.");
+        }
     }
 
     /** If the Internet connection is lost during the ExponentialBackoff, stop the
      * ExponentialBackoff and reset it. */
     private void stopExponentialBackoff(int subId) {
-        if (isExponentialBackoffInProgress(subId)) {
-            logd("stopExponentialBackoff: reset ExponentialBackoff");
-            mExponentialBackoffPerSub.get(subId).stop();
-            mExponentialBackoffPerSub.remove(subId);
+        synchronized (mLock) {
+            if (mExponentialBackoffPerSub.get(subId) != null) {
+                logd("stopExponentialBackoff: reset ExponentialBackoff");
+                mExponentialBackoffPerSub.get(subId).stop();
+                mExponentialBackoffPerSub.remove(subId);
+            }
         }
     }
 
@@ -413,10 +464,18 @@
      * And then it send a delayed message to trigger the query again after A refresh day has passed.
      */
     private void queryCompleted(int subId) {
-        if (!mSatelliteEntitlementResultPerSub.containsKey(subId)) {
-            logd("queryCompleted: create default SatelliteEntitlementResult");
-            mSatelliteEntitlementResultPerSub.put(subId,
-                    SatelliteEntitlementResult.getDefaultResult());
+        SatelliteEntitlementResult entitlementResult;
+        synchronized (mLock) {
+            if (!mSatelliteEntitlementResultPerSub.containsKey(subId)) {
+                logd("queryCompleted: create default SatelliteEntitlementResult");
+                mSatelliteEntitlementResultPerSub.put(subId,
+                        SatelliteEntitlementResult.getDefaultResult());
+            }
+            entitlementResult = mSatelliteEntitlementResultPerSub.get(subId);
+            stopExponentialBackoff(subId);
+            mIsEntitlementInProgressPerSub.remove(subId);
+            logd("reset retry count for refresh query");
+            mRetryCountPerSub.remove(subId);
         }
 
         saveLastQueryTime(subId);
@@ -426,35 +485,80 @@
         sendMessageDelayed(message, TimeUnit.DAYS.toMillis(
                 getSatelliteEntitlementStatusRefreshDays(subId)));
         logd("queryCompleted: updateSatelliteEntitlementStatus");
-        updateSatelliteEntitlementStatus(subId,
-                mSatelliteEntitlementResultPerSub.get(subId).getEntitlementStatus()
-                        == SATELLITE_ENTITLEMENT_STATUS_ENABLED,
-                mSatelliteEntitlementResultPerSub.get(subId).getAllowedPLMNList());
-        stopExponentialBackoff(subId);
-        mRetryCountPerSub.remove(subId);
+        updateSatelliteEntitlementStatus(subId, entitlementResult.getEntitlementStatus() ==
+                        SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_ENABLED,
+                entitlementResult.getAllowedPLMNList(), entitlementResult.getBarredPLMNList());
     }
 
-    /** Check whether there is a saved subId. Returns true if there is a saved subId,
-     * otherwise return false.*/
-    private boolean isExponentialBackoffInProgress(int subId) {
-        return mExponentialBackoffPerSub.containsKey(subId);
+    private boolean shouldStartQueryEntitlement(int subId) {
+        logd("shouldStartQueryEntitlement " + subId);
+        if (!shouldRetryQueryEntitlement(subId)) {
+            return false;
+        }
+
+        synchronized (mLock) {
+            if (mIsEntitlementInProgressPerSub.getOrDefault(subId, false)) {
+                logd("In progress retry");
+                return false;
+            }
+        }
+        return true;
     }
 
-    /**
-     * Check if the subId can query the entitlement server to get the satellite configuration.
-     */
-    private boolean shouldQueryEntitlement(int subId) {
+    private boolean shouldRetryQueryEntitlement(int subId) {
         if (!isSatelliteEntitlementSupported(subId)) {
             logd("Doesn't support entitlement query for satellite.");
+            resetSatelliteEntitlementRestrictedReason(subId);
             return false;
         }
 
-        if (isExponentialBackoffInProgress(subId)) {
-            logd("In progress ExponentialBackoff.");
+        if (!isInternetConnected()) {
+            stopExponentialBackoff(subId);
+            synchronized (mLock) {
+                mIsEntitlementInProgressPerSub.remove(subId);
+            }
+            logd("Internet disconnected");
             return false;
         }
 
-        return shouldRefreshEntitlementStatus(subId);
+        if (!shouldRefreshEntitlementStatus(subId)) {
+            return false;
+        }
+
+        return isRetryAvailable(subId);
+    }
+
+    // update for removing the satellite entitlement restricted reason
+    private void resetSatelliteEntitlementRestrictedReason(int subId) {
+        SatelliteEntitlementResult previousResult;
+        SatelliteEntitlementResult enabledResult = new SatelliteEntitlementResult(
+                SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_ENABLED,
+                new ArrayList<>(), new ArrayList<>());
+        synchronized (mLock) {
+            previousResult = mSatelliteEntitlementResultPerSub.get(subId);
+        }
+        if (previousResult != null && previousResult.getEntitlementStatus()
+                != SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_ENABLED) {
+            logd("set enabled status for removing satellite entitlement restricted reason");
+            synchronized (mLock) {
+                mSatelliteEntitlementResultPerSub.put(subId, enabledResult);
+            }
+            updateSatelliteEntitlementStatus(subId, true, enabledResult.getAllowedPLMNList(),
+                    enabledResult.getBarredPLMNList());
+        }
+        resetEntitlementQueryPerSubId(subId);
+    }
+
+    private void resetEntitlementQueryPerSubId(int subId) {
+        logd("resetEntitlementQueryPerSubId: " + subId);
+        stopExponentialBackoff(subId);
+        synchronized (mLock) {
+            mLastQueryTimePerSub.remove(subId);
+            mRetryCountPerSub.remove(subId);
+            mIsEntitlementInProgressPerSub.remove(subId);
+        }
+        removeMessages(CMD_RETRY_QUERY_ENTITLEMENT,
+                obtainMessage(CMD_RETRY_QUERY_ENTITLEMENT, subId, 0));
     }
 
     /**
@@ -488,7 +592,9 @@
     /** If there is a value stored in the cache, it is used. If there is no value stored in the
      * cache, it is considered the first query. */
     private long getLastQueryTime(int subId) {
-        return mLastQueryTimePerSub.getOrDefault(subId, 0L);
+        synchronized (mLock) {
+            return mLastQueryTimePerSub.getOrDefault(subId, 0L);
+        }
     }
 
     /** Return the satellite entitlement status refresh days from carrier config. */
@@ -498,6 +604,14 @@
                 DEFAULT_QUERY_REFRESH_DAYS);
     }
 
+    private boolean isRetryAvailable(int subId) {
+        if (getRetryCount(subId) >= MAX_RETRY_COUNT) {
+            logd("The retry will not be attempted until the next trigger event.");
+            return false;
+        }
+        return true;
+    }
+
     /** Return the satellite entitlement supported bool from carrier config. */
     private boolean isSatelliteEntitlementSupported(int subId) {
         return getConfigForSubId(subId).getBoolean(
@@ -509,7 +623,8 @@
         PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId,
                 CarrierConfigManager.ImsServiceEntitlement.KEY_ENTITLEMENT_SERVER_URL_STRING,
                 CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT,
-                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL);
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL,
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_APP_NAME_STRING);
         if (config == null || config.isEmpty()) {
             config = CarrierConfigManager.getDefaultConfig();
         }
@@ -518,7 +633,15 @@
 
     private void saveLastQueryTime(int subId) {
         long lastQueryTimeMillis = System.currentTimeMillis();
-        mLastQueryTimePerSub.put(subId, lastQueryTimeMillis);
+        synchronized (mLock) {
+            mLastQueryTimePerSub.put(subId, lastQueryTimeMillis);
+        }
+    }
+
+    private int getRetryCount(int subId) {
+        synchronized (mLock) {
+            return mRetryCountPerSub.getOrDefault(subId, 0);
+        }
     }
 
     /**
@@ -527,9 +650,34 @@
      */
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
     public void updateSatelliteEntitlementStatus(int subId, boolean enabled,
-            List<String> plmnAllowedList) {
+            List<String> plmnAllowedList, List<String> plmnBarredList) {
         SatelliteController.getInstance().onSatelliteEntitlementStatusUpdated(subId, enabled,
-                plmnAllowedList, null);
+                plmnAllowedList, plmnBarredList, null);
+    }
+
+    private @SatelliteConstants.SatelliteEntitlementStatus int getEntitlementStatus(
+            SatelliteEntitlementResult entitlementResult) {
+        switch (entitlementResult.getEntitlementStatus()) {
+            case SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_DISABLED:
+                return SatelliteConstants.SATELLITE_ENTITLEMENT_STATUS_DISABLED;
+            case SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_ENABLED:
+                return SatelliteConstants.SATELLITE_ENTITLEMENT_STATUS_ENABLED;
+            case SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_INCOMPATIBLE:
+                return SatelliteConstants.SATELLITE_ENTITLEMENT_STATUS_INCOMPATIBLE;
+            case SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_PROVISIONING:
+                return SatelliteConstants.SATELLITE_ENTITLEMENT_STATUS_PROVISIONING;
+            default:
+                return SatelliteConstants.SATELLITE_ENTITLEMENT_STATUS_UNKNOWN;
+        }
+    }
+
+    private static String cmdToString(int cmd) {
+        switch (cmd) {
+            case CMD_SIM_REFRESH:
+                return "SIM_REFRESH";
+            default:
+                return "UNKNOWN(" + cmd + ")";
+        }
     }
 
     private static void logd(String log) {
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java
index 1fe0ecf..97cb355 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponse.java
@@ -18,6 +18,7 @@
 
 import static com.android.phone.satellite.entitlement.SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_DISABLED;
 
+import android.text.TextUtils;
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -70,7 +71,9 @@
         mEntitlementStatus = SATELLITE_ENTITLEMENT_STATUS_DISABLED;
         mPlmnAllowedList = new ArrayList<>();
         mPlmnBarredList = new ArrayList<>();
-        parsingResponse(response);
+        if (!TextUtils.isEmpty(response)) {
+            parsingResponse(response);
+        }
     }
 
     /**
@@ -94,7 +97,6 @@
      * Get the PLMNBarredList from the response
      * @return The PLMNs Barred List
      */
-    @VisibleForTesting
     public List<String> getPlmnBarredList() {
         return mPlmnBarredList.stream().map(String::new).collect(Collectors.toList());
     }
@@ -123,15 +125,21 @@
                 for (int i = 0; i < jsonArray.length(); i++) {
                     String dataPlanType = jsonArray.getJSONObject(i).has(DATA_PLAN_TYPE_KEY)
                             ? jsonArray.getJSONObject(i).getString(DATA_PLAN_TYPE_KEY) : "";
-                    mPlmnAllowedList.add(new SatelliteNetworkInfo(
-                            jsonArray.getJSONObject(i).getString(PLMN_KEY), dataPlanType));
+                    String plmn = jsonArray.getJSONObject(i).getString(PLMN_KEY);
+                    logd("parsingResponse: plmn=" + plmn + " dataplan=" + dataPlanType);
+                    if (!TextUtils.isEmpty(plmn)) {
+                        mPlmnAllowedList.add(new SatelliteNetworkInfo(plmn, dataPlanType));
+                    }
                 }
             }
             if (jsonToken.has(PLMN_BARRED_KEY)) {
                 mPlmnBarredList = new ArrayList<>();
                 JSONArray jsonArray = jsonToken.getJSONArray(PLMN_BARRED_KEY);
                 for (int i = 0; i < jsonArray.length(); i++) {
-                    mPlmnBarredList.add(jsonArray.getJSONObject(i).getString(PLMN_KEY));
+                    String plmn = jsonArray.getJSONObject(i).getString(PLMN_KEY);
+                    if (!TextUtils.isEmpty(plmn)) {
+                        mPlmnBarredList.add(plmn);
+                    }
                 }
             }
         } catch (JSONException e) {
@@ -141,6 +149,10 @@
         }
     }
 
+    private static void logd(String log) {
+        Log.d(TAG, log);
+    }
+
     private static void loge(String log) {
         Log.e(TAG, log);
     }
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java
index 3289232..014e28e 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResult.java
@@ -53,17 +53,25 @@
      * item of the satellite configuration received from the entitlement server.
      */
     private List<SatelliteNetworkInfo> mAllowedSatelliteNetworkInfoList;
+    /**
+     * List consisting of the PLMN in the PLMNBarred item of the satellite configuration received
+     * from the entitlement server
+     */
+    private List<String> mBarredPlmnList;
 
     /**
      * Store the result of the satellite entitlement response.
      *
      * @param entitlementStatus The entitlement status.
      * @param allowedSatelliteNetworkInfoList The allowedSatelliteNetworkInfoList
+     * @param barredPlmnList The barred plmn list
      */
     public SatelliteEntitlementResult(@SatelliteEntitlementStatus int entitlementStatus,
-            List<SatelliteNetworkInfo> allowedSatelliteNetworkInfoList) {
+            List<SatelliteNetworkInfo> allowedSatelliteNetworkInfoList,
+            List<String> barredPlmnList) {
         mEntitlementStatus = entitlementStatus;
         mAllowedSatelliteNetworkInfoList = allowedSatelliteNetworkInfoList;
+        mBarredPlmnList = barredPlmnList;
     }
 
     /**
@@ -86,6 +94,15 @@
     }
 
     /**
+     * Get the plmn barred list
+     *
+     * @return The plmn barred list.
+     */
+    public List<String> getBarredPLMNList() {
+        return mBarredPlmnList.stream().map(String::new).collect(Collectors.toList());
+    }
+
+    /**
      * Get the default SatelliteEntitlementResult. EntitlementStatus set to
      * `SATELLITE_ENTITLEMENT_STATUS_DISABLED` and SatelliteNetworkInfo list set to empty.
      *
@@ -93,6 +110,6 @@
      */
     public static SatelliteEntitlementResult getDefaultResult() {
         return new SatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_DISABLED,
-                new ArrayList<>());
+                new ArrayList<>(), new ArrayList<>());
     }
 }
diff --git a/src/com/android/phone/settings/PhoneAccountSettingsActivity.java b/src/com/android/phone/settings/PhoneAccountSettingsActivity.java
index 12cc667..5617a0b 100644
--- a/src/com/android/phone/settings/PhoneAccountSettingsActivity.java
+++ b/src/com/android/phone/settings/PhoneAccountSettingsActivity.java
@@ -20,12 +20,15 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.preference.PreferenceActivity;
+import android.util.Log;
 import android.view.MenuItem;
 import android.widget.Toast;
 
+import com.android.internal.telephony.flags.Flags;
 import com.android.phone.R;
 
 public class PhoneAccountSettingsActivity extends PreferenceActivity {
+    private static final String LOG_TAG = "PhoneAccountSettingsActivity";
 
     @Override
     protected void onCreate(Bundle icicle) {
@@ -40,6 +43,17 @@
             return;
         }
 
+        // Make sure mobile network configs are not restricted.
+        if (Flags.ensureAccessToCallSettingsIsRestricted() &&
+                userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
+            Log.i(LOG_TAG, "Mobile network configs are restricted, disabling phone account "
+                    + "settings");
+            Toast.makeText(this, R.string.phone_account_no_config_mobile_networks,
+                    Toast.LENGTH_SHORT).show();
+            finish();
+            return;
+        }
+
         getWindow().addSystemFlags(
                 android.view.WindowManager.LayoutParams
                         .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index f3158e6..c59f92a 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -58,6 +58,7 @@
 import android.telephony.CellInfoLte;
 import android.telephony.CellInfoNr;
 import android.telephony.CellInfoWcdma;
+import android.telephony.CellSignalStrength;
 import android.telephony.CellSignalStrengthCdma;
 import android.telephony.CellSignalStrengthGsm;
 import android.telephony.CellSignalStrengthLte;
@@ -74,6 +75,7 @@
 import android.telephony.TelephonyDisplayInfo;
 import android.telephony.TelephonyManager;
 import android.telephony.data.NetworkSlicingConfig;
+import android.telephony.euicc.EuiccManager;
 import android.telephony.ims.ImsException;
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsMmTelManager;
@@ -110,6 +112,7 @@
 import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -129,6 +132,9 @@
 
     private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
 
+    private static final String ACTION_ESOS_TEST =
+            "com.google.android.apps.stargate.ACTION_ESOS_QUESTIONNAIRE";
+
     private static final String[] PREFERRED_NETWORK_LABELS = {
             "GSM/WCDMA preferred",
             "GSM only",
@@ -167,6 +173,36 @@
             "Unknown"
     };
 
+    private static final Integer[] SIGNAL_STRENGTH_LEVEL = new Integer[] {
+            -1 /*clear mock*/,
+            CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN,
+            CellSignalStrength.SIGNAL_STRENGTH_POOR,
+            CellSignalStrength.SIGNAL_STRENGTH_MODERATE,
+            CellSignalStrength.SIGNAL_STRENGTH_GOOD,
+            CellSignalStrength.SIGNAL_STRENGTH_GREAT
+    };
+    private static final Integer[] MOCK_DATA_NETWORK_TYPE = new Integer[] {
+            -1 /*clear mock*/,
+            ServiceState.RIL_RADIO_TECHNOLOGY_GPRS,
+            ServiceState.RIL_RADIO_TECHNOLOGY_EDGE,
+            ServiceState.RIL_RADIO_TECHNOLOGY_UMTS,
+            ServiceState.RIL_RADIO_TECHNOLOGY_IS95A,
+            ServiceState.RIL_RADIO_TECHNOLOGY_IS95B,
+            ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT,
+            ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0,
+            ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A,
+            ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA,
+            ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA,
+            ServiceState.RIL_RADIO_TECHNOLOGY_HSPA,
+            ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B,
+            ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD,
+            ServiceState.RIL_RADIO_TECHNOLOGY_LTE,
+            ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP,
+            ServiceState.RIL_RADIO_TECHNOLOGY_GSM,
+            ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA,
+            ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA,
+            ServiceState.RIL_RADIO_TECHNOLOGY_NR
+    };
     private static String[] sPhoneIndexLabels;
 
     private static final int sCellInfoListRateDisabled = Integer.MAX_VALUE;
@@ -205,6 +241,10 @@
         Log.d(TAG, s);
     }
 
+    private static void loge(String s) {
+        Log.e(TAG, s);
+    }
+
     private static final int EVENT_QUERY_SMSC_DONE = 1005;
     private static final int EVENT_UPDATE_SMSC_DONE = 1006;
     private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 1007;
@@ -259,9 +299,11 @@
     private TextView mNrState;
     private TextView mNrFrequency;
     private TextView mNetworkSlicingConfig;
+    private TextView mEuiccInfo;
     private EditText mSmsc;
     private Switch mRadioPowerOnSwitch;
     private Switch mSimulateOutOfServiceSwitch;
+    private Switch mMockSatellite;
     private Button mDnsCheckToggleButton;
     private Button mPingTestButton;
     private Button mUpdateSmscButton;
@@ -269,6 +311,7 @@
     private Button mOemInfoButton;
     private Button mCarrierProvisioningButton;
     private Button mTriggerCarrierProvisioningButton;
+    private Button mEsosButton;
     private Switch mImsVolteProvisionedSwitch;
     private Switch mImsVtProvisionedSwitch;
     private Switch mImsWfcProvisionedSwitch;
@@ -277,6 +320,9 @@
     private Switch mDsdsSwitch;
     private Switch mRemovableEsimSwitch;
     private Spinner mPreferredNetworkType;
+    private Spinner mMockSignalStrength;
+    private Spinner mMockDataNetworkType;
+
     private Spinner mSelectPhoneIndex;
     private Spinner mCellInfoRefreshRateSpinner;
 
@@ -289,6 +335,7 @@
     private ImsManager mImsManager = null;
     private Phone mPhone = null;
     private ProvisioningManager mProvisioningManager = null;
+    private EuiccManager mEuiccManager;
 
     private String mPingHostnameResultV4;
     private String mPingHostnameResultV6;
@@ -296,8 +343,12 @@
     private boolean mMwiValue = false;
     private boolean mCfiValue = false;
 
+    private final PersistableBundle[] mCarrierSatelliteOriginalBundle = new PersistableBundle[2];
     private List<CellInfo> mCellInfoResult = null;
     private final boolean[] mSimulateOos = new boolean[2];
+    private int[] mSelectedSignalStrengthIndex = new int[2];
+    private int[] mSelectedMockDataNetworkTypeIndex = new int[2];
+    private String mEuiccInfoResult = "";
 
     private int mPreferredNetworkTypeResult;
     private int mCellInfoRefreshRateIndex;
@@ -514,6 +565,7 @@
         mPhone = getPhone(SubscriptionManager.getDefaultSubscriptionId());
         mTelephonyManager = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE))
                 .createForSubscriptionId(mPhone.getSubId());
+        mEuiccManager = getSystemService(EuiccManager.class);
 
         mImsManager = new ImsManager(mPhone.getContext());
         try {
@@ -561,6 +613,7 @@
         mNrFrequency = (TextView) findViewById(R.id.nr_frequency);
         mPhyChanConfig = (TextView) findViewById(R.id.phy_chan_config);
         mNetworkSlicingConfig = (TextView) findViewById(R.id.network_slicing_config);
+        mEuiccInfo = (TextView) findViewById(R.id.euicc_info);
 
         // hide 5G stats on devices that don't support 5G
         if ((mTelephonyManager.getSupportedRadioAccessFamily()
@@ -575,6 +628,29 @@
                 .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         mPreferredNetworkType.setAdapter(mPreferredNetworkTypeAdapter);
 
+        mMockSignalStrength = (Spinner) findViewById(R.id.signalStrength);
+        if (!TelephonyUtils.IS_DEBUGGABLE) {
+            mMockSignalStrength.setVisibility(View.GONE);
+        } else {
+            ArrayAdapter<Integer> mSignalStrengthAdapter = new ArrayAdapter<>(this,
+                    android.R.layout.simple_spinner_item, SIGNAL_STRENGTH_LEVEL);
+            mSignalStrengthAdapter
+                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+            mMockSignalStrength.setAdapter(mSignalStrengthAdapter);
+        }
+
+        mMockDataNetworkType = (Spinner) findViewById(R.id.dataNetworkType);
+        if (!TelephonyUtils.IS_DEBUGGABLE) {
+            mMockDataNetworkType.setVisibility(View.GONE);
+        } else {
+            ArrayAdapter<String> mNetworkTypeAdapter = new ArrayAdapter<>(this,
+                    android.R.layout.simple_spinner_item, Arrays.stream(MOCK_DATA_NETWORK_TYPE)
+                    .map(ServiceState::rilRadioTechnologyToString).toArray(String[]::new));
+            mNetworkTypeAdapter
+                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+            mMockDataNetworkType.setAdapter(mNetworkTypeAdapter);
+        }
+
         mSelectPhoneIndex = (Spinner) findViewById(R.id.phoneIndex);
         ArrayAdapter<String> phoneIndexAdapter = new ArrayAdapter<String>(this,
                 android.R.layout.simple_spinner_item, sPhoneIndexLabels);
@@ -633,6 +709,11 @@
             mSimulateOutOfServiceSwitch.setVisibility(View.GONE);
         }
 
+        mMockSatellite = (Switch) findViewById(R.id.mock_carrier_roaming_satellite);
+        if (!TelephonyUtils.IS_DEBUGGABLE) {
+            mMockSatellite.setVisibility(View.GONE);
+        }
+
         mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
         mUplinkKbps = (TextView) findViewById(R.id.ul_kbps);
         updateBandwidths(0, 0);
@@ -661,6 +742,17 @@
             mTriggerCarrierProvisioningButton.setEnabled(false);
         }
 
+        mEsosButton = (Button) findViewById(R.id.esos_questionnaire);
+        if (!TelephonyUtils.IS_DEBUGGABLE) {
+            mEsosButton.setVisibility(View.GONE);
+        } else {
+            mEsosButton.setOnClickListener(v ->
+                    mPhone.getContext().startActivity(
+                        new Intent(ACTION_ESOS_TEST)
+                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK))
+            );
+        }
+
         mOemInfoButton = (Button) findViewById(R.id.oem_info);
         mOemInfoButton.setOnClickListener(mOemInfoButtonHandler);
         PackageManager pm = getPackageManager();
@@ -713,6 +805,7 @@
         updateDnsCheckState();
         updateNetworkType();
         updateNrStats();
+        updateEuiccInfo();
 
         updateCellInfo(mCellInfoResult);
         updateSubscriptionIds();
@@ -738,13 +831,23 @@
                     RadioAccessFamily.getNetworkTypeFromRaf(networkType)));
         }).start();
 
+        // mock signal strength
+        mMockSignalStrength.setSelection(mSelectedSignalStrengthIndex[mPhone.getPhoneId()]);
+        mMockSignalStrength.setOnItemSelectedListener(mOnMockSignalStrengthSelectedListener);
+
+        // mock data network type
+        mMockDataNetworkType.setSelection(mSelectedMockDataNetworkTypeIndex[mPhone.getPhoneId()]);
+        mMockDataNetworkType.setOnItemSelectedListener(mOnMockDataNetworkTypeSelectedListener);
+
         // set phone index
         mSelectPhoneIndex.setSelection(mSelectedPhoneIndex, true);
         mSelectPhoneIndex.setOnItemSelectedListener(mSelectPhoneIndexHandler);
 
         mRadioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
-        mSimulateOutOfServiceSwitch.setOnCheckedChangeListener(mSimulateOosOnChangeListener);
         mSimulateOutOfServiceSwitch.setChecked(mSimulateOos[mPhone.getPhoneId()]);
+        mSimulateOutOfServiceSwitch.setOnCheckedChangeListener(mSimulateOosOnChangeListener);
+        mMockSatellite.setChecked(mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()] != null);
+        mMockSatellite.setOnCheckedChangeListener(mMockSatelliteListener);
         mImsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
         mImsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
         mImsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
@@ -856,12 +959,31 @@
 
     @Override
     protected void onDestroy() {
+        clearOverride();
         super.onDestroy();
         if (mQueuedWork != null) {
             mQueuedWork.shutdown();
         }
     }
 
+    private void clearOverride() {
+        for (int phoneId = 0; phoneId < sPhoneIndexLabels.length; phoneId++) {
+            mPhone = PhoneFactory.getPhone(phoneId);
+            if (mSimulateOos[mPhone.getPhoneId()])  {
+                mSimulateOosOnChangeListener.onCheckedChanged(mSimulateOutOfServiceSwitch, false);
+            }
+            if (mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()] != null) {
+                mMockSatelliteListener.onCheckedChanged(mMockSatellite, false);
+            }
+            if (mSelectedSignalStrengthIndex[mPhone.getPhoneId()] > 0) {
+                mOnMockSignalStrengthSelectedListener.onItemSelected(null, null, 0/*pos*/, 0);
+            }
+            if (mSelectedMockDataNetworkTypeIndex[mPhone.getPhoneId()] > 0) {
+                mOnMockDataNetworkTypeSelectedListener.onItemSelected(null, null, 0/*pos*/, 0);
+            }
+        }
+    }
+
     // returns array of string labels for each phone index. The array index is equal to the phone
     // index.
     private static String[] getPhoneIndexLabels(TelephonyManager tm) {
@@ -1294,7 +1416,7 @@
                     resultFuture.get(DEFAULT_TIMEOUT_MS, MILLISECONDS);
             mNetworkSlicingConfig.setText(networkSlicingConfig.toString());
         } catch (ExecutionException | InterruptedException | TimeoutException e) {
-            Log.e(TAG, "Unable to get slicing config: " + e.toString());
+            loge("Unable to get slicing config: " + e);
             mNetworkSlicingConfig.setText("Unable to get slicing config.");
         }
 
@@ -1345,6 +1467,34 @@
         mReceived.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
     }
 
+    private void updateEuiccInfo() {
+        final Runnable setEuiccInfo = new Runnable() {
+            public void run() {
+                mEuiccInfo.setText(mEuiccInfoResult);
+            }
+        };
+
+        mQueuedWork.execute(new Runnable() {
+            @Override
+            public void run() {
+                if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_EUICC)) {
+                    mEuiccInfoResult = "Euicc Feature is disabled";
+                } else if (mEuiccManager == null || !mEuiccManager.isEnabled()) {
+                    mEuiccInfoResult = "EuiccManager is not enabled";
+                } else {
+                    try {
+                        mEuiccInfoResult = " { Available memory in bytes:"
+                                + mEuiccManager.getAvailableMemoryInBytes()
+                                + " }";
+                    } catch (Exception e) {
+                        mEuiccInfoResult = e.getMessage();
+                    }
+                }
+                mHandler.post(setEuiccInfo);
+            }
+        });
+    }
+
     /**
      *  Ping a host name
      */
@@ -1716,6 +1866,69 @@
         mPhone.getTelephonyTester().setServiceStateTestIntent(intent);
     };
 
+    private final OnCheckedChangeListener mMockSatelliteListener =
+            (buttonView, isChecked) -> {
+                if (mPhone != null) {
+                    CarrierConfigManager cm = mPhone.getContext()
+                            .getSystemService(CarrierConfigManager.class);
+                    if (cm == null) return;
+                    if (isChecked) {
+                        String operatorNumeric = mPhone.getOperatorNumeric();
+                        TelephonyManager tm;
+                        if (TextUtils.isEmpty(operatorNumeric) && (tm = mPhone.getContext()
+                                .getSystemService(TelephonyManager.class)) != null) {
+                            operatorNumeric = tm.getSimOperatorNumericForPhone(mPhone.getPhoneId());
+                        }
+                        if (TextUtils.isEmpty(operatorNumeric)) {
+                            loge("mMockSatelliteListener: Can't mock because no operator for phone "
+                                    + mPhone.getPhoneId());
+                            mMockSatellite.setChecked(false);
+                            return;
+                        }
+                        PersistableBundle originalBundle = cm.getConfigForSubId(mPhone.getSubId(),
+                                CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL,
+                                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL,
+                                CarrierConfigManager
+                                        .KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE
+                        );
+                        PersistableBundle overrideBundle = new PersistableBundle();
+                        overrideBundle.putBoolean(
+                                CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL, true);
+                        overrideBundle.putBoolean(CarrierConfigManager
+                                .KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false);
+                        PersistableBundle capableProviderBundle = new PersistableBundle();
+                        capableProviderBundle.putIntArray(mPhone.getOperatorNumeric(), new int[]{
+                                // Currently satellite only supports below
+                                NetworkRegistrationInfo.SERVICE_TYPE_SMS,
+                                NetworkRegistrationInfo.SERVICE_TYPE_EMERGENCY
+                        });
+                        overrideBundle.putPersistableBundle(CarrierConfigManager
+                                .KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE,
+                                capableProviderBundle);
+                        log("mMockSatelliteListener: new " + overrideBundle);
+                        log("mMockSatelliteListener: old " + originalBundle);
+                        cm.overrideConfig(mPhone.getSubId(), overrideBundle, false);
+                        mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()] = originalBundle;
+                    } else {
+                        try {
+                            cm.overrideConfig(mPhone.getSubId(),
+                                    mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()], false);
+                            mCarrierSatelliteOriginalBundle[mPhone.getPhoneId()] = null;
+                            log("mMockSatelliteListener: Successfully cleared mock for phone "
+                                    + mPhone.getPhoneId());
+                        } catch (Exception e) {
+                            loge("mMockSatelliteListener: Can't clear mock because invalid sub Id "
+                                    + mPhone.getSubId()
+                                    + ", insert SIM and use adb shell cmd phone cc clear-values");
+                            // Keep show toggle ON if the view is not destroyed. If destroyed, must
+                            // use cmd to reset, because upon creation the view doesn't remember the
+                            // last toggle state while override mock is still in place.
+                            mMockSatellite.setChecked(true);
+                        }
+                    }
+                }
+            };
+
     private boolean isImsVolteProvisioned() {
         return getImsConfigProvisionedState(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
                 ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
@@ -1944,6 +2157,43 @@
         }
     };
 
+    AdapterView.OnItemSelectedListener mOnMockSignalStrengthSelectedListener =
+            new AdapterView.OnItemSelectedListener() {
+
+                public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) {
+                    log("mOnSignalStrengthSelectedListener: " + pos);
+                    mSelectedSignalStrengthIndex[mPhone.getPhoneId()] = pos;
+                    mPhone.getTelephonyTester().setSignalStrength(SIGNAL_STRENGTH_LEVEL[pos]);
+                }
+
+                public void onNothingSelected(AdapterView<?> parent) {}
+            };
+
+
+    AdapterView.OnItemSelectedListener mOnMockDataNetworkTypeSelectedListener =
+            new AdapterView.OnItemSelectedListener() {
+
+                public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) {
+                    log("mOnMockDataNetworkTypeSelectedListener: " + pos);
+                    mSelectedMockDataNetworkTypeIndex[mPhone.getPhoneId()] = pos;
+                    Intent intent = new Intent("com.android.internal.telephony.TestServiceState");
+                    if (pos > 0) {
+                        log("mOnMockDataNetworkTypeSelectedListener: Override RAT: "
+                                + ServiceState.rilRadioTechnologyToString(
+                                        MOCK_DATA_NETWORK_TYPE[pos]));
+                        intent.putExtra("data_reg_state", ServiceState.STATE_IN_SERVICE);
+                        intent.putExtra("data_rat", MOCK_DATA_NETWORK_TYPE[pos]);
+                    } else {
+                        log("mOnMockDataNetworkTypeSelectedListener: Remove RAT override.");
+                        intent.putExtra("action", "reset");
+                    }
+
+                    mPhone.getTelephonyTester().setServiceStateTestIntent(intent);
+                }
+
+                public void onNothingSelected(AdapterView<?> parent) {}
+            };
+
     AdapterView.OnItemSelectedListener mSelectPhoneIndexHandler =
             new AdapterView.OnItemSelectedListener() {
 
diff --git a/src/com/android/phone/settings/VoicemailSettingsActivity.java b/src/com/android/phone/settings/VoicemailSettingsActivity.java
index c940748..817ca4c 100644
--- a/src/com/android/phone/settings/VoicemailSettingsActivity.java
+++ b/src/com/android/phone/settings/VoicemailSettingsActivity.java
@@ -50,6 +50,7 @@
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.flags.Flags;
 import com.android.internal.telephony.util.NotificationChannelController;
 import com.android.phone.EditPhoneNumberPreference;
 import com.android.phone.PhoneGlobals;
@@ -200,6 +201,7 @@
     private boolean mShowVoicemailPreference = false;
 
     private boolean mForeground;
+    private boolean mDisallowedConfig = false;
     private Phone mPhone;
     private SubscriptionInfoHelper mSubscriptionInfoHelper;
 
@@ -221,11 +223,20 @@
         // Make sure we are running as the primary user only
         UserManager userManager = getApplicationContext().getSystemService(UserManager.class);
         if (!userManager.isPrimaryUser()) {
-           Toast.makeText(this, R.string.voice_number_setting_primary_user_only,
-                   Toast.LENGTH_SHORT).show();
-           finish();
-           return;
+            Toast.makeText(this, R.string.voice_number_setting_primary_user_only,
+                    Toast.LENGTH_SHORT).show();
+            finish();
+            return;
         }
+
+        // Check if mobile network configs are restricted.
+        if (Flags.ensureAccessToCallSettingsIsRestricted() &&
+                userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
+            mDisallowedConfig = true;
+            Log.i(LOG_TAG, "Mobile network configs are restricted, disabling voicemail "
+                    + "settings");
+        }
+
         // Show the voicemail preference in onResume if the calling intent specifies the
         // ACTION_ADD_VOICEMAIL action.
         mShowVoicemailPreference = (icicle == null) &&
@@ -266,7 +277,8 @@
             mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
             mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
             if (!getBooleanCarrierConfig(
-                    CarrierConfigManager.KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL)) {
+                    CarrierConfigManager.KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL) ||
+                    mDisallowedConfig) {
                 mSubMenuVoicemailSettings.setEnabled(false);
             }
         }
diff --git a/src/com/android/phone/settings/fdn/FdnSetting.java b/src/com/android/phone/settings/fdn/FdnSetting.java
index e347dec..ddbcc99 100644
--- a/src/com/android/phone/settings/fdn/FdnSetting.java
+++ b/src/com/android/phone/settings/fdn/FdnSetting.java
@@ -33,6 +33,7 @@
 
 import com.android.internal.telephony.CommandException;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.flags.Flags;
 import com.android.phone.CallFeaturesSetting;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.R;
diff --git a/src/com/android/phone/utils/CarrierAllowListInfo.java b/src/com/android/phone/utils/CarrierAllowListInfo.java
index 8e22cb9..3ab9733 100644
--- a/src/com/android/phone/utils/CarrierAllowListInfo.java
+++ b/src/com/android/phone/utils/CarrierAllowListInfo.java
@@ -23,7 +23,6 @@
 import android.content.pm.Signature;
 import android.telephony.Rlog;
 import android.text.TextUtils;
-import android.util.Log;
 
 import com.android.internal.telephony.uicc.IccUtils;
 
@@ -37,6 +36,7 @@
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -45,9 +45,9 @@
     private static final String LOG_TAG = "CarrierAllowListInfo";
     private JSONObject mDataJSON;
     private static final String JSON_CHARSET = "UTF-8";
-    private static final String MESSAGE_DIGEST_ALGORITHM = "SHA1";
-    private static final String CALLER_SHA_1_ID = "callerSHA1Id";
-    private static final String CALLER_CARRIER_ID = "carrierId";
+    private static final String MESSAGE_DIGEST_256_ALGORITHM = "SHA-256";
+    private static final String CALLER_SHA256_ID = "callerSHA256Ids";
+    private static final String CALLER_CARRIER_ID = "carrierIds";
     public static final int INVALID_CARRIER_ID = -1;
 
     private static final String CARRIER_RESTRICTION_OPERATOR_REGISTERED_FILE =
@@ -68,11 +68,12 @@
         return mInstance;
     }
 
-    public int validateCallerAndGetCarrierId(String packageName) {
+    public Set<Integer> validateCallerAndGetCarrierIds(String packageName) {
         CarrierInfo carrierInfo = parseJsonForCallerInfo(packageName);
         boolean isValid = (carrierInfo != null) && validateCallerSignature(mContext, packageName,
                 carrierInfo.getSHAIdList());
-        return (isValid) ? carrierInfo.getCallerCarrierId() : INVALID_CARRIER_ID;
+        return (isValid) ? carrierInfo.getCallerCarrierIdList() : Collections.singleton(
+                INVALID_CARRIER_ID);
     }
 
     private void loadJsonFile(Context context) {
@@ -94,13 +95,19 @@
         try {
             if (mDataJSON != null && callerPackage != null) {
                 JSONObject callerJSON = mDataJSON.getJSONObject(callerPackage.trim());
-                JSONArray callerJSONArray = callerJSON.getJSONArray(CALLER_SHA_1_ID);
-                int carrierId = callerJSON.getInt(CALLER_CARRIER_ID);
+                JSONArray callerJSONArray = callerJSON.getJSONArray(CALLER_SHA256_ID);
+                JSONArray carrierIdArray = callerJSON.getJSONArray(CALLER_CARRIER_ID);
+
+                Set<Integer> carrierIds = new HashSet<>();
+                for (int index = 0; index < carrierIdArray.length(); index++) {
+                    carrierIds.add(carrierIdArray.getInt(index));
+                }
+
                 List<String> appSignatures = new ArrayList<>();
                 for (int index = 0; index < callerJSONArray.length(); index++) {
                     appSignatures.add((String) callerJSONArray.get(index));
                 }
-                return new CarrierInfo(carrierId, appSignatures);
+                return new CarrierInfo(carrierIds, appSignatures);
             }
         } catch (JSONException ex) {
             Rlog.e(LOG_TAG, "getCallerSignatureInfo: JSONException = " + ex);
@@ -134,7 +141,7 @@
 
     /**
      * API fetches all the related signatures of the given package from the packageManager
-     * and validate all the signatures.
+     * and validate all the signatures using SHA-256.
      *
      * @param context             context
      * @param packageName         package name of the caller to validate the signatures.
@@ -150,13 +157,13 @@
         }
         final PackageManager packageManager = context.getPackageManager();
         try {
-            MessageDigest sha1MDigest = MessageDigest.getInstance(MESSAGE_DIGEST_ALGORITHM);
+            MessageDigest sha256MDigest = MessageDigest.getInstance(MESSAGE_DIGEST_256_ALGORITHM);
             final PackageInfo packageInfo = packageManager.getPackageInfo(packageName,
                     PackageManager.GET_SIGNATURES);
             for (Signature signature : packageInfo.signatures) {
-                final byte[] signatureSha1 = sha1MDigest.digest(signature.toByteArray());
-                final String hexSignatureSha1 = IccUtils.bytesToHexString(signatureSha1);
-                if (!allowListSignatures.contains(hexSignatureSha1)) {
+                final byte[] signatureSha256 = sha256MDigest.digest(signature.toByteArray());
+                final String hexSignatureSha256 = IccUtils.bytesToHexString(signatureSha256);
+                if (!allowListSignatures.contains(hexSignatureSha256)) {
                     return false;
                 }
             }
@@ -183,16 +190,16 @@
     }
 
     private static class CarrierInfo {
-        final private int mCallerCarrierId;
+        final private Set<Integer> mCallerCarrierIdList;
         final private List<String> mSHAIdList;
 
-        public CarrierInfo(int carrierId, List<String> SHAIds) {
-            mCallerCarrierId = carrierId;
+        public CarrierInfo(Set<Integer> carrierIds, List<String> SHAIds) {
+            mCallerCarrierIdList = carrierIds;
             mSHAIdList = SHAIds;
         }
 
-        public int getCallerCarrierId() {
-            return mCallerCarrierId;
+        public Set<Integer> getCallerCarrierIdList() {
+            return mCallerCarrierIdList;
         }
 
         public List<String> getSHAIdList() {
@@ -203,10 +210,10 @@
     @TestApi
     public List<String> getShaIdList(String srcPkg, int carrierId) {
         CarrierInfo carrierInfo = parseJsonForCallerInfo(srcPkg);
-        if (carrierInfo != null && carrierInfo.getCallerCarrierId() == carrierId) {
+        if (carrierInfo != null && carrierInfo.getCallerCarrierIdList().contains(carrierId)) {
             return carrierInfo.getSHAIdList();
         }
-        Rlog.e(LOG_TAG, "getShaIdList carrierId or shaIdList is empty");
+        Rlog.e(LOG_TAG, "getShaIdList: carrierId or shaIdList is empty");
         return Collections.EMPTY_LIST;
     }
 }
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index c00adef..48786dc 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -23,12 +23,16 @@
 import android.telecom.DisconnectCause;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
 import android.telephony.ims.ImsReasonInfo;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.CallFailCause;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.flags.FeatureFlags;
+import com.android.internal.telephony.flags.FeatureFlagsImpl;
+import com.android.internal.telephony.satellite.SatelliteController;
 import com.android.phone.ImsUtil;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.R;
@@ -86,7 +90,7 @@
     public static DisconnectCause toTelecomDisconnectCause(int telephonyDisconnectCause,
             String reason, int phoneId) {
         return toTelecomDisconnectCause(telephonyDisconnectCause, CallFailCause.NOT_VALID,
-                reason, phoneId, null, new FlagsAdapterImpl());
+                reason, phoneId, null, new FlagsAdapterImpl(), false);
     }
 
    /**
@@ -103,7 +107,27 @@
             int telephonyDisconnectCause, int telephonyPreciseDisconnectCause, String reason,
             int phoneId, ImsReasonInfo imsReasonInfo, FlagsAdapter featureFlags) {
         return toTelecomDisconnectCause(telephonyDisconnectCause, telephonyPreciseDisconnectCause,
-                reason, phoneId, imsReasonInfo, getCarrierConfigBundle(phoneId), featureFlags);
+                reason, phoneId, imsReasonInfo, getCarrierConfigBundle(phoneId), featureFlags,
+                false);
+    }
+
+   /**
+    * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
+    * generic {@link android.telecom.DisconnectCause}.object, possibly populated with a localized
+    * message and tone for Slot.
+    * @param telephonyDisconnectCause The code for the reason for the disconnect.
+    * @param telephonyPreciseDisconnectCause The code for the precise reason for the disconnect.
+    * @param reason Description of the reason for the disconnect, not intended for the user to see.
+    * @param phoneId To support localized message based on phoneId
+    * @param imsReasonInfo
+    */
+    public static DisconnectCause toTelecomDisconnectCause(
+            int telephonyDisconnectCause, int telephonyPreciseDisconnectCause, String reason,
+            int phoneId, ImsReasonInfo imsReasonInfo, FlagsAdapter featureFlags,
+            boolean shouldTreatAsEmergency) {
+        return toTelecomDisconnectCause(telephonyDisconnectCause, telephonyPreciseDisconnectCause,
+                reason, phoneId, imsReasonInfo, getCarrierConfigBundle(phoneId), featureFlags,
+                shouldTreatAsEmergency);
     }
 
     /**
@@ -116,15 +140,15 @@
     static DisconnectCause toTelecomDisconnectCause(
             int telephonyDisconnectCause, int telephonyPreciseDisconnectCause, String reason,
             int phoneId, ImsReasonInfo imsReasonInfo, PersistableBundle carrierConfig,
-            FlagsAdapter featureFlags) {
+            FlagsAdapter featureFlags, boolean shouldTreatAsEmergency) {
         Context context = PhoneGlobals.getInstance();
 
-        return new DisconnectCause.Builder()
-                .setCode(toTelecomDisconnectCauseCode(telephonyDisconnectCause, carrierConfig))
+        return new DisconnectCause.Builder(
+                toTelecomDisconnectCauseCode(telephonyDisconnectCause, carrierConfig))
                 .setLabel(toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause,
                         telephonyPreciseDisconnectCause, carrierConfig, featureFlags))
                 .setDescription(toTelecomDisconnectCauseDescription(
-                        context, telephonyDisconnectCause, phoneId))
+                        context, telephonyDisconnectCause, phoneId, shouldTreatAsEmergency))
                 .setReason(toTelecomDisconnectReason(
                         context, telephonyDisconnectCause, reason, phoneId))
                 .setTone(toTelecomDisconnectCauseTone(
@@ -140,8 +164,8 @@
      * {@link android.telecom.DisconnectCause} disconnect code.
      * @return The disconnect code as defined in {@link android.telecom.DisconnectCause}.
      */
-    private static int toTelecomDisconnectCauseCode(int telephonyDisconnectCause,
-            PersistableBundle carrierConfig) {
+    private static @DisconnectCause.DisconnectCauseCode int toTelecomDisconnectCauseCode(
+            int telephonyDisconnectCause, PersistableBundle carrierConfig) {
 
         // special case: some carriers determine what disconnect causes play the BUSY tone.
         // hence, must adjust the disconnectCause CODE to match the tone.
@@ -434,7 +458,7 @@
                 resourceId = R.string.callFailed_wfc_service_not_available_in_this_location;
                 break;
             case android.telephony.DisconnectCause.SATELLITE_ENABLED:
-                resourceId = R.string.incall_error_satellite_enabled;
+                resourceId = getSatelliteErrorString();
                 break;
             default:
                 break;
@@ -618,7 +642,7 @@
                         resourceId = R.string.clh_incall_error_out_of_service_txt;
                         break;
                     case android.telephony.DisconnectCause.SATELLITE_ENABLED:
-                        resourceId = R.string.clh_callFailed_satelliteEnabled_txt;
+                        resourceId = getSatelliteErrorString();
                         break;
                     default:
                         resourceId = R.string.clh_card_title_call_ended_txt;
@@ -633,7 +657,8 @@
      * Returns a description of the disconnect cause to be shown to the user.
      */
     private static CharSequence toTelecomDisconnectCauseDescription(
-            Context context, int telephonyDisconnectCause, int phoneId) {
+            Context context, int telephonyDisconnectCause, int phoneId,
+            boolean shouldTreatAsEmergency) {
         if (context == null ) {
             return "";
         }
@@ -756,14 +781,31 @@
 
             case android.telephony.DisconnectCause.OUT_OF_SERVICE:
                 // No network connection.
+                FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
                 if (ImsUtil.shouldPromoteWfc(context, phoneId)) {
                     resourceId = R.string.incall_error_promote_wfc;
                 } else if (ImsUtil.isWfcModeWifiOnly(context, phoneId)) {
                     resourceId = R.string.incall_error_wfc_only_no_wireless_network;
                 } else if (ImsUtil.isWfcEnabled(context, phoneId)) {
-                    resourceId = R.string.incall_error_out_of_service_wfc;
+                    if (!mFeatureFlags.showCallFailNotificationFor2gToggle()) {
+                        resourceId = R.string.incall_error_out_of_service_wfc;
+                        break;
+                    }
+                    if (is2gDisabled(phoneId) && !shouldTreatAsEmergency) {
+                        resourceId = R.string.incall_error_out_of_service_wfc_2g_user;
+                    } else {
+                        resourceId = R.string.incall_error_out_of_service_wfc;
+                    }
                 } else {
-                    resourceId = R.string.incall_error_out_of_service;
+                    if (!mFeatureFlags.showCallFailNotificationFor2gToggle()) {
+                        resourceId = R.string.incall_error_out_of_service;
+                        break;
+                    }
+                    if (is2gDisabled(phoneId) && !shouldTreatAsEmergency) {
+                        resourceId = R.string.incall_error_out_of_service_2g;
+                    } else {
+                        resourceId = R.string.incall_error_out_of_service;
+                    }
                 }
                 break;
 
@@ -844,7 +886,7 @@
                 resourceId = R.string.callFailed_wfc_service_not_available_in_this_location;
                 break;
             case android.telephony.DisconnectCause.SATELLITE_ENABLED:
-                resourceId = R.string.incall_error_satellite_enabled;
+                resourceId = getSatelliteErrorString();
                 break;
             default:
                 break;
@@ -888,6 +930,8 @@
                 return DisconnectCause.REASON_IMS_ACCESS_BLOCKED;
             case android.telephony.DisconnectCause.OUTGOING_EMERGENCY_CALL_PLACED:
                 return DisconnectCause.REASON_EMERGENCY_CALL_PLACED;
+            case android.telephony.DisconnectCause.SATELLITE_ENABLED:
+                return reason;
         }
 
         // If no specific code-mapping found, then fall back to using the reason.
@@ -986,4 +1030,25 @@
         return config;
     }
 
+    /**
+     * Returns true if 2G is disabled.
+     */
+    protected static boolean is2gDisabled(int phoneId) {
+        Phone phone = PhoneFactory.getPhone(phoneId);
+        if (phone == null) {
+            return false;
+        }
+        long bitmask2g = TelephonyManager.NETWORK_CLASS_BITMASK_2G;
+        long currentlyAllowedNetworkTypes = phone.getAllowedNetworkTypes(
+                TelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G);
+        boolean is2gEnabled = (currentlyAllowedNetworkTypes & bitmask2g) != 0;
+        return !is2gEnabled;
+    }
+
+    private static Integer getSatelliteErrorString() {
+        if (SatelliteController.getInstance().isSatelliteEnabled()) {
+            return R.string.incall_error_satellite_enabled;
+        }
+        return R.string.incall_error_carrier_roaming_satellite_mode;
+    }
 }
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index a246a1c..da9cfdf 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -32,12 +32,14 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerExecutor;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.PersistableBundle;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.provider.Telephony;
@@ -78,6 +80,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Predicate;
@@ -1323,8 +1326,12 @@
      */
     public static synchronized TelecomAccountRegistry getInstance(Context context) {
         if (sInstance == null && context != null) {
-            if (Flags.enforceTelephonyFeatureMappingForPublicApis()) {
-                PackageManager pm = context.getPackageManager();
+            int vendorApiLevel = SystemProperties.getInt("ro.vendor.api_level",
+                    Build.VERSION.DEVICE_INITIAL_SDK_INT);
+            PackageManager pm = context.getPackageManager();
+
+            if (Flags.enforceTelephonyFeatureMappingForPublicApis()
+                    && vendorApiLevel >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
                 if (pm != null && pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                         && pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
                     sInstance = new TelecomAccountRegistry(context);
@@ -1333,7 +1340,14 @@
                             + "missing telephony/calling feature(s)");
                 }
             } else {
-                sInstance = new TelecomAccountRegistry(context);
+                // One of features is defined, create instance
+                if (pm != null && (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
+                        || pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING))) {
+                    sInstance = new TelecomAccountRegistry(context);
+                } else {
+                    Log.d(LOG_TAG, "Not initializing TelecomAccountRegistry: "
+                            + "missing telephony or calling feature(s)");
+                }
             }
         }
         return sInstance;
@@ -1686,6 +1700,21 @@
                             continue;
                         }
 
+                        // Skip the sim for bootstrap
+                        if (info.getProfileClass() == SubscriptionManager
+                                .PROFILE_CLASS_PROVISIONING) {
+                            Log.d(this, "setupAccounts: skipping bootstrap sub id "
+                                    + subscriptionId);
+                            continue;
+                        }
+
+                        // Skip the sim for satellite as it does not support call for now
+                        if (Flags.oemEnabledSatelliteFlag() && info.isOnlyNonTerrestrialNetwork()) {
+                            Log.d(this, "setupAccounts: skipping satellite sub id "
+                                    + subscriptionId);
+                            continue;
+                        }
+
                         mAccounts.add(new AccountEntry(phone, false /* emergency */,
                                 false /* isTest */));
                     }
@@ -1700,6 +1729,35 @@
                             new AccountEntry(PhoneFactory.getDefaultPhone(), true /* emergency */,
                                     false /* isTest */));
                 }
+
+                // In some very rare cases, when setting the default voice sub in
+                // SubscriptionManagerService, the phone accounts here have not yet been built.
+                // So calling setUserSelectedOutgoingPhoneAccount in SubscriptionManagerService
+                // becomes a no-op. The workaround here is to reconcile and make sure the
+                // outgoing phone account is properly set in telecom.
+                int defaultVoiceSubId = SubscriptionManager.getDefaultVoiceSubscriptionId();
+                if (SubscriptionManager.isValidSubscriptionId(defaultVoiceSubId)) {
+                    PhoneAccountHandle defaultVoiceAccountHandle =
+                            getPhoneAccountHandleForSubId(defaultVoiceSubId);
+                    if (defaultVoiceAccountHandle != null) {
+                        PhoneAccountHandle currentAccount = mTelecomManager
+                                .getUserSelectedOutgoingPhoneAccount();
+                        // In some rare cases, the current phone account could be non-telephony
+                        // phone account. We do not override in this case.
+                        boolean wasPreviousAccountSameComponentOrUnset = currentAccount == null
+                                || Objects.equals(defaultVoiceAccountHandle.getComponentName(),
+                                currentAccount.getComponentName());
+
+                        // Set the phone account again if it's out-of-sync.
+                        if (!defaultVoiceAccountHandle.equals(currentAccount)
+                                && wasPreviousAccountSameComponentOrUnset) {
+                            Log.d(this, "setupAccounts: Re-setup phone account "
+                                    + "again for default voice sub " + defaultVoiceSubId);
+                            mTelecomManager.setUserSelectedOutgoingPhoneAccount(
+                                    defaultVoiceAccountHandle);
+                        }
+                    }
+                }
             }
 
             // Add a fake account entry.
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 7749a2c..3dbae8e 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -962,6 +962,7 @@
             new ConcurrentHashMap<TelephonyConnectionListener, Boolean>(8, 0.9f, 1));
 
     private Integer mEmergencyServiceCategory = null;
+    private List<String> mEmergencyUrns = null;
 
     protected TelephonyConnection(com.android.internal.telephony.Connection originalConnection,
             String callId, int callDirection) {
@@ -2505,6 +2506,7 @@
                                     if (numberInfo != null) {
                                         mEmergencyServiceCategory =
                                                 numberInfo.getEmergencyServiceCategoryBitmask();
+                                        mEmergencyUrns = numberInfo.getEmergencyUrns();
                                     } else {
                                         Log.i(this, "mEmergencyServiceCategory no EmergencyNumber");
                                     }
@@ -2513,6 +2515,9 @@
                                         Log.i(this, "mEmergencyServiceCategory="
                                                 + mEmergencyServiceCategory);
                                     }
+                                    if (mEmergencyUrns != null) {
+                                        Log.i(this, "mEmergencyUrns=" + mEmergencyUrns);
+                                    }
                                 }
                             }
                         }
@@ -2561,7 +2566,8 @@
                                         preciseDisconnectCause,
                                         mOriginalConnection.getVendorDisconnectCause(),
                                         getPhone().getPhoneId(), imsReasonInfo,
-                                        new FlagsAdapterImpl()));
+                                        new FlagsAdapterImpl(),
+                                        shouldTreatAsEmergencyCall()));
                         close();
                     }
                     break;
@@ -3929,4 +3935,21 @@
     public void setEmergencyServiceCategory(int eccCategory) {
         mEmergencyServiceCategory = eccCategory;
     }
+
+    /**
+     * @return a {@link List} of {@link String}s that are the emrgency URNs.
+     */
+    public @Nullable List<String> getEmergencyUrns() {
+        return mEmergencyUrns;
+    }
+
+    /**
+     * Set the emergency URNs.
+     *
+     * @param emergencyUrns The emergency URNs.
+     */
+    @VisibleForTesting
+    public void setEmergencyUrns(@Nullable List<String> emergencyUrns) {
+        mEmergencyUrns = emergencyUrns;
+    }
 }
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index ffcb269..148cff3 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -33,6 +33,8 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.ParcelUuid;
@@ -103,6 +105,7 @@
 import com.android.phone.R;
 import com.android.phone.callcomposer.CallComposerPictureManager;
 import com.android.phone.settings.SuppServicesUiUtil;
+import com.android.services.telephony.domainselection.DynamicRoutingController;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -148,6 +151,10 @@
     private static final Pattern CDMA_ACTIVATION_CODE_REGEX_PATTERN =
             Pattern.compile("\\*228[0-9]{0,2}");
 
+    private static final String DISCONNECT_REASON_SATELLITE_ENABLED = "SATELLITE_ENABLED";
+    private static final String DISCONNECT_REASON_CARRIER_ROAMING_SATELLITE_MODE =
+            "CARRIER_ROAMING_SATELLITE_MODE";
+
     private final TelephonyConnectionServiceProxy mTelephonyConnectionServiceProxy =
             new TelephonyConnectionServiceProxy() {
         @Override
@@ -227,10 +234,13 @@
     public Pair<WeakReference<TelephonyConnection>, Queue<Phone>> mEmergencyRetryCache;
     private DeviceState mDeviceState = new DeviceState();
     private EmergencyStateTracker mEmergencyStateTracker;
+    private DynamicRoutingController mDynamicRoutingController;
     private SatelliteSOSMessageRecommender mSatelliteSOSMessageRecommender;
     private DomainSelectionResolver mDomainSelectionResolver;
     private EmergencyCallDomainSelectionConnection mEmergencyCallDomainSelectionConnection;
     private TelephonyConnection mEmergencyConnection;
+    private TelephonyConnection mAlternateEmergencyConnection;
+    private TelephonyConnection mNormalRoutingEmergencyConnection;
     private Executor mDomainSelectionMainExecutor;
     private ImsManager mImsManager = null;
     private DomainSelectionConnection mDomainSelectionConnection;
@@ -561,6 +571,22 @@
     }
 
     /**
+     * A listener for normal routing emergency calls.
+     */
+    private final TelephonyConnection.TelephonyConnectionListener
+            mNormalRoutingEmergencyConnectionListener =
+                    new TelephonyConnection.TelephonyConnectionListener() {
+                @Override
+                public void onStateChanged(Connection connection,
+                        @Connection.ConnectionState int state) {
+                    TelephonyConnection c = (TelephonyConnection) connection;
+                    Log.i(this, "onStateChanged normal routing callId=" + c.getTelecomCallId()
+                            + ", state=" + state);
+                    mEmergencyStateTracker.onNormalRoutingEmergencyCallStateChanged(c, state);
+                }
+            };
+
+    /**
      * A listener for emergency calls.
      */
     private final TelephonyConnection.TelephonyConnectionListener mEmergencyConnectionListener =
@@ -753,8 +779,25 @@
                     }
                 }
                 if (mEmergencyConnection != null) {
-                    mEmergencyConnection.hangup(android.telephony.DisconnectCause.OUT_OF_NETWORK);
-                    mEmergencyConnection = null;
+                    if (mEmergencyConnection.getOriginalConnection() != null) {
+                        mEmergencyConnection.hangup(cause);
+                    } else {
+                        DomainSelectionConnection dsc = mEmergencyCallDomainSelectionConnection;
+                        int disconnectCause = (cause == android.telephony.DisconnectCause.NOT_VALID)
+                                ? dsc.getDisconnectCause() : cause;
+                        mEmergencyConnection.setTelephonyConnectionDisconnected(
+                                    DisconnectCauseUtil.toTelecomDisconnectCause(disconnectCause,
+                                        dsc.getPreciseDisconnectCause(), dsc.getReasonMessage(),
+                                        dsc.getPhoneId(), dsc.getImsReasonInfo(),
+                                        new FlagsAdapterImpl()));
+                        mEmergencyConnection.close();
+
+                        TelephonyConnection c = mEmergencyConnection;
+                        mEmergencyConnection.removeTelephonyConnectionListener(
+                                mEmergencyConnectionListener);
+                        releaseEmergencyCallDomainSelection(true, false);
+                        mEmergencyStateTracker.endCall(c);
+                    }
                 }
             });
         }
@@ -1125,13 +1168,34 @@
         boolean needToTurnOnRadio = (isEmergencyNumber && (!isRadioOn() || isAirplaneModeOn))
                 || (isRadioPowerDownOnBluetooth() && !isPhoneWifiCallingEnabled);
 
+        if (mSatelliteController.isSatelliteEnabled()
+                || mSatelliteController.isSatelliteBeingEnabled()) {
+            Log.d(this, "onCreateOutgoingConnection, "
+                    + " needToTurnOnRadio=" + needToTurnOnRadio
+                    + " needToTurnOffSatellite=" + needToTurnOffSatellite
+                    + " isEmergencyNumber=" + isEmergencyNumber);
+
+            if (!needToTurnOffSatellite) {
+                // Block outgoing call and do not turn off satellite
+                Log.d(this, "onCreateOutgoingConnection, "
+                        + "cannot make call in satellite mode.");
+                return Connection.createFailedConnection(
+                        mDisconnectCauseFactory.toTelecomDisconnectCause(
+                                android.telephony.DisconnectCause.SATELLITE_ENABLED,
+                                DISCONNECT_REASON_SATELLITE_ENABLED));
+            }
+        }
+
         if (mDomainSelectionResolver.isDomainSelectionSupported()) {
-            // Normal routing emergency number shall be handled by normal call domain selctor.
-            if (isEmergencyNumber && !isNormalRouting(phone, number)) {
+            // Normal routing emergency number shall be handled by normal call domain selector.
+            int routing = (isEmergencyNumber)
+                    ? getEmergencyCallRouting(phone, number, needToTurnOnRadio)
+                    : EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN;
+            if (isEmergencyNumber && routing != EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL) {
                 final Connection resultConnection =
                         placeEmergencyConnection(phone,
                                 request, numberToDial, isTestEmergencyNumber,
-                                handle, needToTurnOnRadio);
+                                handle, needToTurnOnRadio, routing);
                 if (resultConnection != null) return resultConnection;
             }
         }
@@ -1147,6 +1211,11 @@
 
             if (isEmergencyNumber) {
                 mIsEmergencyCallPending = true;
+                if (mDomainSelectionResolver.isDomainSelectionSupported()) {
+                    if (resultConnection instanceof TelephonyConnection) {
+                        setNormalRoutingEmergencyConnection((TelephonyConnection)resultConnection);
+                    }
+                }
             }
             int timeoutToOnTimeoutCallback = mDomainSelectionResolver.isDomainSelectionSupported()
                     ? TIMEOUT_TO_DYNAMIC_ROUTING_MS : 0;
@@ -1175,6 +1244,11 @@
                             && phone.getHalVersion(HAL_SERVICE_VOICE)
                             .less(RIL.RADIO_HAL_VERSION_1_4);
                     if (mDomainSelectionResolver.isDomainSelectionSupported()) {
+                        if (resultConnection != null
+                                && resultConnection.getState() == Connection.STATE_DISCONNECTED) {
+                            // Dialing is discarded.
+                            return true;
+                        }
                         if (isEmergencyNumber && phone == phoneForEmergency) {
                             // Since the domain selection service is enabled,
                             // dilaing normal routing emergency number only reaches here.
@@ -1193,7 +1267,8 @@
                         // reporting the OUT_OF_SERVICE state.
                         return phone.getState() == PhoneConstants.State.OFFHOOK
                                 || (phone.getServiceStateTracker().isRadioOn()
-                                && !mSatelliteController.isSatelliteEnabled());
+                                && (!mSatelliteController.isSatelliteEnabled()
+                                    && !mSatelliteController.isSatelliteBeingEnabled()));
                     } else {
                         SubscriptionInfoInternal subInfo = SubscriptionManagerService
                                 .getInstance().getSubscriptionInfoInternal(phone.getSubId());
@@ -1227,15 +1302,16 @@
             }
 
             if (!isEmergencyNumber) {
-                if ((mSatelliteController.isSatelliteEnabled()
-                        || isCallDisallowedDueToSatellite(phone))
+                if (isCallDisallowedDueToSatellite(phone)
                         && (imsPhone == null || !imsPhone.canMakeWifiCall())) {
-                    Log.d(this, "onCreateOutgoingConnection, cannot make call in satellite mode.");
+                    Log.d(this, "onCreateOutgoingConnection, cannot make call "
+                            + "when device is connected to carrier roaming satellite network");
                     return Connection.createFailedConnection(
                             mDisconnectCauseFactory.toTelecomDisconnectCause(
                                     android.telephony.DisconnectCause.SATELLITE_ENABLED,
-                                    "Call failed because satellite modem is enabled."));
+                                    DISCONNECT_REASON_CARRIER_ROAMING_SATELLITE_MODE));
                 }
+
                 final Connection resultConnection = getTelephonyConnection(request, numberToDial,
                         false, handle, phone);
                 if (isAdhocConference) {
@@ -1269,6 +1345,12 @@
                 final Connection resultConnection = getTelephonyConnection(request, numberToDial,
                         true, handle, phone);
 
+                if (mDomainSelectionResolver.isDomainSelectionSupported()) {
+                    if (resultConnection instanceof TelephonyConnection) {
+                        setNormalRoutingEmergencyConnection((TelephonyConnection)resultConnection);
+                    }
+                }
+
                 CompletableFuture<Void> maybeHoldFuture =
                         checkAndHoldCallsOnOtherSubsForEmergencyCall(request,
                                 resultConnection, phone);
@@ -1370,6 +1452,11 @@
             Log.i(this, "Call disconnected before the outgoing call was placed. Skipping call "
                     + "placement.");
             if (isEmergencyNumber) {
+                if (mDomainSelectionResolver.isDomainSelectionSupported()
+                        && mDeviceState.isAirplaneModeOn(this)) {
+                    mIsEmergencyCallPending = false;
+                    return;
+                }
                 // If call is already canceled by the user, notify modem to exit emergency call
                 // mode by sending radio on with forEmergencyCall=false.
                 for (Phone curPhone : mPhoneFactoryProxy.getPhones()) {
@@ -2045,11 +2132,21 @@
     }
 
     private boolean isSatelliteBlockingCall(boolean isEmergencyNumber) {
-        if (isEmergencyNumber) {
-            return mSatelliteController.isSatelliteEnabled();
-        } else {
-            return mSatelliteController.isDemoModeEnabled();
+        if (!mSatelliteController.isSatelliteEnabled()
+                && !mSatelliteController.isSatelliteBeingEnabled()) {
+            return false;
         }
+
+        if (isEmergencyNumber) {
+            if (mSatelliteController.isDemoModeEnabled()) {
+                // If user makes emergency call in demo mode, end the satellite session
+                return true;
+            } else {
+                return getTurnOffOemEnabledSatelliteDuringEmergencyCall();
+            }
+        }
+
+        return false;
     }
 
     private Pair<WeakReference<TelephonyConnection>, Queue<Phone>> makeCachedConnectionPhonePair(
@@ -2125,7 +2222,7 @@
                 updatePhoneAccount(c, newPhoneToUse);
             }
             if (mDomainSelectionResolver.isDomainSelectionSupported()) {
-                onEmergencyRedial(c, newPhoneToUse);
+                onEmergencyRedial(c, newPhoneToUse, false);
                 return;
             }
             placeOutgoingConnection(c, newPhoneToUse, videoState, connExtras);
@@ -2222,12 +2319,58 @@
                         }
                     }
                     if (mDomainSelectionResolver.isDomainSelectionSupported()) {
-                        if (isNormalRouting(phone, number)
-                                    && handleOutgoingCallConnection(number, connection,
-                                            phone, videoState)) {
-                            /** Normal routing emergency number shall be handled
-                             * by normal call domain selctor.*/
+                        mIsEmergencyCallPending = false;
+                        if (connection == mNormalRoutingEmergencyConnection) {
+                            if (getEmergencyCallRouting(phone, number, false)
+                                    != EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL) {
+                                Log.i(this, "placeOutgoingConnection dynamic routing");
+                                // A normal routing number is dialed when airplane mode is enabled,
+                                // but normal service is not acquired.
+                                setNormalRoutingEmergencyConnection(null);
+                                mAlternateEmergencyConnection = connection;
+                                onEmergencyRedial(connection, phone, true);
+                                return;
+                            }
+                            /* Normal routing emergency number shall be handled
+                             * by normal call domain selector.*/
                             Log.i(this, "placeOutgoingConnection normal routing number");
+                            mEmergencyStateTracker.startNormalRoutingEmergencyCall(
+                                    phone, connection, result -> {
+                                        Log.i(this, "placeOutgoingConnection normal routing number:"
+                                                + " result = " + result);
+                                        if (connection.getState()
+                                                == Connection.STATE_DISCONNECTED) {
+                                            Log.i(this, "placeOutgoingConnection "
+                                                    + "reject incoming, dialing canceled");
+                                            return;
+                                        }
+                                        if (!handleOutgoingCallConnection(number, connection,
+                                                phone, videoState)) {
+                                            Log.w(this, "placeOriginalConnection - Unexpected, "
+                                                    + "domain selector not available.");
+                                            // Notify EmergencyStateTracker to reset the state.
+                                            onLocalHangup(connection);
+                                            // Try dialing without domain selection
+                                            // as a best-effort.
+                                            try {
+                                                // EmergencyStateTracker ensures this is
+                                                // on the main thread.
+                                                connection.setOriginalConnection(phone.dial(number,
+                                                        new ImsPhone.ImsDialArgs.Builder()
+                                                        .setVideoState(videoState)
+                                                        .setIntentExtras(extras)
+                                                        .setRttTextStream(
+                                                                connection.getRttTextStream())
+                                                        .build(),
+                                                        connection::registerForCallEvents));
+                                            } catch (CallStateException e) {
+                                                connection.unregisterForCallEvents();
+                                                handleCallStateException(e, connection, phone);
+                                            }
+                                        }
+                                    });
+                            connection.addTelephonyConnectionListener(
+                                    mNormalRoutingEmergencyConnectionListener);
                             return;
                         }
                     }
@@ -2301,6 +2444,31 @@
     }
 
     private void handleOutgoingCallConnectionByCallDomainSelection(
+            int domain, Phone phone, String number, int videoState,
+            TelephonyConnection connection) {
+        if (mNormalRoutingEmergencyConnection == connection) {
+            CompletableFuture<Void> rejectFuture = checkAndRejectIncomingCall(phone, (ret) -> {
+                if (!ret) {
+                    Log.i(this, "handleOutgoingCallConnectionByCallDomainSelection "
+                            + "reject incoming call failed");
+                }
+            });
+            CompletableFuture<Void> unused = rejectFuture.thenRun(() -> {
+                if (connection.getState() == Connection.STATE_DISCONNECTED) {
+                    Log.i(this, "handleOutgoingCallConnectionByCallDomainSelection "
+                            + "reject incoming, dialing canceled");
+                    return;
+                }
+                handleOutgoingCallConnectionByCallDomainSelection(
+                        domain, phone, number, videoState);
+            });
+            return;
+        }
+
+        handleOutgoingCallConnectionByCallDomainSelection(domain, phone, number, videoState);
+    }
+
+    private void handleOutgoingCallConnectionByCallDomainSelection(
             int domain, Phone phone, String number, int videoState) {
         Log.d(this, "Call Domain Selected : " + domain);
         try {
@@ -2402,7 +2570,7 @@
             Log.d(LOG_TAG, "Selecting same domain as ongoing call on same subId");
             mNormalCallConnection = connection;
             handleOutgoingCallConnectionByCallDomainSelection(
-                    activeCallDomain, phone, number, videoState);
+                    activeCallDomain, phone, number, videoState, connection);
             return true;
         }
 
@@ -2429,7 +2597,7 @@
 
         mNormalCallConnection = connection;
         future.thenAcceptAsync((domain) -> handleOutgoingCallConnectionByCallDomainSelection(
-                domain, phone, number, videoState), mDomainSelectionMainExecutor);
+                domain, phone, number, videoState, connection), mDomainSelectionMainExecutor);
 
         if (isPotentialUssdCode) {
             Log.v(LOG_TAG, "PotentialUssdCode. Closing connection with DisconnectCause.DIALED_MMI");
@@ -2446,7 +2614,7 @@
     private Connection placeEmergencyConnection(
             final Phone phone, final ConnectionRequest request,
             final String numberToDial, final boolean isTestEmergencyNumber,
-            final Uri handle, final boolean needToTurnOnRadio) {
+            final Uri handle, final boolean needToTurnOnRadio, int routing) {
 
         final Connection resultConnection =
                 getTelephonyConnection(request, numberToDial, true, handle, phone);
@@ -2456,6 +2624,11 @@
 
             mIsEmergencyCallPending = true;
             mEmergencyConnection = (TelephonyConnection) resultConnection;
+            if (routing == EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY) {
+                mAlternateEmergencyConnection = (TelephonyConnection) resultConnection;
+            }
+            handleEmergencyCallStartedForSatelliteSOSMessageRecommender(mEmergencyConnection,
+                    phone);
         }
 
         CompletableFuture<Void> maybeHoldFuture =
@@ -2500,8 +2673,15 @@
                     createEmergencyConnection(phone, (TelephonyConnection) resultConnection,
                             numberToDial, isTestEmergencyNumber, request, needToTurnOnRadio,
                             mEmergencyStateTracker.getEmergencyRegistrationResult());
+                } else if (result == android.telephony.DisconnectCause.EMERGENCY_PERM_FAILURE) {
+                    mEmergencyConnection.removeTelephonyConnectionListener(
+                            mEmergencyConnectionListener);
+                    TelephonyConnection c = mEmergencyConnection;
+                    releaseEmergencyCallDomainSelection(true, false);
+                    retryOutgoingOriginalConnection(c, phone, true);
                 } else {
                     mEmergencyConnection = null;
+                    mAlternateEmergencyConnection = null;
                     String reason = "Couldn't setup emergency call";
                     if (result == android.telephony.DisconnectCause.POWER_OFF) {
                         reason = "Failed to turn on radio.";
@@ -2530,17 +2710,6 @@
             return;
         }
 
-        ImsManager imsManager = mImsManager;
-        if (imsManager == null) {
-            // mImsManager is not null only while unit test.
-            imsManager = ImsManager.getInstance(phone.getContext(), phone.getPhoneId());
-        }
-        if (!imsManager.isNonTtyOrTtyOnVolteEnabled()) {
-            Log.w(this, "createEmergencyConnection - TTY on VoLTE is not supported.");
-            dialCsEmergencyCall(phone, resultConnection, request);
-            return;
-        }
-
         DomainSelectionConnection selectConnection =
                 mDomainSelectionResolver.getDomainSelectionConnection(
                         phone, SELECTOR_TYPE_CALLING, true);
@@ -2574,13 +2743,22 @@
             }
             Bundle extras = request.getExtras();
             extras.putInt(PhoneConstants.EXTRA_DIAL_DOMAIN, result);
+            if (resultConnection == mAlternateEmergencyConnection) {
+                extras.putBoolean(PhoneConstants.EXTRA_USE_EMERGENCY_ROUTING, true);
+            }
             CompletableFuture<Void> rejectFuture = checkAndRejectIncomingCall(phone, (ret) -> {
                 if (!ret) {
                     Log.i(this, "createEmergencyConnection reject incoming call failed");
                 }
             });
-            rejectFuture.thenRun(() -> placeEmergencyConnectionOnSelectedDomain(request,
-                    resultConnection, phone));
+            rejectFuture.thenRun(() -> {
+                if (resultConnection.getState() == Connection.STATE_DISCONNECTED) {
+                    Log.i(this, "createEmergencyConnection "
+                            + "reject incoming, dialing canceled");
+                    return;
+                }
+                placeEmergencyConnectionOnSelectedDomain(request, resultConnection, phone);
+            });
         }, mDomainSelectionMainExecutor);
     }
 
@@ -2600,8 +2778,14 @@
                             Log.i(this, "dialCsEmergencyCall reject incoming call failed");
                         }
                     });
-                    future.thenRun(() -> placeEmergencyConnectionOnSelectedDomain(request,
-                            resultConnection, phone));
+                    CompletableFuture<Void> unused = future.thenRun(() -> {
+                        if (resultConnection.getState() == Connection.STATE_DISCONNECTED) {
+                            Log.i(this, "dialCsEmergencyCall "
+                                    + "reject incoming, dialing canceled");
+                            return;
+                        }
+                        placeEmergencyConnectionOnSelectedDomain(request, resultConnection, phone);
+                    });
                 });
     }
 
@@ -2622,6 +2806,7 @@
             mEmergencyCallDomainSelectionConnection = null;
         }
         mIsEmergencyCallPending = false;
+        mAlternateEmergencyConnection = null;
         if (!isActive) {
             mEmergencyConnection = null;
         }
@@ -2646,7 +2831,8 @@
         Log.i(this, "maybeReselectDomain csCause=" +  callFailCause + ", psCause=" + reasonInfo);
         if (mEmergencyConnection == c) {
             if (mEmergencyCallDomainSelectionConnection != null) {
-                return maybeReselectDomainForEmergencyCall(c, callFailCause, reasonInfo);
+                return maybeReselectDomainForEmergencyCall(c, callFailCause, reasonInfo,
+                        showPreciseCause, overrideCause);
             }
             Log.i(this, "maybeReselectDomain endCall()");
             c.removeTelephonyConnectionListener(mEmergencyConnectionListener);
@@ -2660,13 +2846,15 @@
             int extraCode = reasonInfo.getExtraCode();
             if ((reasonCode == ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL)
                     || (reasonCode == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED
-                            && extraCode == ImsReasonInfo.EXTRA_CODE_CALL_RETRY_EMERGENCY)) {
+                            && extraCode == ImsReasonInfo.EXTRA_CODE_CALL_RETRY_EMERGENCY
+                            && mNormalRoutingEmergencyConnection != c)) {
                 // clear normal call domain selector
                 c.removeTelephonyConnectionListener(mNormalCallConnectionListener);
                 clearNormalCallDomainSelectionConnection();
                 mNormalCallConnection = null;
 
-                onEmergencyRedial(c, c.getPhone().getDefaultPhone());
+                mAlternateEmergencyConnection = c;
+                onEmergencyRedial(c, c.getPhone().getDefaultPhone(), false);
                 return true;
             }
         }
@@ -2675,9 +2863,11 @@
     }
 
     private boolean maybeReselectDomainForEmergencyCall(final TelephonyConnection c,
-            int callFailCause, ImsReasonInfo reasonInfo) {
+            int callFailCause, ImsReasonInfo reasonInfo,
+            boolean showPreciseCause, int overrideCause) {
         Log.i(this, "maybeReselectDomainForEmergencyCall "
-                + "csCause=" +  callFailCause + ", psCause=" + reasonInfo);
+                + "csCause=" +  callFailCause + ", psCause=" + reasonInfo
+                + ", showPreciseCause=" + showPreciseCause + ", overrideCause=" + overrideCause);
 
         if (c.getOriginalConnection() != null
                 && c.getOriginalConnection().getDisconnectCause()
@@ -2685,6 +2875,12 @@
                 && c.getOriginalConnection().getDisconnectCause()
                         != android.telephony.DisconnectCause.POWER_OFF) {
 
+            int disconnectCause = (overrideCause != android.telephony.DisconnectCause.NOT_VALID)
+                    ? overrideCause : c.getOriginalConnection().getDisconnectCause();
+            mEmergencyCallDomainSelectionConnection.setDisconnectCause(disconnectCause,
+                    showPreciseCause ? callFailCause : CallFailCause.NOT_VALID,
+                    c.getOriginalConnection().getVendorDisconnectCause());
+
             DomainSelectionService.SelectionAttributes attr =
                     EmergencyCallDomainSelectionConnection.getSelectionAttributes(
                             c.getPhone().getPhoneId(), c.getPhone().getSubId(), false,
@@ -2736,6 +2932,26 @@
         return true;
     }
 
+    private int getEmergencyCallRouting(Phone phone, String number, boolean needToTurnOnRadio) {
+        if (phone == null) {
+            return EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN;
+        }
+        // This method shall be called only if AOSP domain selection is enabled.
+        if (mDynamicRoutingController == null) {
+            mDynamicRoutingController = DynamicRoutingController.getInstance();
+        }
+        if (mDynamicRoutingController.isDynamicRoutingEnabled()) {
+            return mDynamicRoutingController.getEmergencyCallRouting(phone, number,
+                    isNormalRoutingNumber(phone, number),
+                    isEmergencyNumberAllowedOnDialedSim(phone, number),
+                    needToTurnOnRadio);
+        }
+
+        return isNormalRouting(phone, number)
+                ? EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL
+                : EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN;
+    }
+
     private boolean isNormalRouting(Phone phone, String number) {
         // Check isEmergencyNumberAllowedOnDialedSim(): some carriers do not want to handle
         // dial requests for numbers which are in the emergency number list on another SIM,
@@ -2772,6 +2988,25 @@
                 .findFirst().orElse(null);
     }
 
+    /**
+     * Determines the phone with which emergency callback mode was set.
+     * @return The {@link Phone} with which emergency callback mode was set,
+     *         or {@code null} if none was found.
+     */
+    @VisibleForTesting
+    public Phone getPhoneInEmergencyCallbackMode() {
+        if (!mDomainSelectionResolver.isDomainSelectionSupported()) {
+            // This is applicable for the AP domain selection service.
+            return null;
+        }
+        if (mEmergencyStateTracker == null) {
+            mEmergencyStateTracker = EmergencyStateTracker.getInstance();
+        }
+        return Stream.of(mPhoneFactoryProxy.getPhones())
+                .filter(p -> mEmergencyStateTracker.isInEcm(p))
+                .findFirst().orElse(null);
+    }
+
     private boolean isVoiceInService(Phone phone, boolean imsVoiceCapable) {
         // Dialing normal call is available.
         if (phone.isWifiCallingEnabled()) {
@@ -2851,7 +3086,7 @@
                 mNormalCallConnection = c;
 
                 future.thenAcceptAsync((result) -> {
-                    onNormalCallRedial(c, phone, result, videoState);
+                    onNormalCallRedial(phone, result, videoState, c);
                 }, mDomainSelectionMainExecutor);
                 return true;
             }
@@ -2871,13 +3106,31 @@
 
         final Bundle extras = new Bundle();
         extras.putInt(PhoneConstants.EXTRA_DIAL_DOMAIN, domain);
+        if (connection == mAlternateEmergencyConnection) {
+            extras.putBoolean(PhoneConstants.EXTRA_USE_EMERGENCY_ROUTING, true);
+            if (connection.getEmergencyServiceCategory() != null) {
+                extras.putInt(PhoneConstants.EXTRA_EMERGENCY_SERVICE_CATEGORY,
+                        connection.getEmergencyServiceCategory());
+            }
+            if (connection.getEmergencyUrns() != null) {
+                extras.putStringArrayList(PhoneConstants.EXTRA_EMERGENCY_URNS,
+                        new ArrayList<>(connection.getEmergencyUrns()));
+            }
+        }
 
         CompletableFuture<Void> future = checkAndRejectIncomingCall(phone, (ret) -> {
             if (!ret) {
                 Log.i(this, "onEmergencyRedialOnDomain reject incoming call failed");
             }
         });
-        future.thenRun(() -> onEmergencyRedialOnDomainInternal(connection, phone, extras));
+        CompletableFuture<Void> unused = future.thenRun(() -> {
+            if (connection.getState() == Connection.STATE_DISCONNECTED) {
+                Log.i(this, "onEmergencyRedialOnDomain "
+                        + "reject incoming, dialing canceled");
+                return;
+            }
+            onEmergencyRedialOnDomainInternal(connection, phone, extras);
+        });
     }
 
     private void onEmergencyRedialOnDomainInternal(TelephonyConnection connection,
@@ -2932,8 +3185,10 @@
     }
 
     @SuppressWarnings("FutureReturnValueIgnored")
-    private void onEmergencyRedial(final TelephonyConnection c, final Phone phone) {
-        Log.i(this, "onEmergencyRedial phoneId=" + phone.getPhoneId());
+    private void onEmergencyRedial(final TelephonyConnection c, final Phone phone,
+            boolean airplaneMode) {
+        Log.i(this, "onEmergencyRedial phoneId=" + phone.getPhoneId()
+                + ", ariplaneMode=" + airplaneMode);
 
         final String number = c.getAddress().getSchemeSpecificPart();
         final boolean isTestEmergencyNumber = isEmergencyNumberTestNumber(number);
@@ -2975,7 +3230,7 @@
                 DomainSelectionService.SelectionAttributes attr =
                         EmergencyCallDomainSelectionConnection.getSelectionAttributes(
                                 phone.getPhoneId(),
-                                phone.getSubId(), false,
+                                phone.getSubId(), airplaneMode,
                                 c.getTelecomCallId(),
                                 c.getAddress().getSchemeSpecificPart(), isTestEmergencyNumber,
                                 0, null, mEmergencyStateTracker.getEmergencyRegistrationResult());
@@ -2989,8 +3244,15 @@
                     recreateEmergencyConnection(c, phone, domain);
                     mIsEmergencyCallPending = false;
                 }, mDomainSelectionMainExecutor);
+            } else if (result == android.telephony.DisconnectCause.EMERGENCY_PERM_FAILURE) {
+                mEmergencyConnection.removeTelephonyConnectionListener(
+                        mEmergencyConnectionListener);
+                TelephonyConnection ec = mEmergencyConnection;
+                releaseEmergencyCallDomainSelection(true, false);
+                retryOutgoingOriginalConnection(ec, phone, true);
             } else {
                 mEmergencyConnection = null;
+                mAlternateEmergencyConnection = null;
                 c.setTelephonyConnectionDisconnected(
                         mDisconnectCauseFactory.toTelecomDisconnectCause(result, "unknown error"));
                 c.close();
@@ -3043,6 +3305,28 @@
         onEmergencyRedialOnDomain(connection, phone, result);
     }
 
+    private void onNormalCallRedial(Phone phone, @NetworkRegistrationInfo.Domain int domain,
+            int videoState, TelephonyConnection connection) {
+        if (mNormalRoutingEmergencyConnection == connection) {
+            CompletableFuture<Void> rejectFuture = checkAndRejectIncomingCall(phone, (ret) -> {
+                if (!ret) {
+                    Log.i(this, "onNormalCallRedial reject incoming call failed");
+                }
+            });
+            CompletableFuture<Void> unused = rejectFuture.thenRun(() -> {
+                if (connection.getState() == Connection.STATE_DISCONNECTED) {
+                    Log.i(this, "onNormalCallRedial "
+                            + "reject incoming, dialing canceled");
+                    return;
+                }
+                onNormalCallRedial(connection, phone, domain, videoState);
+            });
+            return;
+        }
+
+        onNormalCallRedial(connection, phone, domain, videoState);
+    }
+
     private void onNormalCallRedial(TelephonyConnection connection, Phone phone,
             @NetworkRegistrationInfo.Domain int domain, int videocallState) {
 
@@ -3093,6 +3377,12 @@
             releaseEmergencyCallDomainSelection(true, false);
             mEmergencyStateTracker.endCall(c);
         }
+        if (mNormalRoutingEmergencyConnection == c) {
+            Log.i(this, "onLocalHangup normal routing " + c.getTelecomCallId());
+            mNormalRoutingEmergencyConnection = null;
+            mEmergencyStateTracker.endNormalRoutingEmergencyCall(c);
+            mIsEmergencyCallPending = false;
+        }
     }
 
     @VisibleForTesting
@@ -3111,6 +3401,22 @@
     }
 
     @VisibleForTesting
+    public TelephonyConnection getNormalRoutingEmergencyConnection() {
+        return mNormalRoutingEmergencyConnection;
+    }
+
+    @VisibleForTesting
+    public void setNormalRoutingEmergencyConnection(TelephonyConnection c) {
+        mNormalRoutingEmergencyConnection = c;
+    }
+
+    @VisibleForTesting
+    public TelephonyConnection.TelephonyConnectionListener
+            getNormalRoutingEmergencyConnectionListener() {
+        return mNormalRoutingEmergencyConnectionListener;
+    }
+
+    @VisibleForTesting
     public TelephonyConnection.TelephonyConnectionListener
             getEmergencyConnectionSatelliteListener() {
         return mEmergencyConnectionSatelliteListener;
@@ -3275,6 +3581,15 @@
             return normalRoutingPhone;
         }
 
+        if (mDomainSelectionResolver.isDomainSelectionSupported()) {
+            Phone phoneInEcm = getPhoneInEmergencyCallbackMode();
+            if (phoneInEcm != null) {
+                Log.i(this, "getPhoneForAccount: in ECBM, using phoneId=%d/subId=%d",
+                        phoneInEcm.getPhoneId(), phoneInEcm.getSubId());
+                return phoneInEcm;
+            }
+        }
+
         // Default emergency call phone selection logic:
         // This is an emergency call and the phone we originally planned to make this call
         // with is not in service or was invalid, try to find one that is in service, using the
@@ -3490,9 +3805,20 @@
         }
 
         Call ringingCall = phone.getRingingCall();
-        if (ringingCall == null || !ringingCall.isRinging()) {
-            completeConsumer.accept(true);
-            return CompletableFuture.completedFuture(null);
+        if (ringingCall == null
+                || ringingCall.getState() == Call.State.IDLE
+                || ringingCall.getState() == Call.State.DISCONNECTED) {
+            // Check the ImsPhoneCall in DISCONNECTING state.
+            Phone imsPhone = phone.getImsPhone();
+            if (imsPhone != null) {
+                ringingCall = imsPhone.getRingingCall();
+            }
+            if (imsPhone == null || ringingCall == null
+                    || ringingCall.getState() == Call.State.IDLE
+                    || ringingCall.getState() == Call.State.DISCONNECTED) {
+                completeConsumer.accept(true);
+                return CompletableFuture.completedFuture(null);
+            }
         }
         Log.i(this, "checkAndRejectIncomingCall found a ringing call");
 
@@ -4418,12 +4744,19 @@
 
     private void handleEmergencyCallStartedForSatelliteSOSMessageRecommender(
             @NonNull TelephonyConnection connection, @NonNull Phone phone) {
+        if (!phone.getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_TELEPHONY_SATELLITE)) {
+            return;
+        }
+
         if (mSatelliteSOSMessageRecommender == null) {
             mSatelliteSOSMessageRecommender = new SatelliteSOSMessageRecommender(phone.getContext(),
                     phone.getContext().getMainLooper());
         }
         connection.addTelephonyConnectionListener(mEmergencyConnectionSatelliteListener);
         mSatelliteSOSMessageRecommender.onEmergencyCallStarted(connection);
+        mSatelliteSOSMessageRecommender.onEmergencyCallConnectionStateChanged(
+                connection.getTelecomCallId(), connection.STATE_DIALING);
     }
 
     /**
@@ -4441,26 +4774,30 @@
             return false;
         }
 
-        ServiceState serviceState = phone.getServiceState();
-        if (serviceState == null) {
-            return false;
-        }
-
-        if (!serviceState.isUsingNonTerrestrialNetwork()) {
+        if (!mSatelliteController.isInSatelliteModeForCarrierRoaming(phone)) {
             // Device is not connected to satellite
             return false;
         }
 
-        for (NetworkRegistrationInfo nri : serviceState.getNetworkRegistrationInfoList()) {
-            if (nri.isNonTerrestrialNetwork()
-                    && nri.getAvailableServices().contains(
-                    NetworkRegistrationInfo.SERVICE_TYPE_VOICE)) {
-                // Call is supported while using satellite
-                return false;
-            }
+        List<Integer> capabilities =
+                mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(phone);
+        if (capabilities.contains(NetworkRegistrationInfo.SERVICE_TYPE_VOICE)) {
+            // Call is supported while using satellite
+            return false;
         }
 
         // Call is disallowed while using satellite
         return true;
     }
+
+    private boolean getTurnOffOemEnabledSatelliteDuringEmergencyCall() {
+        boolean turnOffSatellite = false;
+        try {
+            turnOffSatellite = getApplicationContext().getResources().getBoolean(
+                    R.bool.config_turn_off_oem_enabled_satellite_during_emergency_call);
+        } catch (Resources.NotFoundException ex) {
+            Log.e(this, ex, "getTurnOffOemEnabledSatelliteDuringEmergencyCall: ex=" + ex);
+        }
+        return turnOffSatellite;
+    }
 }
diff --git a/src/com/android/services/telephony/domainselection/CarrierConfigHelper.java b/src/com/android/services/telephony/domainselection/CarrierConfigHelper.java
deleted file mode 100644
index d39a6b7..0000000
--- a/src/com/android/services/telephony/domainselection/CarrierConfigHelper.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.services.telephony.domainselection;
-
-import static android.telephony.AccessNetworkConstants.AccessNetworkType.NGRAN;
-import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.PersistableBundle;
-import android.os.SystemProperties;
-import android.preference.PreferenceManager;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.util.ArrayMap;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.phone.R;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/** Helper class to cache carrier configurations. */
-public class CarrierConfigHelper extends Handler {
-    private static final String TAG = "CarrierConfigHelper";
-    private static final boolean DBG = (SystemProperties.getInt("ro.debuggable", 0) == 1);
-
-    @VisibleForTesting
-    public static final String KEY_VONR_EMERGENCY_SUPPORT = "vonr_emergency_support";
-
-    private final Context mContext;
-    private final CarrierConfigManager mConfigManager;
-    private final TelephonyManager mTelephonyManager;
-    private final ArrayMap<Integer, Boolean> mVoNrSupported = new ArrayMap<>();
-
-    private final CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener =
-            (slotIndex, subId, carrierId, specificCarrierId) -> onCarrierConfigurationChanged(
-                    slotIndex, subId, carrierId);
-
-    // For test purpose only
-    private final SharedPreferences mSharedPreferences;
-
-    private List<Integer> mIgnoreNrWhenSimRemoved = null;
-
-    /**
-     * Creates an instance.
-     *
-     * @param context The Context this is associated with.
-     * @param looper The Looper to run the CarrierConfigHelper.
-     */
-    public CarrierConfigHelper(@NonNull Context context, @NonNull Looper looper) {
-        this(context, looper, null);
-    }
-
-    /**
-     * Creates an instance.
-     *
-     * @param context The Context this is associated with.
-     * @param looper The Looper to run the CarrierConfigHelper.
-     * @param sharedPreferences The SharedPreferences instance.
-     */
-    @VisibleForTesting
-    public CarrierConfigHelper(@NonNull Context context, @NonNull Looper looper,
-            @Nullable SharedPreferences sharedPreferences) {
-        super(looper);
-
-        mContext = context;
-        mTelephonyManager = context.getSystemService(TelephonyManager.class);
-        mConfigManager = context.getSystemService(CarrierConfigManager.class);
-        mConfigManager.registerCarrierConfigChangeListener(this::post,
-                mCarrierConfigChangeListener);
-        mSharedPreferences = sharedPreferences;
-
-        readFromSharedPreference();
-        readResourceConfiguration();
-    }
-
-    /**
-     * Returns whether VoNR emergency was supported with the last valid subscription.
-     *
-     * @param slotIndex The SIM slot index.
-     * @return true if VoNR emergency was supported with the last valid subscription.
-     *         Otherwise, false.
-     */
-    public boolean isVoNrEmergencySupported(int slotIndex) {
-        return mVoNrSupported.get(Integer.valueOf(slotIndex));
-    }
-
-    @Override
-    public void handleMessage(Message msg) {
-        switch(msg.what) {
-            default:
-                super.handleMessage(msg);
-                break;
-        }
-    }
-
-    private void readFromSharedPreference() {
-        mVoNrSupported.clear();
-        int modemCount = mTelephonyManager.getActiveModemCount();
-        SharedPreferences sp = (mSharedPreferences != null) ? mSharedPreferences
-                : PreferenceManager.getDefaultSharedPreferences(mContext);
-        for (int i = 0; i < modemCount; i++) {
-            Boolean savedConfig = Boolean.valueOf(
-                    sp.getBoolean(KEY_VONR_EMERGENCY_SUPPORT + i, false));
-            mVoNrSupported.put(Integer.valueOf(i), savedConfig);
-            Log.i(TAG, "readFromSharedPreference slot=" + i + ", " + savedConfig);
-        }
-    }
-
-    private void onCarrierConfigurationChanged(int slotIndex, int subId, int carrierId) {
-        Log.i(TAG, "onCarrierConfigurationChanged slotIndex=" + slotIndex
-                + ", subId=" + subId + ", carrierId=" + carrierId);
-
-        if (slotIndex < 0
-                || !SubscriptionManager.isValidSubscriptionId(subId)
-                || mTelephonyManager.getSimState(slotIndex) != TelephonyManager.SIM_STATE_READY) {
-            return;
-        }
-
-        PersistableBundle b = mConfigManager.getConfigForSubId(subId,
-                KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY);
-        if (b.isEmpty()) {
-            Log.e(TAG, "onCarrierConfigurationChanged empty result");
-            return;
-        }
-
-        if (!CarrierConfigManager.isConfigForIdentifiedCarrier(b)) {
-            Log.i(TAG, "onCarrierConfigurationChanged not carrier specific configuration");
-            return;
-        }
-
-        int[] imsRatsConfig = b.getIntArray(
-                KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY);
-        if (imsRatsConfig == null) imsRatsConfig = new int[0];
-        boolean carrierConfig = false;
-        for (int i = 0; i < imsRatsConfig.length; i++) {
-            if (imsRatsConfig[i] == NGRAN) {
-                carrierConfig = true;
-                break;
-            }
-        }
-        if (mIgnoreNrWhenSimRemoved.contains(carrierId)) carrierConfig = false;
-
-        Boolean savedConfig = mVoNrSupported.get(Integer.valueOf(slotIndex));
-        if (carrierConfig == savedConfig) {
-            return;
-        }
-
-        mVoNrSupported.put(Integer.valueOf(slotIndex), Boolean.valueOf(carrierConfig));
-
-        SharedPreferences sp = (mSharedPreferences != null) ? mSharedPreferences
-                : PreferenceManager.getDefaultSharedPreferences(mContext);
-        SharedPreferences.Editor editor = sp.edit();
-        editor.putBoolean(KEY_VONR_EMERGENCY_SUPPORT + slotIndex, carrierConfig);
-        editor.apply();
-
-        Log.i(TAG, "onCarrierConfigurationChanged preference updated slotIndex=" + slotIndex
-                + ", supported=" + carrierConfig);
-    }
-
-    private void readResourceConfiguration() {
-        try {
-            mIgnoreNrWhenSimRemoved = Arrays.stream(mContext.getResources().getIntArray(
-                    R.array.config_carriers_ignore_ngran_preference_when_sim_removed))
-                    .boxed().collect(Collectors.toList());
-        } catch (Resources.NotFoundException nfe) {
-            Log.e(TAG, "readResourceConfiguration exception=" + nfe);
-        } catch (NullPointerException npe) {
-            Log.e(TAG, "readResourceConfiguration exception=" + npe);
-        }
-        if (mIgnoreNrWhenSimRemoved == null) {
-            mIgnoreNrWhenSimRemoved = new ArrayList<Integer>();
-        }
-        Log.i(TAG, "readResourceConfiguration ignoreNrWhenSimRemoved=" + mIgnoreNrWhenSimRemoved);
-    }
-
-    /** Destroys the instance. */
-    public void destroy() {
-        if (DBG) Log.d(TAG, "destroy");
-        mConfigManager.unregisterCarrierConfigChangeListener(mCarrierConfigChangeListener);
-    }
-}
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelper.java b/src/com/android/services/telephony/domainselection/DataConnectionStateHelper.java
similarity index 77%
rename from src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelper.java
rename to src/com/android/services/telephony/domainselection/DataConnectionStateHelper.java
index cdf2225..8fbf7e3 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelper.java
+++ b/src/com/android/services/telephony/domainselection/DataConnectionStateHelper.java
@@ -16,7 +16,6 @@
 
 package com.android.services.telephony.domainselection;
 
-import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL;
 import static android.telephony.SubscriptionManager.EXTRA_SLOT_INDEX;
 import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
 import static android.telephony.TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED;
@@ -29,11 +28,11 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.os.PersistableBundle;
 import android.os.SystemProperties;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.CarrierConfigManager;
 import android.telephony.PreciseDataConnectionState;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyCallback;
 import android.telephony.TelephonyManager;
 import android.telephony.data.ApnSetting;
@@ -41,8 +40,8 @@
 import android.util.Log;
 
 /** Helper class to cache emergency data connection state. */
-public class EmergencyCallbackModeHelper extends Handler {
-    private static final String TAG = "EmergencyCallbackModeHelper";
+public class DataConnectionStateHelper extends Handler {
+    private static final String TAG = "DataConnectionStateHelper";
     private static final boolean DBG = (SystemProperties.getInt("ro.debuggable", 0) == 1);
 
     /**
@@ -53,14 +52,19 @@
 
         private final Handler mHandler;
         private final TelephonyManager mTelephonyManager;
+        private final DataConnectionStateHelper mOwner;
         private final int mSubId;
+        private final int mSlotIndex;
         private int mTransportType = AccessNetworkConstants.TRANSPORT_TYPE_INVALID;
         private int mState = TelephonyManager.DATA_UNKNOWN;
 
-        DataConnectionStateListener(Handler handler, TelephonyManager tm, int subId) {
+        DataConnectionStateListener(Handler handler, TelephonyManager tm,
+                DataConnectionStateHelper owner, int subId, int slotIndex) {
             mHandler = handler;
             mTelephonyManager = tm;
+            mOwner = owner;
             mSubId = subId;
+            mSlotIndex = slotIndex;
         }
 
         @Override
@@ -73,16 +77,19 @@
             }
             mTransportType = dataConnectionState.getTransportType();
             mState = dataConnectionState.getState();
+            mOwner.notifyDataConnectionStateChange(mSlotIndex, mState);
             Log.i(TAG, "onPreciseDataConnectionStateChanged ePDN state=" + mState
-                    + ", transport=" + mTransportType);
+                    + ", transport=" + mTransportType + ", subId=" + mSubId);
         }
 
         public void registerTelephonyCallback() {
+            Log.i(TAG, "registerTelephonyCallback subId=" + mSubId);
             TelephonyManager tm = mTelephonyManager.createForSubscriptionId(mSubId);
             tm.registerTelephonyCallback(mHandler::post, this);
         }
 
         public void unregisterTelephonyCallback() {
+            Log.i(TAG, "unregisterTelephonyCallback subId=" + mSubId);
             mTelephonyManager.unregisterTelephonyCallback(this);
         }
 
@@ -110,13 +117,15 @@
             (slotIndex, subId, carrierId, specificCarrierId) -> onCarrierConfigChanged(
                     slotIndex, subId, carrierId);
 
+    private EmergencyCallDomainSelector mSelector;
+
     /**
      * Creates an instance.
      *
      * @param context The Context this is associated with.
-     * @param looper The Looper to run the EmergencyCallbackModeHelper.
+     * @param looper The Looper to run the DataConnectionStateHelper.
      */
-    public EmergencyCallbackModeHelper(@NonNull Context context, @NonNull Looper looper) {
+    public DataConnectionStateHelper(@NonNull Context context, @NonNull Looper looper) {
         super(looper);
 
         mContext = context;
@@ -133,10 +142,6 @@
      * @return true if it is in emergency callback mode.
      */
     public boolean isInEmergencyCallbackMode(int slotIndex) {
-        DataConnectionStateListener listener =
-                mDataConnectionStateListeners.get(Integer.valueOf(slotIndex));
-        if (listener == null) return false;
-
         Intent intent = mContext.registerReceiver(null,
                 new IntentFilter(ACTION_EMERGENCY_CALLBACK_MODE_CHANGED));
         if (intent != null
@@ -177,6 +182,24 @@
         return listener.getState();
     }
 
+    /**
+     * Sets the EmergencyCallDomainSelector instance.
+     *
+     * @param selector The instance of {@link EmergencyCallDomainSelector}.
+     */
+    public void setEmergencyCallDomainSelector(EmergencyCallDomainSelector selector) {
+        mSelector = selector;
+    }
+
+    private void notifyDataConnectionStateChange(int slotIndex, int state) {
+        EmergencyCallDomainSelector selector = mSelector;
+        if (selector != null) {
+            Log.i(TAG, "notifyDataConnectionStateChange slot=" + slotIndex + ", state=" + state);
+            selector.notifyDataConnectionStateChange(slotIndex, state);
+        }
+    }
+
+
     @Override
     public void handleMessage(Message msg) {
         switch(msg.what) {
@@ -194,35 +217,22 @@
             return;
         }
 
-        PersistableBundle b = mConfigManager.getConfigForSubId(subId,
-                KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL);
+        DataConnectionStateListener listener =
+                mDataConnectionStateListeners.get(Integer.valueOf(slotIndex));
 
-        if (b.getBoolean(KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL)) {
-            // ECBM supported
-            DataConnectionStateListener listener =
-                    mDataConnectionStateListeners.get(Integer.valueOf(slotIndex));
+        // Remove stale listener.
+        if (listener != null && listener.getSubId() != subId) {
+            listener.unregisterTelephonyCallback();
+            mDataConnectionStateListeners.remove(Integer.valueOf(slotIndex));
+            listener = null;
+        }
 
-            // Remove stale listener.
-            if (listener != null && listener.getSubId() != subId) {
-                listener.unregisterTelephonyCallback();
-                listener = null;
-            }
-
-            if (listener == null) {
-                listener = new DataConnectionStateListener(this, mTelephonyManager, subId);
-                listener.registerTelephonyCallback();
-                mDataConnectionStateListeners.put(Integer.valueOf(slotIndex), listener);
-                Log.i(TAG, "onCarrierConfigChanged register callback");
-            }
-        } else {
-            // ECBM not supported
-            DataConnectionStateListener listener =
-                    mDataConnectionStateListeners.get(Integer.valueOf(slotIndex));
-            if (listener != null) {
-                listener.unregisterTelephonyCallback();
-                mDataConnectionStateListeners.remove(Integer.valueOf(slotIndex));
-                Log.i(TAG, "onCarrierConfigChanged unregister callback");
-            }
+        if (listener == null
+                && SubscriptionManager.isValidSubscriptionId(subId)) {
+            listener = new DataConnectionStateListener(this, mTelephonyManager,
+                    this, subId, slotIndex);
+            listener.registerTelephonyCallback();
+            mDataConnectionStateListeners.put(Integer.valueOf(slotIndex), listener);
         }
     }
 
diff --git a/src/com/android/services/telephony/domainselection/DynamicRoutingController.java b/src/com/android/services/telephony/domainselection/DynamicRoutingController.java
new file mode 100644
index 0000000..2690847
--- /dev/null
+++ b/src/com/android/services/telephony/domainselection/DynamicRoutingController.java
@@ -0,0 +1,389 @@
+/*
+ * Copyright (C) 2024 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.services.telephony.domainselection;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.os.SystemProperties;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.LocaleTracker;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.ServiceStateTracker;
+import com.android.phone.R;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Manages dynamic routing of emergency numbers.
+ *
+ * Normal routing shall be tried if noraml service is available.
+ * Otherwise, emergency routing shall be tried.
+ */
+public class DynamicRoutingController {
+    private static final String TAG = "DynamicRoutingController";
+    private static final boolean DBG = (SystemProperties.getInt("ro.debuggable", 0) == 1);
+
+    private static final DynamicRoutingController sInstance =
+            new DynamicRoutingController();
+
+    /** PhoneFactory Dependencies for testing. */
+    @VisibleForTesting
+    public interface PhoneFactoryProxy {
+        Phone getPhone(int phoneId);
+    }
+
+    private static class PhoneFactoryProxyImpl implements PhoneFactoryProxy {
+        @Override
+        public Phone getPhone(int phoneId) {
+            return PhoneFactory.getPhone(phoneId);
+        }
+    }
+
+    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(
+                    TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED)) {
+                int phoneId = intent.getIntExtra(PhoneConstants.PHONE_KEY, -1);
+                String countryIso = intent.getStringExtra(
+                        TelephonyManager.EXTRA_NETWORK_COUNTRY);
+                Log.i(TAG, "ACTION_NETWORK_COUNTRY_CHANGED phoneId: " + phoneId
+                        + " countryIso: " + countryIso);
+                if (TextUtils.isEmpty(countryIso)) {
+                    countryIso = getLastKnownCountryIso(phoneId);
+                    if (TextUtils.isEmpty(countryIso)) {
+                        return;
+                    }
+                }
+                String prevIso = mNetworkCountries.get(Integer.valueOf(phoneId));
+                if (!TextUtils.equals(prevIso, countryIso)) {
+                    mNetworkCountries.put(Integer.valueOf(phoneId), countryIso);
+                    updateDynamicEmergencyNumbers(phoneId);
+                }
+                mLastCountryIso = countryIso;
+            }
+        }
+    };
+
+    private String getLastKnownCountryIso(int phoneId) {
+        try {
+            Phone phone = mPhoneFactoryProxy.getPhone(phoneId);
+            if (phone == null) return "";
+
+            ServiceStateTracker sst = phone.getServiceStateTracker();
+            if (sst == null) return "";
+
+            LocaleTracker lt = sst.getLocaleTracker();
+            if (lt != null) {
+                String iso = lt.getLastKnownCountryIso();
+                Log.e(TAG, "getLastKnownCountryIso iso=" + iso);
+                return iso;
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "getLastKnownCountryIso e=" + e);
+        }
+        return "";
+    }
+
+    private final PhoneFactoryProxy mPhoneFactoryProxy;
+    private final ArrayMap<Integer, String> mNetworkCountries = new ArrayMap<>();
+    private final ArrayMap<Integer, List<EmergencyNumber>> mEmergencyNumbers = new ArrayMap<>();
+
+    private String mLastCountryIso;
+    private boolean mEnabled;
+    private List<String> mCountriesEnabled = null;
+    private List<String> mDynamicNumbers = null;
+
+
+    /**
+     * Returns the singleton instance of DynamicRoutingController.
+     *
+     * @return A {@link DynamicRoutingController} instance.
+     */
+    public static DynamicRoutingController getInstance() {
+        return sInstance;
+    }
+
+    private DynamicRoutingController() {
+          this(new PhoneFactoryProxyImpl());
+    }
+
+    @VisibleForTesting
+    public DynamicRoutingController(PhoneFactoryProxy phoneFactoryProxy) {
+        mPhoneFactoryProxy = phoneFactoryProxy;
+    }
+
+    /**
+     * Initializes the instance.
+     *
+     * @param context The context of the application.
+     */
+    public void initialize(Context context) {
+        try {
+            mEnabled = context.getResources().getBoolean(R.bool.dynamic_routing_emergency_enabled);
+        } catch (Resources.NotFoundException nfe) {
+            Log.e(TAG, "init exception=" + nfe);
+        } catch (NullPointerException npe) {
+            Log.e(TAG, "init exception=" + npe);
+        }
+
+        mCountriesEnabled = readResourceConfiguration(context,
+                R.array.config_countries_dynamic_routing_emergency_enabled);
+
+        mDynamicNumbers = readResourceConfiguration(context,
+                R.array.config_dynamic_routing_emergency_numbers);
+
+        Log.i(TAG, "init enabled=" + mEnabled + ", countriesEnabled=" + mCountriesEnabled);
+
+        if (mEnabled) {
+            //register country change listener
+            IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED);
+            context.registerReceiver(mIntentReceiver, filter);
+        }
+    }
+
+    private List<String> readResourceConfiguration(Context context, int id) {
+        Log.i(TAG, "readResourceConfiguration id=" + id);
+
+        List<String> resource = null;
+        try {
+            resource = Arrays.asList(context.getResources().getStringArray(id));
+        } catch (Resources.NotFoundException nfe) {
+            Log.e(TAG, "readResourceConfiguration exception=" + nfe);
+        } catch (NullPointerException npe) {
+            Log.e(TAG, "readResourceConfiguration exception=" + npe);
+        } finally {
+            if (resource == null) {
+                resource = new ArrayList<String>();
+            }
+        }
+        return resource;
+    }
+
+    /**
+     * Returns whether the dynamic routing feature is enabled.
+     */
+    public boolean isDynamicRoutingEnabled() {
+        Log.i(TAG, "isDynamicRoutingEnabled " + mEnabled);
+        return mEnabled;
+    }
+
+    /**
+     * Returns whether the dynamic routing is enabled with the given {@link Phone}.
+     * @param phone A {@link Phone} instance.
+     */
+    public boolean isDynamicRoutingEnabled(Phone phone) {
+        Log.i(TAG, "isDynamicRoutingEnabled");
+        if (phone == null) return false;
+        String iso = mNetworkCountries.get(Integer.valueOf(phone.getPhoneId()));
+        Log.i(TAG, "isDynamicRoutingEnabled phoneId=" + phone.getPhoneId() + ", iso=" + iso
+                + ", lastIso=" + mLastCountryIso);
+        if (TextUtils.isEmpty(iso)) {
+            iso = mLastCountryIso;
+        }
+        boolean ret = mEnabled && mCountriesEnabled.contains(iso);
+        Log.i(TAG, "isDynamicRoutingEnabled returns " + ret);
+        return ret;
+    }
+
+    /**
+     * Returns emergency call routing that to be used for the given number.
+     * @param phone A {@link Phone} instance.
+     * @param number The dialed number.
+     * @param isNormal Indicates whether it is normal routing number.
+     * @param isAllowed Indicates whether it is allowed emergency number.
+     * @param needToTurnOnRadio Indicates whether it needs to turn on radio power.
+     */
+    public int getEmergencyCallRouting(Phone phone, String number,
+            boolean isNormal, boolean isAllowed, boolean needToTurnOnRadio) {
+        Log.i(TAG, "getEmergencyCallRouting isNormal=" + isNormal + ", isAllowed=" + isAllowed
+                + ", needToTurnOnRadio=" + needToTurnOnRadio);
+        number = PhoneNumberUtils.stripSeparators(number);
+        boolean isDynamic = isDynamicNumber(phone, number);
+        if ((!isNormal && !isDynamic && isAllowed) || isFromNetworkOrSim(phone, number)) {
+            return EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN;
+        }
+        if (isDynamicRoutingEnabled(phone)) {
+            // If airplane mode is enabled, check the service state
+            // after turning on the radio power.
+            return (phone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE
+                    || needToTurnOnRadio)
+                    ? EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL
+                    : EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY;
+        }
+        return EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL;
+    }
+
+    private boolean isFromNetworkOrSim(Phone phone, String number) {
+        if (phone == null) return false;
+        Log.i(TAG, "isFromNetworkOrSim phoneId=" + phone.getPhoneId());
+        if (phone.getEmergencyNumberTracker() == null) return false;
+        for (EmergencyNumber num : phone.getEmergencyNumberTracker().getEmergencyNumbers(
+                number)) {
+            if (num.getNumber().equals(number)) {
+                if (num.isFromSources(EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING)
+                        || num.isFromSources(EmergencyNumber.EMERGENCY_NUMBER_SOURCE_SIM)) {
+                    Log.i(TAG, "isFromNetworkOrSim SIM or NETWORK emergency number");
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private String getNetworkCountryIso(int phoneId) {
+        String iso = mNetworkCountries.get(Integer.valueOf(phoneId));
+        if (TextUtils.isEmpty(iso)) {
+            iso = mLastCountryIso;
+        }
+        return iso;
+    }
+
+    @VisibleForTesting
+    public boolean isDynamicNumber(Phone phone, String number) {
+        if (phone == null || phone.getEmergencyNumberTracker() == null
+                || TextUtils.isEmpty(number)
+                || mDynamicNumbers == null || mDynamicNumbers.isEmpty()) {
+            return false;
+        }
+
+        List<EmergencyNumber> emergencyNumbers =
+                mEmergencyNumbers.get(Integer.valueOf(phone.getPhoneId()));
+        if (emergencyNumbers == null) {
+            updateDynamicEmergencyNumbers(phone.getPhoneId());
+            emergencyNumbers =
+                    mEmergencyNumbers.get(Integer.valueOf(phone.getPhoneId()));
+        }
+        String iso = getNetworkCountryIso(phone.getPhoneId());
+        if (TextUtils.isEmpty(iso)
+                || emergencyNumbers == null || emergencyNumbers.isEmpty()) {
+            return false;
+        }
+
+        // Filter the list with the number.
+        List<EmergencyNumber> dynamicNumbers =
+                getDynamicEmergencyNumbers(emergencyNumbers, number);
+
+        // Compare the dynamicNumbers with the list of EmergencyNumber from EmergencyNumberTracker.
+        emergencyNumbers = phone.getEmergencyNumberTracker().getEmergencyNumbers(number);
+
+        if (dynamicNumbers == null || emergencyNumbers == null
+                || dynamicNumbers.isEmpty() || emergencyNumbers.isEmpty()) {
+            return false;
+        }
+
+        if (DBG) {
+            Log.i(TAG, "isDynamicNumber " + emergencyNumbers);
+        }
+
+        // Compare coutry ISO and MNC. MNC is optional.
+        for (EmergencyNumber dynamicNumber: dynamicNumbers) {
+            if (emergencyNumbers.stream().anyMatch(n ->
+                    TextUtils.equals(n.getCountryIso(), dynamicNumber.getCountryIso())
+                    && (TextUtils.equals(n.getMnc(), dynamicNumber.getMnc())
+                    || TextUtils.isEmpty(dynamicNumber.getMnc())))) {
+                Log.i(TAG, "isDynamicNumber found");
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** Filter the list of {@link EmergencyNumber} with given number. */
+    private static List<EmergencyNumber> getDynamicEmergencyNumbers(
+            List<EmergencyNumber> emergencyNumbers, String number) {
+        List<EmergencyNumber> filteredNumbers = emergencyNumbers.stream()
+                .filter(num -> num.getNumber().equals(number))
+                .toList();
+
+        if (DBG) {
+            Log.i(TAG, "getDynamicEmergencyNumbers " + filteredNumbers);
+        }
+        return filteredNumbers;
+    }
+
+    /**
+     * Generates the lis of {@link EmergencyNumber} for the given phoneId
+     * based on the detected country from the resource configuration.
+     */
+    private void updateDynamicEmergencyNumbers(int phoneId) {
+        if (mDynamicNumbers == null || mDynamicNumbers.isEmpty()) {
+            // No resource configuration.
+            mEmergencyNumbers.put(Integer.valueOf(phoneId),
+                    new ArrayList<EmergencyNumber>());
+            return;
+        }
+
+        String iso = getNetworkCountryIso(phoneId);
+        if (TextUtils.isEmpty(iso)) {
+            // Update again later.
+            return;
+        }
+        List<EmergencyNumber> emergencyNumbers = new ArrayList<EmergencyNumber>();
+        for (String numberInfo : mDynamicNumbers) {
+            if (!TextUtils.isEmpty(numberInfo) && numberInfo.startsWith(iso)) {
+                emergencyNumbers.addAll(getEmergencyNumbers(numberInfo));
+            }
+        }
+        mEmergencyNumbers.put(Integer.valueOf(phoneId), emergencyNumbers);
+    }
+
+    /** Returns an {@link EmergencyNumber} instance from the resource configuration. */
+    private List<EmergencyNumber> getEmergencyNumbers(String numberInfo) {
+        ArrayList<EmergencyNumber> emergencyNumbers = new ArrayList<EmergencyNumber>();
+        if (TextUtils.isEmpty(numberInfo)) {
+            return emergencyNumbers;
+        }
+
+        String[] fields = numberInfo.split(",");
+        // Format: "iso,mnc,number1,number2,..."
+        if (fields == null || fields.length < 3
+                || TextUtils.isEmpty(fields[0])
+                || TextUtils.isEmpty(fields[2])) {
+            return emergencyNumbers;
+        }
+
+        for (int i = 2; i < fields.length; i++) {
+            if (TextUtils.isEmpty(fields[i])) {
+                continue;
+            }
+            emergencyNumbers.add(new EmergencyNumber(fields[i] /* number */,
+                fields[0] /* iso */, fields[1] /* mnc */,
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED,
+                new ArrayList<String>(),
+                EmergencyNumber.EMERGENCY_NUMBER_SOURCE_DATABASE,
+                EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN));
+        }
+
+        return emergencyNumbers;
+    }
+}
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 962cbf1..9f2e0a9 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -18,6 +18,7 @@
 
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.CDMA2000;
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.EUTRAN;
+import static android.telephony.AccessNetworkConstants.AccessNetworkType.GERAN;
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.NGRAN;
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.UNKNOWN;
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.UTRAN;
@@ -25,6 +26,7 @@
 import static android.telephony.AccessNetworkConstants.TRANSPORT_TYPE_WLAN;
 import static android.telephony.AccessNetworkConstants.TRANSPORT_TYPE_WWAN;
 import static android.telephony.BarringInfo.BARRING_SERVICE_TYPE_EMERGENCY;
+import static android.telephony.CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL;
 import static android.telephony.CarrierConfigManager.ImsEmergency.DOMAIN_CS;
 import static android.telephony.CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP;
 import static android.telephony.CarrierConfigManager.ImsEmergency.DOMAIN_PS_NON_3GPP;
@@ -42,6 +44,7 @@
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_REQUIRES_VOLTE_ENABLED_BOOL;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_SCAN_TIMER_SEC_INT;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_VOWIFI_REQUIRES_CONDITION_INT;
+import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_IMS_REASONINFO_CODE_TO_RETRY_EMERGENCY_INT_ARRAY;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_MAXIMUM_NUMBER_OF_EMERGENCY_TRIES_OVER_VOWIFI_INT;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_PREFER_IMS_EMERGENCY_WHEN_VOICE_CALLS_ON_CS_BOOL;
@@ -54,8 +57,13 @@
 import static android.telephony.NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING;
 import static android.telephony.PreciseDisconnectCause.EMERGENCY_PERM_FAILURE;
 import static android.telephony.PreciseDisconnectCause.EMERGENCY_TEMP_FAILURE;
+import static android.telephony.PreciseDisconnectCause.NO_VALID_SIM;
 import static android.telephony.PreciseDisconnectCause.SERVICE_OPTION_NOT_AVAILABLE;
+import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING;
 import static android.telephony.TelephonyManager.DATA_CONNECTED;
+import static android.telephony.TelephonyManager.DATA_DISCONNECTED;
+import static android.telephony.TelephonyManager.DATA_DISCONNECTING;
+import static android.telephony.TelephonyManager.DATA_UNKNOWN;
 
 import android.annotation.NonNull;
 import android.content.Context;
@@ -70,6 +78,7 @@
 import android.os.PersistableBundle;
 import android.os.PowerManager;
 import android.os.SystemProperties;
+import android.telecom.TelecomManager;
 import android.telephony.AccessNetworkConstants.AccessNetworkType;
 import android.telephony.AccessNetworkConstants.RadioAccessNetworkType;
 import android.telephony.AccessNetworkConstants.TransportType;
@@ -80,6 +89,7 @@
 import android.telephony.DomainSelectionService.SelectionAttributes;
 import android.telephony.EmergencyRegistrationResult;
 import android.telephony.NetworkRegistrationInfo;
+import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.TransportSelectorCallback;
@@ -97,6 +107,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.IntFunction;
+import java.util.stream.Collectors;
 
 /**
  * Selects the domain for emergency calling.
@@ -107,19 +118,46 @@
     private static final boolean DBG = (SystemProperties.getInt("ro.debuggable", 0) == 1);
     private static final int LOG_SIZE = 50;
 
+    /**
+     * Timeout before we requests network scan without waiting for the disconnection
+     * of ePDN.
+     */
+    private static final int DEFAULT_DATA_DISCONNECTION_TIMEOUT_MS = 2 * 1000; // 2 seconds
+
+    /**
+     * Timeout of waiting for the IMS state change before selecting domain from initial state.
+     */
+    private static final int DEFAULT_WAIT_FOR_IMS_STATE_TIMEOUT_MS = 3 * 1000; // 3 seconds
+
     private static final int MSG_START_DOMAIN_SELECTION = 11;
     @VisibleForTesting
     public static final int MSG_NETWORK_SCAN_TIMEOUT = 12;
     private static final int MSG_NETWORK_SCAN_RESULT = 13;
     @VisibleForTesting
     public static final int MSG_MAX_CELLULAR_TIMEOUT = 14;
+    @VisibleForTesting
+    public static final int MSG_WAIT_DISCONNECTION_TIMEOUT = 15;
+    @VisibleForTesting
+    public static final int MSG_WAIT_FOR_IMS_STATE_TIMEOUT = 16;
+    private static final int MSG_WIFI_AVAILABLE = 17;
 
     private static final int NOT_SUPPORTED = -1;
 
+    private static List<Integer> sDefaultRetryReasonCodes = List.of(
+            ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED,
+            ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR,
+            ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED,
+            ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL);
+
+    private static List<Integer> sDisconnectCauseForTerminatation = List.of(
+            SERVICE_OPTION_NOT_AVAILABLE);
+
     private static final LocalLog sLocalLog = new LocalLog(LOG_SIZE);
 
     private static List<String> sSimReadyAllowList;
     private static List<String> sPreferSlotWithNormalServiceList;
+    private static List<String> sPreferCsAfterCsfbFailure;
+    private static List<String> sPreferGeranWhenSimAbsent;
 
     /**
      * Network callback used to determine whether Wi-Fi is connected or not.
@@ -129,18 +167,30 @@
                 @Override
                 public void onAvailable(Network network) {
                     logi("onAvailable: " + network);
+                    if (network != null && !mWiFiNetworksAvailable.contains(network)) {
+                        mWiFiNetworksAvailable.add(network);
+                    }
                     mWiFiAvailable = true;
+                    sendEmptyMessage(MSG_WIFI_AVAILABLE);
                 }
 
                 @Override
                 public void onLost(Network network) {
                     logi("onLost: " + network);
+                    if (network != null) {
+                        mWiFiNetworksAvailable.remove(network);
+                    }
+                    if (!mWiFiNetworksAvailable.isEmpty()) {
+                        logi("onLost: available networks=" + mWiFiNetworksAvailable);
+                        return;
+                    }
                     mWiFiAvailable = false;
                 }
 
                 @Override
                 public void onUnavailable() {
                     logi("onUnavailable");
+                    mWiFiNetworksAvailable.clear();
                     mWiFiAvailable = false;
                 }
             };
@@ -183,13 +233,18 @@
     private boolean mRequiresVoLteEnabled;
     private boolean mLtePreferredAfterNrFailure;
     private boolean mScanLimitedOnlyAfterVolteFailure;
+    private List<Integer> mRetryReasonCodes;
+    private boolean mNonTtyOrTtySupported;
 
     // Members for states
     private boolean mIsMonitoringConnectivity;
     private boolean mWiFiAvailable;
     private boolean mWasCsfbAfterPsFailure;
     private boolean mTryCsWhenPsFails;
-    private boolean mTryEpsFallback;
+    private boolean mTryEsFallback;
+    private boolean mIsWaitingForDataDisconnection;
+    private boolean mSwitchRatPreferenceWithLocalNotRegistered;
+    private boolean mTerminateAfterCsFailure;
     private int mModemCount;
 
     /** Indicates whether this instance is deactivated. */
@@ -202,6 +257,8 @@
     private boolean mCrossStackTimerExpired = false;
     /** Indicates whether max cellular timer expired. */
     private boolean mMaxCellularTimerExpired = false;
+    /** Indicates whether network scan timer expired. */
+    private boolean mNetworkScanTimerExpired = false;
 
     /**
      * Indicates whether {@link #selectDomain(SelectionAttributes, TransportSelectionCallback)}
@@ -211,16 +268,15 @@
 
     private final PowerManager.WakeLock mPartialWakeLock;
     private final CrossSimRedialingController mCrossSimRedialingController;
-    private final CarrierConfigHelper mCarrierConfigHelper;
-    private final EmergencyCallbackModeHelper mEcbmHelper;
+    private final DataConnectionStateHelper mEpdnHelper;
+    private final List<Network> mWiFiNetworksAvailable = new ArrayList<>();
 
     /** Constructor. */
     public EmergencyCallDomainSelector(Context context, int slotId, int subId,
             @NonNull Looper looper, @NonNull ImsStateTracker imsStateTracker,
             @NonNull DestroyListener destroyListener,
             @NonNull CrossSimRedialingController csrController,
-            @NonNull CarrierConfigHelper carrierConfigHelper,
-            @NonNull EmergencyCallbackModeHelper ecbmHelper) {
+            @NonNull DataConnectionStateHelper epdnHelper) {
         super(context, slotId, subId, looper, imsStateTracker, destroyListener, TAG);
 
         mImsStateTracker.addBarringInfoListener(this);
@@ -230,8 +286,8 @@
         mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
 
         mCrossSimRedialingController = csrController;
-        mCarrierConfigHelper = carrierConfigHelper;
-        mEcbmHelper = ecbmHelper;
+        mEpdnHelper = epdnHelper;
+        epdnHelper.setEmergencyCallDomainSelector(this);
         acquireWakeLock();
     }
 
@@ -256,6 +312,18 @@
                 handleMaxCellularTimeout();
                 break;
 
+            case MSG_WAIT_DISCONNECTION_TIMEOUT:
+                requestScanDelayed();
+                break;
+
+            case MSG_WAIT_FOR_IMS_STATE_TIMEOUT:
+                handleWaitForImsStateTimeout();
+                break;
+
+            case MSG_WIFI_AVAILABLE:
+                handleWifiAvailable();
+                break;
+
             default:
                 super.handleMessage(msg);
                 break;
@@ -282,6 +350,9 @@
         }
 
         if (result.getAccessNetwork() == UNKNOWN) {
+            if (maybeRedialOnTheOtherSlotInNormalService(mLastRegResult)) {
+                return;
+            }
             if ((mPreferredNetworkScanType == SCAN_TYPE_FULL_SERVICE_FOLLOWED_BY_LIMITED_SERVICE)
                       && (mScanType == DomainSelectionService.SCAN_TYPE_FULL_SERVICE)) {
                 mScanType = DomainSelectionService.SCAN_TYPE_LIMITED_SERVICE;
@@ -291,6 +362,15 @@
                             logi("requestScan-onComplete");
                             sendMessage(obtainMessage(MSG_NETWORK_SCAN_RESULT, regResult));
                         });
+            } else if ((mPreferredNetworkScanType
+                    == CarrierConfigManager.ImsEmergency.SCAN_TYPE_FULL_SERVICE)
+                    && (mScanType == DomainSelectionService.SCAN_TYPE_FULL_SERVICE)) {
+                mWwanSelectorCallback.onRequestEmergencyNetworkScan(
+                        mLastPreferredNetworks, mScanType, true, mCancelSignal,
+                        (regResult) -> {
+                            logi("requestScan-onComplete");
+                            sendMessage(obtainMessage(MSG_NETWORK_SCAN_RESULT, regResult));
+                        });
             } else {
                 // Continuous scan, do not start a new timer.
                 requestScan(false);
@@ -298,6 +378,15 @@
             return;
         }
 
+        checkAndSetTerminateAfterCsFailure(result);
+
+        if (result.getRegState() != REGISTRATION_STATE_HOME
+                && result.getRegState() != REGISTRATION_STATE_ROAMING) {
+            if (maybeRedialOnTheOtherSlotInNormalService(result)) {
+                return;
+            }
+        }
+
         mLastRegResult = result;
         removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
         onWwanNetworkTypeSelected(getAccessNetworkType(result));
@@ -316,11 +405,10 @@
         if (accessNetworkType != EUTRAN) return accessNetworkType;
 
         int regState = result.getRegState();
-        int domain = result.getDomain();
 
         // Emergency is not supported with LTE, but CSFB is possible.
         if ((regState == REGISTRATION_STATE_HOME || regState == REGISTRATION_STATE_ROAMING)
-                && (domain == NetworkRegistrationInfo.DOMAIN_CS)) {
+                && isCsDomainOnlyAvailable(result)) {
             logi("getAccessNetworkType emergency not supported but CSFB is possible");
             accessNetworkType = UTRAN;
         }
@@ -328,6 +416,16 @@
         return accessNetworkType;
     }
 
+    private boolean isCsDomainOnlyAvailable(EmergencyRegistrationResult result) {
+        int domain = result.getDomain();
+        if (domain == NetworkRegistrationInfo.DOMAIN_CS) return true;
+        if ((domain & NetworkRegistrationInfo.DOMAIN_CS) > 0) {
+            // b/341865236, check emcBearer only
+            return (!result.isEmcBearerSupported());
+        }
+        return false;
+    }
+
     @Override
     public void reselectDomain(SelectionAttributes attr) {
         logi("reselectDomain attr=" + attr);
@@ -341,8 +439,8 @@
         int cause = getDisconnectCause();
         mCrossSimRedialingController.notifyCallFailure(cause);
 
-        if ((cause == EMERGENCY_PERM_FAILURE || cause == EMERGENCY_TEMP_FAILURE)
-                && mCrossSimRedialingController.isThereOtherSlot()) {
+        if ((cause == EMERGENCY_TEMP_FAILURE && mCrossSimRedialingController.isThereOtherSlot())
+                || cause == EMERGENCY_PERM_FAILURE) {
             logi("reselectDomain should redial on the other subscription");
             terminateSelectionForCrossSimRedialing(cause == EMERGENCY_PERM_FAILURE);
             return;
@@ -354,6 +452,13 @@
             return;
         }
 
+        if (maybeTerminateSelection(cause)) {
+            logi("reselectDomain terminate selection");
+            return;
+        }
+
+        mTerminateAfterCsFailure = false;
+
         if (mTryCsWhenPsFails) {
             mTryCsWhenPsFails = false;
             // Initial state was CSFB available and dial PS failed.
@@ -368,7 +473,7 @@
 
         if (mWasCsfbAfterPsFailure) {
             mWasCsfbAfterPsFailure = false;
-            if (cause == SERVICE_OPTION_NOT_AVAILABLE) {
+            if (preferCsAfterCsfbFailure(cause)) {
                 // b/299875872, combined attach but EXTENDED_SERVICE_REQUEST failed.
                 // Try CS preferred scan instead of PS preferred scan.
                 mLastNetworkType = EUTRAN;
@@ -387,16 +492,62 @@
             }
         }
 
+        if (mLastTransportType == TRANSPORT_TYPE_WWAN) {
+            if (mLastNetworkType == NGRAN && (!mTryEsFallback) && mLtePreferredAfterNrFailure) {
+                int state = mEpdnHelper.getDataConnectionState(getSlotId());
+                if (state != DATA_DISCONNECTED && state != DATA_UNKNOWN) {
+                    mIsWaitingForDataDisconnection = true;
+                    // If deactivation of ePDN has been started, then wait for the disconnection
+                    // with the timeout of 2 seconds and then request network scan.
+                    // If deactivation of ePDN hasn't been started yet, then wait for the start
+                    // of the deactivation with the timeout of 2 seconds.
+                    // The timer shall be restarted in notifyDataConnectionStateChange()
+                    // when starting the deactivation.
+                    sendEmptyMessageDelayed(MSG_WAIT_DISCONNECTION_TIMEOUT,
+                            DEFAULT_DATA_DISCONNECTION_TIMEOUT_MS);
+                    mDomainSelected = false;
+                    return;
+                }
+            }
+        }
+
         if (mLastTransportType == TRANSPORT_TYPE_WLAN) {
             // Dialing over Wi-Fi failed. Try scanning cellular networks.
             onWwanSelected(this::reselectDomainInternal);
             return;
         }
 
+        if (mLastNetworkType == EUTRAN && mLastRegResult != null
+                && mSelectionAttributes.getPsDisconnectCause() != null
+                && !mScanLimitedOnlyAfterVolteFailure
+                && !mSwitchRatPreferenceWithLocalNotRegistered) {
+            int regState = mLastRegResult.getRegState();
+            int reasonCode = mSelectionAttributes.getPsDisconnectCause().getCode();
+            if (reasonCode == ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED
+                    && regState != REGISTRATION_STATE_HOME
+                    && regState != REGISTRATION_STATE_ROAMING
+                    && isSimReady()) {
+                // b/326292100, ePDN setup failed in limited state, request PS preferred scan.
+                mLastNetworkType = UNKNOWN;
+                mSwitchRatPreferenceWithLocalNotRegistered = true;
+            }
+        }
+
         requestScan(true);
         mDomainSelected = false;
     }
 
+    private boolean preferCsAfterCsfbFailure(int cause) {
+        if (cause != SERVICE_OPTION_NOT_AVAILABLE) return false;
+        if (sPreferCsAfterCsfbFailure == null || mLastRegResult == null
+                || TextUtils.isEmpty(mLastRegResult.getCountryIso())) {
+            // Enabled by default if country is not identified.
+            return true;
+        }
+
+        return sPreferCsAfterCsfbFailure.contains(mLastRegResult.getCountryIso());
+    }
+
     private int getDisconnectCause() {
         int cause = mSelectionAttributes.getCsDisconnectCause();
 
@@ -424,6 +575,15 @@
         });
     }
 
+    private void requestScanDelayed() {
+        logi("requestScanDelayed waiting=" + mIsWaitingForDataDisconnection);
+        if (!mDestroyed && mIsWaitingForDataDisconnection) {
+            requestScan(true);
+            removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
+        }
+        mIsWaitingForDataDisconnection = false;
+    }
+
     @Override
     public void finishSelection() {
         logi("finishSelection");
@@ -463,6 +623,8 @@
         mDomainSelectionRequested = true;
         startCrossStackTimer();
         if (SubscriptionManager.isValidSubscriptionId(getSubId())) {
+            sendEmptyMessageDelayed(MSG_WAIT_FOR_IMS_STATE_TIMEOUT,
+                    DEFAULT_WAIT_FOR_IMS_STATE_TIMEOUT_MS);
             selectDomain();
         } else {
             logi("startDomainSelection invalid subId");
@@ -471,6 +633,12 @@
         }
     }
 
+    private void handleWaitForImsStateTimeout() {
+        logi("handleWaitForImsStateTimeout");
+        onImsRegistrationStateChanged();
+        onImsMmTelCapabilitiesChanged();
+    }
+
     @Override
     public void onImsMmTelFeatureAvailableChanged() {
         // DOMAIN_CS shall be selected when ImsService is not available.
@@ -483,6 +651,7 @@
         mImsRegistered = mImsStateTracker.isImsRegistered();
         logi("onImsRegistrationStateChanged " + mImsRegistered);
         selectDomain();
+        handleImsStateChange();
     }
 
     @Override
@@ -491,6 +660,14 @@
         mIsVoiceCapable = mImsStateTracker.isImsVoiceCapable();
         logi("onImsMmTelCapabilitiesChanged " + mIsVoiceCapable);
         selectDomain();
+        handleImsStateChange();
+    }
+
+    private void handleImsStateChange() {
+        if (!mVoWifiOverEmergencyPdn && !mDomainSelected
+                && (mMaxCellularTimerExpired || mNetworkScanTimerExpired)) {
+            maybeDialOverWlan();
+        }
     }
 
     private boolean isSimReady() {
@@ -523,6 +700,8 @@
                 KEY_EMERGENCY_REQUIRES_VOLTE_ENABLED_BOOL,
                 KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL,
                 KEY_SCAN_LIMITED_SERVICE_AFTER_VOLTE_FAILURE_BOOL,
+                KEY_IMS_REASONINFO_CODE_TO_RETRY_EMERGENCY_INT_ARRAY,
+                KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL,
                 KEY_EMERGENCY_CDMA_PREFERRED_NUMBERS_STRING_ARRAY);
         if (b == null) {
             b = CarrierConfigManager.getDefaultConfig();
@@ -532,7 +711,6 @@
                 b.getIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY);
         mImsRoamRatsConfig = b.getIntArray(
                 KEY_EMERGENCY_OVER_IMS_ROAMING_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY);
-        maybeModifyImsRats();
 
         mCsRatsConfig =
                 b.getIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY);
@@ -557,6 +735,10 @@
         mScanLimitedOnlyAfterVolteFailure = b.getBoolean(
                 KEY_SCAN_LIMITED_SERVICE_AFTER_VOLTE_FAILURE_BOOL);
         String[] numbers = b.getStringArray(KEY_EMERGENCY_CDMA_PREFERRED_NUMBERS_STRING_ARRAY);
+        int[] imsReasonCodes =
+                b.getIntArray(KEY_IMS_REASONINFO_CODE_TO_RETRY_EMERGENCY_INT_ARRAY);
+        boolean ttySupported = b.getBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL);
+        mNonTtyOrTtySupported = isNonTtyOrTtySupported(ttySupported);
 
         if (mImsRatsConfig == null) mImsRatsConfig = new int[0];
         if (mCsRatsConfig == null) mCsRatsConfig = new int[0];
@@ -565,6 +747,10 @@
         if (mDomainPreference == null) mDomainPreference = new int[0];
         if (mDomainPreferenceRoam == null) mDomainPreferenceRoam = new int[0];
         if (numbers == null) numbers = new String[0];
+        if (imsReasonCodes == null) imsReasonCodes = new int[0];
+
+        mRetryReasonCodes = Arrays.stream(imsReasonCodes).boxed().collect(Collectors.toList());
+        mRetryReasonCodes.addAll(sDefaultRetryReasonCodes);
 
         logi("updateCarrierConfiguration "
                 + "imsRats=" + arrayToString(mImsRatsConfig,
@@ -592,6 +778,8 @@
                 + ", requiresVoLteEnabled=" + mRequiresVoLteEnabled
                 + ", ltePreferredAfterNr=" + mLtePreferredAfterNrFailure
                 + ", scanLimitedOnly=" + mScanLimitedOnlyAfterVolteFailure
+                + ", retryReasonCodes=" + mRetryReasonCodes
+                + ", ttySupported=" + ttySupported
                 + ", cdmaPreferredNumbers=" + arrayToString(numbers));
 
         mCdmaPreferredNumbers = Arrays.asList(numbers);
@@ -605,16 +793,6 @@
         }
     }
 
-    /** Adds NGRAN if SIM is absent or locked and the last valid subscription supported NGRAN. */
-    private void maybeModifyImsRats() {
-        if (mCarrierConfigHelper.isVoNrEmergencySupported(getSlotId())
-                && !isSimReady() && mImsRatsConfig.length < 2) {
-            // Default configuration includes only EUTRAN.
-            mImsRatsConfig = new int[] { EUTRAN, NGRAN };
-            mImsRoamRatsConfig = new int[] { EUTRAN, NGRAN };
-        }
-    }
-
     /**
      * Caches the resource configuration.
      */
@@ -631,6 +809,20 @@
         }
         logi("readResourceConfiguration preferNormalServiceCountries="
                 + sPreferSlotWithNormalServiceList);
+
+        if (sPreferCsAfterCsfbFailure == null) {
+            sPreferCsAfterCsfbFailure = readResourceConfiguration(
+                    R.array.config_countries_prefer_cs_preferred_scan_after_csfb_failure);
+        }
+        logi("readResourceConfiguration preferCsAfterCsfbFailure="
+                + sPreferCsAfterCsfbFailure);
+
+        if (sPreferGeranWhenSimAbsent == null) {
+            sPreferGeranWhenSimAbsent = readResourceConfiguration(
+                    R.array.config_countries_prefer_geran_when_sim_absent);
+        }
+        logi("readResourceConfiguration preferGeranWhenSimAbsent="
+                + sPreferGeranWhenSimAbsent);
     }
 
     private List<String> readResourceConfiguration(int id) {
@@ -656,6 +848,8 @@
     public void clearResourceConfiguration() {
         sSimReadyAllowList = null;
         sPreferSlotWithNormalServiceList = null;
+        sPreferCsAfterCsfbFailure = null;
+        sPreferGeranWhenSimAbsent = null;
     }
 
     private void selectDomain() {
@@ -667,6 +861,7 @@
                     + " BarringInfo, IMS registration state, or MMTEL capabilities");
             return;
         }
+        removeMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT);
 
         // The statements below should be executed only once to select domain from initial state.
         // Next domain selection shall be triggered by reselectDomain().
@@ -710,7 +905,7 @@
         boolean psInService = isPsInService();
 
         if (!csInService && !psInService) {
-            if (maybeRedialOnTheOtherSlotInNormalService()) {
+            if (maybeRedialOnTheOtherSlotInNormalService(mLastRegResult)) {
                 return;
             }
             mCsNetworkType = getSelectableCsNetworkType();
@@ -727,6 +922,7 @@
             if (mPsNetworkType == EUTRAN) {
                 onWwanNetworkTypeSelected(mPsNetworkType);
             } else if (mCsNetworkType != UNKNOWN) {
+                checkAndSetTerminateAfterCsFailure(mLastRegResult);
                 onWwanNetworkTypeSelected(mCsNetworkType);
             } else {
                 requestScan(true);
@@ -759,7 +955,7 @@
                 onWwanNetworkTypeSelected(mCsNetworkType);
             }
         } else if (psAvailable) {
-            mTryEpsFallback = (mPsNetworkType == NGRAN) && isEpsFallbackAvailable();
+            mTryEsFallback = (mPsNetworkType == NGRAN) && isEsFallbackAvailable();
             if (mSelectionAttributes.isExitedFromAirplaneMode()
                     || !mRequiresImsRegistration || isImsRegisteredWithVoiceCapability()) {
                 onWwanNetworkTypeSelected(mPsNetworkType);
@@ -769,7 +965,7 @@
             } else {
                 // Carrier configuration requires IMS registration for emergency services over PS,
                 // but not registered. Try CS emergency call.
-                mTryEpsFallback = false;
+                mTryEsFallback = false;
                 requestScan(true, true);
             }
         } else if (csAvailable) {
@@ -782,7 +978,7 @@
                 // but not registered. Try CS emergency call.
                 requestScan(true, true);
             } else {
-                mTryEpsFallback = isEpsFallbackAvailable();
+                mTryEsFallback = isEsFallbackAvailable();
                 requestScan(true);
             }
         }
@@ -822,9 +1018,9 @@
         mCancelSignal = new CancellationSignal();
         // In case dialing over Wi-Fi has failed, do not the change the domain preference.
         if (!wifiFailed || mLastPreferredNetworks == null) {
-            mLastPreferredNetworks = getNextPreferredNetworks(csPreferred, mTryEpsFallback);
+            mLastPreferredNetworks = getNextPreferredNetworks(csPreferred, mTryEsFallback);
         }
-        mTryEpsFallback = false;
+        mTryEsFallback = false;
 
         if (isInRoaming()
                 && (mPreferredNetworkScanType
@@ -841,7 +1037,7 @@
                     sendMessage(obtainMessage(MSG_NETWORK_SCAN_RESULT, result));
                 });
 
-        if (startVoWifiTimer && SubscriptionManager.isValidSubscriptionId(getSubId())) {
+        if (startVoWifiTimer && isSimReady()) {
             if (isEmcOverWifiSupported()
                     && mScanTimeout > 0 && mVoWifiTrialCount < mMaxNumOfVoWifiTries) {
                 logi("requestScan start scan timer");
@@ -860,12 +1056,12 @@
      * Gets the list of preferred network type for the new scan request.
      *
      * @param csPreferred Indicates whether CS preferred scan is requested.
-     * @param tryEpsFallback Indicates whether scan requested for EPS fallback.
+     * @param tryEsFallback Indicates whether scan requested for ES fallback.
      * @return The list of preferred network types.
      */
     @VisibleForTesting
     public @RadioAccessNetworkType List<Integer> getNextPreferredNetworks(boolean csPreferred,
-            boolean tryEpsFallback) {
+            boolean tryEsFallback) {
         if (mRequiresVoLteEnabled && !isAdvancedCallingSettingEnabled()) {
             // Emergency call over IMS is not supported.
             logi("getNextPreferredNetworks VoLte setting is not enabled.");
@@ -878,10 +1074,21 @@
         int psPriority = domains.indexOf(DOMAIN_PS_3GPP);
         int csPriority = domains.indexOf(DOMAIN_CS);
         logi("getNextPreferredNetworks psPriority=" + psPriority + ", csPriority=" + csPriority
-                + ", csPreferred=" + csPreferred + ", epsFallback=" + tryEpsFallback
+                + ", csPreferred=" + csPreferred + ", esFallback=" + tryEsFallback
                 + ", lastNetworkType=" + accessNetworkTypeToString(mLastNetworkType));
 
-        if (!csPreferred && (mLastNetworkType == UNKNOWN || tryEpsFallback)) {
+        if (mLastRegResult != null
+                && sPreferGeranWhenSimAbsent.contains(mLastRegResult.getCountryIso())
+                && !isSimReady()) {
+            logi("getNextPreferredNetworks preferGeran");
+            preferredNetworks.add(GERAN);
+            preferredNetworks.add(UTRAN);
+            preferredNetworks.add(EUTRAN);
+            preferredNetworks.add(NGRAN);
+            return preferredNetworks;
+        }
+
+        if (!csPreferred && (mLastNetworkType == UNKNOWN || tryEsFallback)) {
             // Generate the list per the domain preference.
 
             if (psPriority == NOT_SUPPORTED && csPriority == NOT_SUPPORTED) {
@@ -905,7 +1112,7 @@
             }
 
             // Make NGRAN have the lowest priority
-            if (tryEpsFallback && preferredNetworks.contains(NGRAN)) {
+            if (tryEsFallback && preferredNetworks.contains(NGRAN)) {
                 preferredNetworks.remove(Integer.valueOf(NGRAN));
                 preferredNetworks.add(NGRAN);
             }
@@ -943,6 +1150,15 @@
             preferredNetworks.add(NGRAN);
         }
 
+        if (!mNonTtyOrTtySupported) {
+            logi("getNextPreferredNetworks adjust for TTY");
+            preferredNetworks.remove(Integer.valueOf(NGRAN));
+            preferredNetworks.remove(Integer.valueOf(EUTRAN));
+            if (preferredNetworks.isEmpty()) {
+                preferredNetworks.add(Integer.valueOf(UTRAN));
+                preferredNetworks.add(Integer.valueOf(GERAN));
+            }
+        }
         return preferredNetworks;
     }
 
@@ -955,6 +1171,12 @@
         return preferredNetworks;
     }
 
+    private void handleWifiAvailable() {
+        if (!mDomainSelected && (mMaxCellularTimerExpired || mNetworkScanTimerExpired)) {
+            maybeDialOverWlan();
+        }
+    }
+
     private void handleMaxCellularTimeout() {
         logi("handleMaxCellularTimeout");
         if (mVoWifiTrialCount >= mMaxNumOfVoWifiTries) {
@@ -977,13 +1199,14 @@
 
     private void handleNetworkScanTimeout() {
         logi("handleNetworkScanTimeout");
+        mNetworkScanTimerExpired = true;
         maybeDialOverWlan();
     }
 
     private boolean maybeDialOverWlan() {
-        logi("maybeDialOverWlan overEmergencyPdn=" + mVoWifiOverEmergencyPdn
-                + ", wifiAvailable=" + mWiFiAvailable);
         boolean available = mWiFiAvailable;
+        logi("maybeDialOverWlan overEmergencyPdn=" + mVoWifiOverEmergencyPdn
+                + ", wifiAvailable=" + available);
         if (mVoWifiOverEmergencyPdn) {
             // SOS APN
             if (!available && isImsRegisteredOverCrossSim()) {
@@ -1098,7 +1321,8 @@
      */
     private @RadioAccessNetworkType int getSelectablePsNetworkType(boolean inService) {
         List<Integer> domains = getDomainPreference();
-        if (domains.indexOf(DOMAIN_PS_3GPP) == NOT_SUPPORTED) {
+        if ((domains.indexOf(DOMAIN_PS_3GPP) == NOT_SUPPORTED)
+                || !mNonTtyOrTtySupported) {
             return UNKNOWN;
         }
         EmergencyRegistrationResult regResult =
@@ -1131,7 +1355,7 @@
         return UNKNOWN;
     }
 
-    private boolean isEpsFallbackAvailable() {
+    private boolean isEsFallbackAvailable() {
         EmergencyRegistrationResult regResult =
                 mSelectionAttributes.getEmergencyRegistrationResult();
         if (regResult == null) return false;
@@ -1165,7 +1389,7 @@
      * @return {@code true} if emergency call over Wi-Fi allowed.
      */
     private boolean isEmcOverWifiSupported() {
-        if (isSimReady()) {
+        if (isSimReady() && mNonTtyOrTtySupported) {
             List<Integer> domains = getDomainPreference();
             boolean ret = domains.contains(DOMAIN_PS_NON_3GPP);
             logi("isEmcOverWifiSupported " + ret);
@@ -1304,7 +1528,6 @@
         EmergencyRegistrationResult regResult = mLastRegResult;
         if (regResult != null) {
             if (regResult.getRegState() == REGISTRATION_STATE_HOME) return false;
-            if (regResult.getRegState() == REGISTRATION_STATE_ROAMING) return true;
 
             String iso = regResult.getCountryIso();
             if (!TextUtils.isEmpty(iso)) netIso = iso;
@@ -1369,6 +1592,9 @@
         }
 
         mDomainSelected = true;
+        mNetworkScanTimerExpired = false;
+        mIsWaitingForDataDisconnection = false;
+        removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
         mLastTransportType = TRANSPORT_TYPE_WLAN;
         mVoWifiTrialCount++;
         mTransportSelectorCallback.onWlanSelected(mVoWifiOverEmergencyPdn);
@@ -1399,6 +1625,7 @@
         }
 
         mDomainSelected = true;
+        mNetworkScanTimerExpired = false;
         mLastNetworkType = accessNetworkType;
         int domain = NetworkRegistrationInfo.DOMAIN_CS;
         if (accessNetworkType == EUTRAN || accessNetworkType == NGRAN) {
@@ -1416,6 +1643,7 @@
             return;
         }
 
+        mWiFiNetworksAvailable.clear();
         ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class);
         if (cm != null) {
             logi("registerForConnectivityChanges");
@@ -1434,6 +1662,7 @@
             return;
         }
 
+        mWiFiNetworksAvailable.clear();
         ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class);
         if (cm != null) {
             logi("unregisterForConnectivityChanges");
@@ -1456,7 +1685,6 @@
     }
 
     private boolean allowEmergencyCalls(EmergencyRegistrationResult regResult) {
-        if (mModemCount < 2) return true;
         if (regResult == null) {
             loge("allowEmergencyCalls null regResult");
             return true;
@@ -1464,28 +1692,46 @@
 
         String iso = regResult.getCountryIso();
         if (sSimReadyAllowList.contains(iso)) {
-            TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
-            int simState = tm.getSimState(getSlotId());
-            if (simState != TelephonyManager.SIM_STATE_READY) {
-                logi("allowEmergencyCalls not ready, simState=" + simState + ", iso=" + iso);
-                if (mCrossSimRedialingController.isThereOtherSlot()) {
+            if (isSimReady()) {
+                SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class);
+                SubscriptionInfo subInfo = sm.getActiveSubscriptionInfo(getSubId());
+                if (subInfo != null
+                        && subInfo.getProfileClass() == PROFILE_CLASS_PROVISIONING) {
+                    // b/334773484, bootstrap profile
+                    logi("allowEmergencyCalls bootstrap profile, iso=" + iso);
                     return false;
                 }
-                logi("allowEmergencyCalls there is no other slot available");
+            } else {
+                logi("allowEmergencyCalls SIM state not ready, iso=" + iso);
+                return false;
             }
         }
 
         return true;
     }
 
-    private boolean maybeRedialOnTheOtherSlotInNormalService() {
-        EmergencyRegistrationResult regResult =
-                mSelectionAttributes.getEmergencyRegistrationResult();
+    private String getCountryIso(String iso) {
+        if (TextUtils.isEmpty(iso)) {
+            TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
+            iso = tm.getNetworkCountryIso(getSlotId());
+            if (TextUtils.isEmpty(iso)) {
+                for (int i = 0; i < mModemCount; i++) {
+                    iso = tm.getNetworkCountryIso(i);
+                    if (!TextUtils.isEmpty(iso)) break;
+                }
+            }
+        }
+        return iso;
+    }
+
+    private boolean maybeRedialOnTheOtherSlotInNormalService(
+            EmergencyRegistrationResult regResult) {
         if (regResult == null) return false;
 
-        String iso = regResult.getCountryIso();
+        String iso = getCountryIso(regResult.getCountryIso());
         if (sPreferSlotWithNormalServiceList.contains(iso)
                 && mCrossSimRedialingController.isThereOtherSlotInService()) {
+            logi("maybeRedialOnTheOtherSlotInNormalService");
             terminateSelectionForCrossSimRedialing(false);
             return true;
         }
@@ -1494,18 +1740,52 @@
 
     private void terminateSelectionPermanentlyForSlot() {
         logi("terminateSelectionPermanentlyForSlot");
-        terminateSelection(true);
+        mCrossSimRedialingController.notifyCallFailure(EMERGENCY_PERM_FAILURE);
+        if (mCrossSimRedialingController.isThereOtherSlot()) {
+            terminateSelection(DisconnectCause.EMERGENCY_PERM_FAILURE);
+        } else {
+            terminateSelection(DisconnectCause.ICC_ERROR);
+        }
     }
 
     private void terminateSelectionForCrossSimRedialing(boolean permanent) {
         logi("terminateSelectionForCrossSimRedialing perm=" + permanent);
-        terminateSelection(permanent);
+        terminateSelection(permanent ? DisconnectCause.EMERGENCY_PERM_FAILURE
+                : DisconnectCause.EMERGENCY_TEMP_FAILURE);
     }
 
-    private void terminateSelection(boolean permanent) {
-        mTransportSelectorCallback.onSelectionTerminated(permanent
-                ? DisconnectCause.EMERGENCY_PERM_FAILURE
-                : DisconnectCause.EMERGENCY_TEMP_FAILURE);
+    private void terminateSelection(int cause) {
+        removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
+        removeMessages(MSG_MAX_CELLULAR_TIMEOUT);
+        mTransportSelectorCallback.onSelectionTerminated(cause);
+    }
+
+    private boolean maybeTerminateSelection(int cause) {
+        switch (cause) {
+            case NO_VALID_SIM:
+                // The disconnect cause saved in DomainSelectionConnection shall be used.
+                terminateSelection(DisconnectCause.NOT_VALID);
+                return true;
+            default:
+                break;
+        }
+
+        ImsReasonInfo reasonInfo = mSelectionAttributes.getPsDisconnectCause();
+        if (mRetryReasonCodes != null && reasonInfo != null) {
+            if (!mRetryReasonCodes.contains(reasonInfo.getCode())) {
+                // The disconnect cause saved in DomainSelectionConnection shall be used.
+                terminateSelection(DisconnectCause.NOT_VALID);
+                return true;
+            }
+        } else if (reasonInfo == null
+                && sDisconnectCauseForTerminatation.contains(cause)
+                && mTerminateAfterCsFailure) {
+            // b/341055741
+            logi("maybeTerminateSelection terminate after CS failure");
+            terminateSelection(DisconnectCause.NOT_VALID);
+            return true;
+        }
+        return false;
     }
 
     /** Starts the cross stack timer. */
@@ -1542,9 +1822,25 @@
             // When reselecting domain, terminateSelection will be called.
             return;
         }
+        mIsWaitingForDataDisconnection = false;
+        removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
         terminateSelectionForCrossSimRedialing(false);
     }
 
+    /** Notifies the ePDN connection state changes. */
+    public void notifyDataConnectionStateChange(int slotId, int state) {
+        if (slotId == getSlotId() && mIsWaitingForDataDisconnection) {
+            if (state == DATA_DISCONNECTED || state == DATA_UNKNOWN) {
+                requestScanDelayed();
+            } else if (state == DATA_DISCONNECTING) {
+                logi("notifyDataConnectionStateChange deactivation starting, restart timer");
+                removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
+                sendEmptyMessageDelayed(MSG_WAIT_DISCONNECTION_TIMEOUT,
+                        DEFAULT_DATA_DISCONNECTION_TIMEOUT_MS);
+            }
+        }
+    }
+
     private void maybeModifyScanType(int selectedNetworkType) {
         if ((mPreferredNetworkScanType
                 != CarrierConfigManager.ImsEmergency.SCAN_TYPE_FULL_SERVICE)
@@ -1624,6 +1920,7 @@
     public void destroy() {
         if (DBG) logd("destroy");
 
+        mEpdnHelper.setEmergencyCallDomainSelector(null);
         mCrossSimRedialingController.stopTimer();
         releaseWakeLock();
 
@@ -1656,15 +1953,56 @@
     }
 
     private boolean isInEmergencyCallbackModeOnWlan() {
-        return mEcbmHelper.isInEmergencyCallbackMode(getSlotId())
-                && mEcbmHelper.getTransportType(getSlotId()) == TRANSPORT_TYPE_WLAN
-                && mEcbmHelper.getDataConnectionState(getSlotId()) == DATA_CONNECTED;
+        return mEpdnHelper.isInEmergencyCallbackMode(getSlotId())
+                && mEpdnHelper.getTransportType(getSlotId()) == TRANSPORT_TYPE_WLAN
+                && mEpdnHelper.getDataConnectionState(getSlotId()) == DATA_CONNECTED;
     }
 
     private boolean isInEmergencyCallbackModeOnPsWwan() {
-        return mEcbmHelper.isInEmergencyCallbackMode(getSlotId())
-                && mEcbmHelper.getTransportType(getSlotId()) == TRANSPORT_TYPE_WWAN
-                && mEcbmHelper.getDataConnectionState(getSlotId()) == DATA_CONNECTED;
+        return mEpdnHelper.isInEmergencyCallbackMode(getSlotId())
+                && mEpdnHelper.getTransportType(getSlotId()) == TRANSPORT_TYPE_WWAN
+                && mEpdnHelper.getDataConnectionState(getSlotId()) == DATA_CONNECTED;
+    }
+
+    /**
+     * Indicates whether the call is non-TTY or if TTY is supported.
+     */
+    private boolean isNonTtyOrTtySupported(boolean ttySupported) {
+        if (ttySupported) {
+            return true;
+        }
+
+        TelecomManager tm = mContext.getSystemService(TelecomManager.class);
+        if (tm == null) {
+            logi("isNonTtyOrTtySupported telecom not available");
+            return true;
+        }
+
+        boolean ret = (tm.getCurrentTtyMode() == TelecomManager.TTY_MODE_OFF);
+        logi("isNonTtyOrTtySupported ret=" + ret);
+
+        return ret;
+    }
+
+    private void checkAndSetTerminateAfterCsFailure(EmergencyRegistrationResult result) {
+        if (result == null) return;
+        String mcc = result.getMcc();
+        int accessNetwork = result.getAccessNetwork();
+        if (!TextUtils.isEmpty(mcc) && mcc.startsWith("00") // test network
+                && (accessNetwork == UTRAN || accessNetwork == GERAN)) {
+            // b/341055741
+            mTerminateAfterCsFailure = true;
+        }
+    }
+
+    @VisibleForTesting
+    public boolean isWiFiAvailable() {
+        return mWiFiAvailable;
+    }
+
+    @VisibleForTesting
+    public List<Network> getWiFiNetworksAvailable() {
+        return mWiFiNetworksAvailable;
     }
 
     @Override
diff --git a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
index 31a1cc2..bf6c647 100644
--- a/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/NormalCallDomainSelector.java
@@ -21,6 +21,7 @@
 import android.annotation.NonNull;
 import android.content.Context;
 import android.os.Looper;
+import android.os.Message;
 import android.os.PersistableBundle;
 import android.telecom.TelecomManager;
 import android.telephony.Annotation.DisconnectCauses;
@@ -35,6 +36,7 @@
 import android.telephony.ims.ImsReasonInfo;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.CallFailCause;
 
 /**
  * Implements domain selector for outgoing non-emergency calls.
@@ -44,6 +46,13 @@
 
     private static final String LOG_TAG = "NCDS";
 
+    // Wait-time for IMS state change callback.
+    @VisibleForTesting
+    protected static final int WAIT_FOR_IMS_STATE_TIMEOUT_MS = 3000; // 3 seconds
+
+    @VisibleForTesting
+    protected static final int MSG_WAIT_FOR_IMS_STATE_TIMEOUT = 11;
+
     @VisibleForTesting
     protected enum SelectorState {
         ACTIVE,
@@ -66,12 +75,40 @@
             logd("Subscribing to state callbacks. Subid:" + subId);
             mImsStateTracker.addServiceStateListener(this);
             mImsStateTracker.addImsStateListener(this);
+
         } else {
             loge("Invalid Subscription. Subid:" + subId);
         }
     }
 
     @Override
+    public void handleMessage(Message message) {
+        switch (message.what) {
+
+            case MSG_WAIT_FOR_IMS_STATE_TIMEOUT: {
+                loge("ImsStateTimeout. ImsState callback not received");
+                if (mSelectorState != SelectorState.ACTIVE) {
+                    return;
+                }
+
+                if (!mImsRegStateReceived) {
+                    onImsRegistrationStateChanged();
+                }
+
+                if (!mMmTelCapabilitiesReceived) {
+                    onImsMmTelCapabilitiesChanged();
+                }
+            }
+            break;
+
+            default: {
+                super.handleMessage(message);
+            }
+            break;
+        }
+    }
+
+    @Override
     public void selectDomain(SelectionAttributes attributes, TransportSelectorCallback callback) {
         mSelectionAttributes = attributes;
         mTransportSelectorCallback = callback;
@@ -103,12 +140,13 @@
 
         if (subId == getSubId()) {
             logd("NormalCallDomainSelection triggered. Sub-id:" + subId);
+            sendEmptyMessageDelayed(MSG_WAIT_FOR_IMS_STATE_TIMEOUT, WAIT_FOR_IMS_STATE_TIMEOUT_MS);
             post(() -> selectDomain());
         } else {
             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 +352,7 @@
     private synchronized void selectDomain() {
         if (mSelectorState != SelectorState.ACTIVE || mSelectionAttributes == null
                 || mTransportSelectorCallback == null) {
+            mSelectorState = SelectorState.INACTIVE;
             logd("Domain Selection is stopped.");
             return;
         }
@@ -324,33 +363,49 @@
         }
 
         // Check if this is a re-dial scenario
-        // IMS -> CS
         ImsReasonInfo imsReasonInfo = mSelectionAttributes.getPsDisconnectCause();
-        if (mReselectDomain && imsReasonInfo != null) {
-            logd("PsDisconnectCause:" + imsReasonInfo.getCode());
+        if (mReselectDomain) {
             mReselectDomain = false;
-            if (imsReasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED) {
-                if (isOutOfService()) {
-                    loge("Cannot place call in current ServiceState: " + mServiceState.getState());
-                    notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
-                } else {
-                    logd("Redialing over CS");
-                    notifyCsSelected();
-                }
-                return;
-            } else {
-                logd("Redialing cancelled.");
-                // Not a valid redial
-                notifySelectionTerminated(DisconnectCause.NOT_VALID);
+
+            // Out of service
+            if (isOutOfService()) {
+                loge("Cannot place call in current ServiceState: " + mServiceState.getState());
+                notifySelectionTerminated(DisconnectCause.OUT_OF_SERVICE);
+
                 return;
             }
-        }
 
-        // CS -> IMS
-        // TODO: @PreciseDisconnectCauses doesn't contain cause code related to redial on IMS.
-        if (mReselectDomain /*mSelectionAttributes.getCsDisconnectCause() == IMS_REDIAL_CODE*/) {
-            logd("Redialing cancelled.");
+            // IMS -> CS
+            if (imsReasonInfo != null) {
+                logd("PsDisconnectCause:" + imsReasonInfo.getCode());
+                if (imsReasonInfo.getCode() == ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED) {
+                    logd("Redialing over CS");
+                    notifyCsSelected();
+                } else {
+                    // Not a valid redial
+                    logd("Redialing cancelled.");
+                    notifySelectionTerminated(DisconnectCause.NOT_VALID);
+                }
+                return;
+            }
+
+            // CS -> IMS
+            int csDisconnectCause = mSelectionAttributes.getCsDisconnectCause();
+            switch (csDisconnectCause) {
+                case CallFailCause.EMC_REDIAL_ON_IMS:
+                case CallFailCause.EMC_REDIAL_ON_VOWIFI:
+                    // Check IMS registration state.
+                    if (mImsStateTracker.isImsRegistered()) {
+                        logd("IMS is registered");
+                        notifyPsSelected();
+                        return;
+                    } else {
+                        logd("IMS is NOT registered");
+                    }
+            }
+
             // Not a valid redial
+            logd("Redialing cancelled.");
             notifySelectionTerminated(DisconnectCause.NOT_VALID);
             return;
         }
@@ -371,6 +426,10 @@
             return;
         }
 
+        if (hasMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT)) {
+            removeMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT);
+        }
+
         // Check IMS registration state.
         if (!mImsStateTracker.isImsRegistered()) {
             logd("IMS is NOT registered");
@@ -429,7 +488,7 @@
     }
 
     @VisibleForTesting
-    public SelectorState getSelectorState() {
+    protected SelectorState getSelectorState() {
         return mSelectorState;
     }
 }
diff --git a/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionService.java b/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionService.java
index d79a260..7e1a2e6 100644
--- a/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionService.java
+++ b/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionService.java
@@ -73,8 +73,7 @@
                 @NonNull ImsStateTracker imsStateTracker,
                 @NonNull DomainSelectorBase.DestroyListener listener,
                 @NonNull CrossSimRedialingController crossSimRedialingController,
-                @NonNull CarrierConfigHelper carrierConfigHelper,
-                @NonNull EmergencyCallbackModeHelper emergencyCallbackModeHelper);
+                @NonNull DataConnectionStateHelper dataConnectionStateHelper);
     }
 
     private static final class DefaultDomainSelectorFactory implements DomainSelectorFactory {
@@ -84,8 +83,7 @@
                 @NonNull ImsStateTracker imsStateTracker,
                 @NonNull DomainSelectorBase.DestroyListener listener,
                 @NonNull CrossSimRedialingController crossSimRedialingController,
-                @NonNull CarrierConfigHelper carrierConfigHelper,
-                @NonNull EmergencyCallbackModeHelper emergencyCallbackModeHelper) {
+                @NonNull DataConnectionStateHelper dataConnectionStateHelper) {
             DomainSelectorBase selector = null;
 
             logi("create-DomainSelector: slotId=" + slotId + ", subId=" + subId
@@ -97,7 +95,7 @@
                     if (isEmergency) {
                         selector = new EmergencyCallDomainSelector(context, slotId, subId, looper,
                                 imsStateTracker, listener, crossSimRedialingController,
-                                carrierConfigHelper, emergencyCallbackModeHelper);
+                                dataConnectionStateHelper);
                     } else {
                         selector = new NormalCallDomainSelector(context, slotId, subId, looper,
                                 imsStateTracker, listener);
@@ -201,23 +199,21 @@
     private final DomainSelectorFactory mDomainSelectorFactory;
     private Handler mServiceHandler;
     private CrossSimRedialingController mCrossSimRedialingController;
-    private CarrierConfigHelper mCarrierConfigHelper;
-    private EmergencyCallbackModeHelper mEmergencyCallbackModeHelper;
+    private DataConnectionStateHelper mDataConnectionStateHelper;
 
     /** Default constructor. */
     public TelephonyDomainSelectionService() {
-        this(ImsStateTracker::new, new DefaultDomainSelectorFactory(), null, null);
+        this(ImsStateTracker::new, new DefaultDomainSelectorFactory(), null);
     }
 
     @VisibleForTesting
     protected TelephonyDomainSelectionService(
             @NonNull ImsStateTrackerFactory imsStateTrackerFactory,
             @NonNull DomainSelectorFactory domainSelectorFactory,
-            @Nullable CarrierConfigHelper carrierConfigHelper,
-            @Nullable EmergencyCallbackModeHelper ecbmHelper) {
+            @Nullable DataConnectionStateHelper dataConnectionStateHelper) {
         mImsStateTrackerFactory = imsStateTrackerFactory;
         mDomainSelectorFactory = domainSelectorFactory;
-        mCarrierConfigHelper = carrierConfigHelper;
+        mDataConnectionStateHelper = dataConnectionStateHelper;
     }
 
     @Override
@@ -242,11 +238,8 @@
         }
 
         mCrossSimRedialingController = new CrossSimRedialingController(mContext, getLooper());
-        if (mCarrierConfigHelper == null) {
-            mCarrierConfigHelper = new CarrierConfigHelper(mContext, getLooper());
-        }
-        if (mEmergencyCallbackModeHelper == null) {
-            mEmergencyCallbackModeHelper = new EmergencyCallbackModeHelper(mContext, getLooper());
+        if (mDataConnectionStateHelper == null) {
+            mDataConnectionStateHelper = new DataConnectionStateHelper(mContext, getLooper());
         }
 
         logi("TelephonyDomainSelectionService created");
@@ -291,14 +284,9 @@
             mCrossSimRedialingController = null;
         }
 
-        if (mCarrierConfigHelper != null) {
-            mCarrierConfigHelper.destroy();
-            mCarrierConfigHelper = null;
-        }
-
-        if (mEmergencyCallbackModeHelper != null) {
-            mEmergencyCallbackModeHelper.destroy();
-            mEmergencyCallbackModeHelper = null;
+        if (mDataConnectionStateHelper != null) {
+            mDataConnectionStateHelper.destroy();
+            mDataConnectionStateHelper = null;
         }
 
         if (mServiceHandler != null) {
@@ -323,7 +311,7 @@
         ImsStateTracker ist = getImsStateTracker(slotId);
         DomainSelectorBase selector = mDomainSelectorFactory.create(mContext, slotId, subId,
                 selectorType, isEmergency, getLooper(), ist, mDestroyListener,
-                mCrossSimRedialingController, mCarrierConfigHelper, mEmergencyCallbackModeHelper);
+                mCrossSimRedialingController, mDataConnectionStateHelper);
 
         if (selector != null) {
             // Ensures that ImsStateTracker is started before selecting the domain if not started
diff --git a/src/com/android/services/telephony/rcs/TelephonyRcsService.java b/src/com/android/services/telephony/rcs/TelephonyRcsService.java
index f6ba40b..63753c2 100644
--- a/src/com/android/services/telephony/rcs/TelephonyRcsService.java
+++ b/src/com/android/services/telephony/rcs/TelephonyRcsService.java
@@ -33,6 +33,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.PhoneConfigurationManager;
+import com.android.internal.telephony.flags.FeatureFlags;
 import com.android.internal.telephony.metrics.RcsStats;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.phone.ImsStateCallbackController;
@@ -63,7 +64,8 @@
         /**
          * @return an instance of {@link UceControllerManager} associated with the slot specified.
          */
-        UceControllerManager createUceControllerManager(Context context, int slotId, int subId);
+        UceControllerManager createUceControllerManager(Context context, int slotId, int subId,
+                FeatureFlags featureFlags);
 
         /**
          * @return an instance of {@link SipTransportController} for the slot and subscription
@@ -80,8 +82,8 @@
 
         @Override
         public UceControllerManager createUceControllerManager(Context context, int slotId,
-                int subId) {
-            return new UceControllerManager(context, slotId, subId);
+                int subId, FeatureFlags featureFlags) {
+            return new UceControllerManager(context, slotId, subId, featureFlags);
         }
 
         @Override
@@ -112,6 +114,7 @@
 
     private final Context mContext;
     private final Object mLock = new Object();
+    private final FeatureFlags mFeatureFlags;
     private int mNumSlots;
 
     // Maps slot ID -> RcsFeatureController.
@@ -160,23 +163,26 @@
         return true;
     });
 
-    public TelephonyRcsService(Context context, int numSlots) {
+    public TelephonyRcsService(Context context, int numSlots, FeatureFlags featureFlags) {
         mContext = context;
         mNumSlots = numSlots;
         mFeatureControllers = new SparseArray<>(numSlots);
         mSlotToAssociatedSubIds = new SparseArray<>(numSlots);
         mRcsUceEnabled = sResourceProxy.getDeviceUceEnabled(mContext);
+        mFeatureFlags = featureFlags;
         RcsStats.getInstance().registerUceCallback();
     }
 
     @VisibleForTesting
-    public TelephonyRcsService(Context context, int numSlots, ResourceProxy resourceProxy) {
+    public TelephonyRcsService(Context context, int numSlots, ResourceProxy resourceProxy,
+            FeatureFlags featureFlags) {
         mContext = context;
         mNumSlots = numSlots;
         mFeatureControllers = new SparseArray<>(numSlots);
         mSlotToAssociatedSubIds = new SparseArray<>(numSlots);
         sResourceProxy = resourceProxy;
         mRcsUceEnabled = sResourceProxy.getDeviceUceEnabled(mContext);
+        mFeatureFlags = featureFlags;
         RcsStats.getInstance().registerUceCallback();
     }
 
@@ -310,8 +316,8 @@
     private void updateSupportedFeatures(RcsFeatureController c, int slotId, int subId) {
         if (isDeviceUceEnabled() && doesSubscriptionSupportPresence(subId)) {
             if (c.getFeature(UceControllerManager.class) == null) {
-                c.addFeature(mFeatureFactory.createUceControllerManager(mContext, slotId, subId),
-                        UceControllerManager.class);
+                c.addFeature(mFeatureFactory.createUceControllerManager(
+                        mContext, slotId, subId, mFeatureFlags), UceControllerManager.class);
             }
         } else {
             if (c.getFeature(UceControllerManager.class) != null) {
diff --git a/src/com/android/services/telephony/rcs/UceControllerManager.java b/src/com/android/services/telephony/rcs/UceControllerManager.java
index 02ae048..b7e12a3 100644
--- a/src/com/android/services/telephony/rcs/UceControllerManager.java
+++ b/src/com/android/services/telephony/rcs/UceControllerManager.java
@@ -32,6 +32,7 @@
 import com.android.ims.RcsFeatureManager;
 import com.android.ims.rcs.uce.UceController;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.FeatureFlags;
 
 import java.io.PrintWriter;
 import java.util.List;
@@ -53,15 +54,17 @@
     private final int mSlotId;
     private final Context mContext;
     private final ExecutorService mExecutorService;
+    private final FeatureFlags mFeatureFlags;
 
     private volatile @Nullable UceController mUceController;
     private volatile @Nullable RcsFeatureManager mRcsFeatureManager;
 
-    public UceControllerManager(Context context, int slotId, int subId) {
+    public UceControllerManager(Context context, int slotId, int subId, FeatureFlags featureFlags) {
         Log.d(LOG_TAG, "create: slotId=" + slotId + ", subId=" + subId);
         mSlotId = slotId;
         mContext = context;
         mExecutorService = Executors.newSingleThreadExecutor();
+        mFeatureFlags = featureFlags;
         initUceController(subId);
     }
 
@@ -70,11 +73,12 @@
      */
     @VisibleForTesting
     public UceControllerManager(Context context, int slotId, ExecutorService executor,
-            UceController uceController) {
+            UceController uceController, FeatureFlags featureFlags) {
         mSlotId = slotId;
         mContext = context;
         mExecutorService = executor;
         mUceController = uceController;
+        mFeatureFlags = featureFlags;
     }
 
     @Override
@@ -440,7 +444,7 @@
         if (mUceController == null) {
             // Create new UceController only when the subscription ID is valid.
             if (SubscriptionManager.isValidSubscriptionId(newSubId)) {
-                mUceController = new UceController(mContext, newSubId);
+                mUceController = new UceController(mContext, newSubId, mFeatureFlags);
             }
         } else if (mUceController.getSubId() != newSubId) {
             // The subscription ID is updated. Remove the old UceController instance.
@@ -448,7 +452,7 @@
             mUceController = null;
             // Create new UceController only when the subscription ID is valid.
             if (SubscriptionManager.isValidSubscriptionId(newSubId)) {
-                mUceController = new UceController(mContext, newSubId);
+                mUceController = new UceController(mContext, newSubId, mFeatureFlags);
             }
         }
     }
diff --git a/testapps/GbaTestApp/res/values-as/strings.xml b/testapps/GbaTestApp/res/values-as/strings.xml
index 3fbba0f..48b8163 100644
--- a/testapps/GbaTestApp/res/values-as/strings.xml
+++ b/testapps/GbaTestApp/res/values-as/strings.xml
@@ -20,7 +20,7 @@
     <string name="request_naf_url" msgid="4487793541217737042">"নেটৱৰ্ক এপ্লিকেশ্বন ফাংশ্বন (NAF) URL"</string>
     <string name="request_force_bootstrapping" msgid="206043602616214325">"বলেৰে বুটষ্ট্ৰেপিং কৰিবনে?"</string>
     <string name="request_org" msgid="8416693445448308975">"প্ৰতিষ্ঠানৰ ক’ড"</string>
-    <string name="request_security_protocol" msgid="1444164827561010482">"UA সুৰক্ষা প্ৰ’ট’কল আইডি"</string>
+    <string name="request_security_protocol" msgid="1444164827561010482">"UA সুৰক্ষা প্ৰ্ৰ\'টকল আইডি"</string>
     <string name="request_tls_cipher_suite" msgid="6659854717595308404">"TLS Cipher Suite আইডি"</string>
     <string name="response_success" msgid="2469204471244527663">"GBA প্ৰমাণীকৰণ সফল হৈছে নেকি?"</string>
     <string name="response_fail_reason" msgid="3401426967253202496">"ব্যৰ্থতাৰ কাৰণৰ আইডি"</string>
diff --git a/testapps/GbaTestApp/res/values-fr-rCA/strings.xml b/testapps/GbaTestApp/res/values-fr-rCA/strings.xml
index 2c7abc6..a23732e 100644
--- a/testapps/GbaTestApp/res/values-fr-rCA/strings.xml
+++ b/testapps/GbaTestApp/res/values-fr-rCA/strings.xml
@@ -16,8 +16,8 @@
     <string name="title_activity_test_config" msgid="7585204485536359713">"TestConfigActivity"</string>
     <string name="service_package_name" msgid="7204809439090483315">"Nom de l\'ensemble de service GBA"</string>
     <string name="service_release_time" msgid="532937496122890892">"Délai de libération du service après un appel"</string>
-    <string name="request_app_type" msgid="3975978141673475612">"Type d\'application UICC"</string>
-    <string name="request_naf_url" msgid="4487793541217737042">"URL de fonction d\'application réseau (NAF)"</string>
+    <string name="request_app_type" msgid="3975978141673475612">"Type d\'appli UICC"</string>
+    <string name="request_naf_url" msgid="4487793541217737042">"URL de fonction d\'appli réseau (NAF)"</string>
     <string name="request_force_bootstrapping" msgid="206043602616214325">"Forcer l\'amorçage?"</string>
     <string name="request_org" msgid="8416693445448308975">"Code d\'organisation"</string>
     <string name="request_security_protocol" msgid="1444164827561010482">"Identifiant de protocole de sécurité UA"</string>
diff --git a/testapps/GbaTestApp/res/values-mn/strings.xml b/testapps/GbaTestApp/res/values-mn/strings.xml
index 0aa62b0..1559c33 100644
--- a/testapps/GbaTestApp/res/values-mn/strings.xml
+++ b/testapps/GbaTestApp/res/values-mn/strings.xml
@@ -25,7 +25,7 @@
     <string name="response_success" msgid="2469204471244527663">"GBA-г амжилттай баталгаажуулсан уу?"</string>
     <string name="response_fail_reason" msgid="3401426967253202496">"Амжилтгүй болсон шалтгааны ID"</string>
     <string name="response_key" msgid="8839847772051686309">"GBA-н түлхүүр (CK + IK)"</string>
-    <string name="response_btid" msgid="2550216722679350756">"Эхлүүлэх гүйлгээний таниулбар (B-TID)"</string>
+    <string name="response_btid" msgid="2550216722679350756">"Эхлүүлэх гүйлгээний танигч (B-TID)"</string>
     <string name="sample_naf" msgid="255371174145881001">"3GPP-bootstrapping@naf1.operator.com"</string>
     <string name="sample_btid" msgid="6967620309576384966">"(B-TID)"</string>
     <string name="sample_key" msgid="3337589659405527482">"6629fae49393a05397450978507c4ef1"</string>
diff --git a/testapps/TestSatelliteApp/AndroidManifest.xml b/testapps/TestSatelliteApp/AndroidManifest.xml
index fb30bf3..eaddf95 100644
--- a/testapps/TestSatelliteApp/AndroidManifest.xml
+++ b/testapps/TestSatelliteApp/AndroidManifest.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2023 The Android Open Source Project
+  ~ Copyright (C) 2024 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.
@@ -46,6 +46,7 @@
         <activity android:name=".Provisioning" />
         <activity android:name=".MultipleSendReceive" />
         <activity android:name=".SendReceive" />
+        <activity android:name=".NbIotSatellite" />
         <activity android:name=".TestSatelliteWrapper" />
     </application>
 </manifest>
diff --git a/testapps/TestSatelliteApp/res/layout/activity_NbIotSatellite.xml b/testapps/TestSatelliteApp/res/layout/activity_NbIotSatellite.xml
new file mode 100644
index 0000000..c33522e
--- /dev/null
+++ b/testapps/TestSatelliteApp/res/layout/activity_NbIotSatellite.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2024 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
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:gravity="center"
+    android:paddingStart="4dp"
+    android:paddingEnd="4dp">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:layout_weight="0"
+        android:textColor="@android:color/holo_blue_dark"
+        android:textSize="20sp"
+        android:text="@string/NbIotSatellite"/>
+    <Button
+        android:id="@+id/testRegisterForSupportedStateChanged"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp"
+        android:text="@string/testRegisterForSupportedStateChanged"/>
+    <Button
+        android:id="@+id/testUnregisterForSupportedStateChanged"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp"
+        android:text="@string/testUnregisterForSupportedStateChanged"/>
+    <Button
+        android:id="@+id/testRequestIsSupported"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp"
+        android:text="@string/testRequestIsSupported"/>
+     <Button
+        android:id="@+id/reportSatelliteSupportedFromModem"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp"
+        android:text="@string/reportSatelliteSupportedFromModem"/>
+    <Button
+        android:id="@+id/reportSatelliteNotSupportedFromModem"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp"
+        android:text="@string/reportSatelliteNotSupportedFromModem"/>
+    <Button
+        android:id="@+id/showCurrentSatelliteSupportedStated"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp"
+        android:text="@string/showCurrentSatelliteSupportedStated"/>
+    <Button
+        android:id="@+id/Back"
+        android:onClick="Back"
+        android:textColor="@android:color/holo_blue_dark"
+        android:layout_marginTop="100dp"
+        android:layout_gravity="center"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingStart="4dp"
+        android:paddingEnd="4dp"
+        android:text="@string/Back"/>
+    <TextView
+        android:id="@+id/text_id"
+        android:layout_width="300dp"
+        android:layout_height="200dp"
+        android:textColor="@android:color/holo_blue_light"
+        android:textSize="15sp" />
+</LinearLayout>
diff --git a/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml b/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
index 6a79412..6aec1da 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_SatelliteControl.xml
@@ -119,6 +119,12 @@
             android:layout_height="wrap_content"
             android:paddingRight="4dp"
             android:text="@string/isRequestIsSatelliteEnabledForCarrier"/>
+        <Button
+            android:id="@+id/getIsEmergency"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/getIsEmergency"/>
          <Button
             android:id="@+id/Back"
             android:onClick="Back"
diff --git a/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml b/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml
index 0753b82..5ba7946 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2023 The Android Open Source Project
+  ~ Copyright (C) 2024 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.
@@ -65,9 +65,17 @@
              android:paddingRight="4dp"
              android:text="@string/SendReceive"/>
         <Button
+            android:id="@+id/NbIotSatellite"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingStart="4dp"
+            android:paddingEnd="4dp"
+            android:text="@string/NbIotSatellite"/>
+        <Button
             android:id="@+id/TestSatelliteWrapper"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:paddingStart="4dp"
             android:paddingEnd="4dp"
             android:text="@string/TestSatelliteWrapper"/>
     </LinearLayout>
diff --git a/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
index 7f2f026..43bb1c5 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
@@ -130,6 +130,18 @@
             android:layout_height="wrap_content"
             android:paddingRight="4dp"
             android:text="@string/getSatellitePlmnsForCarrier"/>
+        <Button
+            android:id="@+id/registerForCarrierRoamingNtnModeChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/registerForCarrierRoamingNtnModeChanged"/>
+        <Button
+            android:id="@+id/unregisterForCarrierRoamingNtnModeChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/unregisterForCarrierRoamingNtnModeChanged"/>
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
index 20f5ca8..e7fbb97 100644
--- a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
+++ b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ Copyright (C) 2023 The Android Open Source Project
+  ~ Copyright (C) 2024 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.
@@ -21,6 +21,7 @@
     <string name="Provisioning">Provisioning APIs</string>
     <string name="MultipleSendReceive">Test multiple poll and send</string>
     <string name="SendReceive">Send and Receive datagrams</string>
+    <string name="NbIotSatellite">NB IoT Satellite modem interface test</string>
 
     <string name="enableSatellite">enableSatellite</string>
     <string name="disableSatellite">disableSatellite</string>
@@ -30,6 +31,7 @@
     <string name="requestSatelliteCapabilities">requestSatelliteCapabilities</string>
     <string name="requestIsSatelliteCommunicationAllowedForCurrentLocation">requestIsSatelliteCommunicationAllowedForCurrentLocation</string>
     <string name="requestTimeForNextSatelliteVisibility">requestTimeForNextSatelliteVisibility</string>
+    <string name="getIsEmergency">getIsEmergency</string>
 
     <string name="pollPendingSatelliteDatagrams">pollPendingSatelliteDatagrams</string>
     <string name="sendSatelliteDatagram">sendSatelliteDatagram</string>
@@ -82,6 +84,16 @@
     <string name="isSatelliteEnabledForCarrier">isSatelliteEnabledForCarrier</string>
     <string name="isRequestIsSatelliteEnabledForCarrier">isRequestIsSatelliteEnabledForCarrier</string>
 
+    <string name="testRegisterForSupportedStateChanged">testRegisterForSupportedStateChanged</string>
+    <string name="testUnregisterForSupportedStateChanged">testUnregisterForSupportedStateChanged</string>
+    <string name="testRequestIsSupported">testRequestIsSupported</string>
+    <string name="reportSatelliteSupportedFromModem">reportSatelliteSupportedFromModem</string>
+    <string name="reportSatelliteNotSupportedFromModem">reportSatelliteNotSupportedFromModem</string>
+    <string name="showCurrentSatelliteSupportedStated">showCurrentSatelliteSupportedStated</string>
+
     <string name="Back">Back</string>
     <string name="ClearLog">Clear Log</string>
+
+    <string name="registerForCarrierRoamingNtnModeChanged">registerForCarrierRoamingNtnModeChanged</string>
+    <string name="unregisterForCarrierRoamingNtnModeChanged">unregisterForCarrierRoamingNtnModeChanged</string>
 </resources>
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Datagram.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Datagram.java
index 9ea1b44..6c0b227 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Datagram.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/Datagram.java
@@ -154,6 +154,14 @@
         }
 
         @Override
+        public void onSendDatagramStateChanged(
+                int datagramType, int state, int sendPendingCount, int errorCode) {
+            Log.d(TAG, "onSendDatagramStateChanged in TestApp: datagramType = " + datagramType
+                    + ", state =" + mTransferState + ", sendPendingCount =" + sendPendingCount
+                    + ", errorCode=" + errorCode);
+        }
+
+        @Override
         public void onReceiveDatagramStateChanged(
                 int state, int receivePendingCount, int errorCode) {
             mTransferState = state;
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/NbIotSatellite.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/NbIotSatellite.java
new file mode 100644
index 0000000..17646f0
--- /dev/null
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/NbIotSatellite.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2024 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.testapps.satellitetestapp;
+
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.OutcomeReceiver;
+import android.telephony.satellite.SatelliteManager;
+import android.telephony.satellite.SatelliteSupportedStateCallback;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.TextView;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Activity related to NB IoT satellite APIs.
+ */
+public class NbIotSatellite extends Activity {
+
+    private static final String TAG = "NbIotSatellite";
+    private static final String MY_SHARED_PREF = "MySharedPref";
+    private static final String SHARED_PREF_KEY = "supported_stated";
+    TextView mTextView;
+    private boolean mSatelliteSupported = false;
+    public static TestSatelliteService sSatelliteService;
+    private SatelliteManager mSatelliteManager;
+    private TestSatelliteSupportedStateCallback mSatelliteSupportedStateCallback;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        sSatelliteService = SatelliteTestApp.getTestSatelliteService();
+        mSatelliteManager = getSystemService(SatelliteManager.class);
+
+        setContentView(R.layout.activity_NbIotSatellite);
+        findViewById(R.id.testRegisterForSupportedStateChanged)
+                .setOnClickListener(this::testRegisterForSupportedStateChanged);
+        findViewById(R.id.testUnregisterForSupportedStateChanged)
+                .setOnClickListener(this::testUnregisterForSupportedStateChanged);
+        findViewById(R.id.testRequestIsSupported)
+                .setOnClickListener(this::testRequestIsSupported);
+        findViewById(R.id.reportSatelliteSupportedFromModem)
+                .setOnClickListener(this::reportSatelliteSupportedFromModem);
+        findViewById(R.id.reportSatelliteNotSupportedFromModem)
+                .setOnClickListener(this::reportSatelliteNotSupportedFromModem);
+        findViewById(R.id.showCurrentSatelliteSupportedStated)
+                .setOnClickListener(this::showCurrentSatelliteSupportedStated);
+        findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActivity(new Intent(NbIotSatellite.this, SatelliteTestApp.class));
+            }
+        });
+
+        mTextView = findViewById(R.id.text_id);
+    }
+
+    protected class TestSatelliteSupportedStateCallback implements SatelliteSupportedStateCallback {
+        @Override
+        public void onSatelliteSupportedStateChanged(boolean supported) {
+            mSatelliteSupported = supported;
+            updateLogMessage("onSatelliteSupportedStateChanged: "
+                    + (mSatelliteSupported ? "Satellite is supported"
+                    : "Satellite is not supported"));
+            Log.d(TAG, "onSatelliteSupportedStateChanged(): supported="
+                    + mSatelliteSupported);
+        }
+    }
+
+    @SuppressLint("MissingPermission")
+    private void testRegisterForSupportedStateChanged(View view) {
+        if (mSatelliteSupportedStateCallback == null) {
+            mSatelliteSupportedStateCallback = new TestSatelliteSupportedStateCallback();
+        }
+        int result = mSatelliteManager.registerForSupportedStateChanged(Runnable::run,
+                mSatelliteSupportedStateCallback);
+
+        if (result == SATELLITE_RESULT_SUCCESS) {
+            updateLogMessage("testRegisterForSupportedStateChanged(): "
+                    + "registered mSatelliteSupportedStateCallback");
+        } else {
+            updateLogMessage("Failed to registerForSupportedStateChanged(), reason=" + result);
+        }
+    }
+
+    @SuppressLint("MissingPermission")
+    private void testUnregisterForSupportedStateChanged(View view) {
+        if (mSatelliteSupportedStateCallback != null) {
+            mSatelliteManager.unregisterForSupportedStateChanged(mSatelliteSupportedStateCallback);
+            mSatelliteSupportedStateCallback = null;
+            updateLogMessage("testUnregisterForSupportedStateChanged(): unregister callback.");
+        } else {
+            updateLogMessage("testUnregisterForSupportedStateChanged(): ignored, "
+                    + "mSatelliteSupportedStateCallback is already null");
+        }
+    }
+
+    private void testRequestIsSupported(View view) {
+        final AtomicReference<Boolean> enabled = new AtomicReference<>();
+        final AtomicReference<Integer> errorCode = new AtomicReference<>();
+        OutcomeReceiver<Boolean, SatelliteManager.SatelliteException> mReceiver =
+                new OutcomeReceiver<>() {
+                        @Override
+                        public void onResult(Boolean result) {
+                            enabled.set(result);
+                            updateLogMessage("Status for requestIsSupported result: "
+                                    + enabled.get());
+                        }
+
+                        @Override
+                        public void onError(SatelliteManager.SatelliteException exception) {
+                            errorCode.set(exception.getErrorCode());
+                            updateLogMessage("Status for requestIsSupported error : "
+                                    + SatelliteErrorUtils.mapError(errorCode.get()));
+                        }
+                    };
+        mSatelliteManager.requestIsSupported(Runnable::run, mReceiver);
+    }
+
+    private void showCurrentSatelliteSupportedStated(View view) {
+        boolean mModemSupportedState = sSatelliteService.getSatelliteSupportedState();
+        updateLogMessage("reported supported state is " + mSatelliteSupported
+                        + ", modem supported state is " + mModemSupportedState);
+    }
+
+    private void reportSatelliteSupportedFromModem(View view) {
+        sSatelliteService.updateSatelliteSupportedState(true);
+    }
+
+    private void reportSatelliteNotSupportedFromModem(View view) {
+        sSatelliteService.updateSatelliteSupportedState(false);
+    }
+
+    // Fetch the stored data in onResume()
+    // Because this is what will be called when the app opens again
+    @Override
+    protected void onResume() {
+        super.onResume();
+        // Fetching the stored data from the SharedPreference
+        SharedPreferences sh = getSharedPreferences("MySharedPref", MODE_PRIVATE);
+        boolean isProvisioned = sh.getBoolean("provision_state", mSatelliteSupported);
+
+        // Setting the fetched data
+        mSatelliteSupported = isProvisioned;
+    }
+
+    // Store the data in the SharedPreference in the onPause() method
+    // When the user closes the application onPause() will be called and data will be stored
+    @Override
+    protected void onPause() {
+        super.onPause();
+        // Creating a shared pref object with a file name "MySharedPref" in private mode
+        SharedPreferences sharedPreferences = getSharedPreferences(MY_SHARED_PREF, MODE_PRIVATE);
+        SharedPreferences.Editor myEdit = sharedPreferences.edit();
+
+        // write all the data entered by the user in SharedPreference and apply
+        myEdit.putBoolean(SHARED_PREF_KEY, mSatelliteSupported);
+        myEdit.apply();
+    }
+
+    private void updateLogMessage(String message) {
+        runOnUiThread(() -> mTextView.setText(message));
+    }
+
+    protected void onDestroy() {
+        super.onDestroy();
+        SharedPreferences sharedPreferences = getSharedPreferences(MY_SHARED_PREF, MODE_PRIVATE);
+
+        final SharedPreferences.Editor sharedPrefsEditor = sharedPreferences.edit();
+        sharedPrefsEditor.remove(SHARED_PREF_KEY);
+        sharedPrefsEditor.apply();
+    }
+}
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
index dd7b825..a03f04e 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteControl.java
@@ -81,6 +81,8 @@
                 .setOnClickListener(this::isSatelliteEnabledForCarrierApp);
         findViewById(R.id.isRequestIsSatelliteEnabledForCarrier)
                 .setOnClickListener(this::isRequestIsSatelliteEnabledForCarrierApp);
+        findViewById(R.id.getIsEmergency)
+                .setOnClickListener(this::getIsEmergencyApp);
         findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -92,8 +94,8 @@
     private void enableSatelliteApp(View view) {
         LinkedBlockingQueue<Integer> error = new LinkedBlockingQueue<>(1);
         mSatelliteManager.requestEnabled(
-                new EnableRequestAttributes.Builder(true).setDemoMode(true).build(),
-                Runnable::run, error::offer);
+                new EnableRequestAttributes.Builder(true).setDemoMode(true).setEmergencyMode(true)
+                        .build(), Runnable::run, error::offer);
         TextView textView = findViewById(R.id.text_id);
         try {
             Integer value = error.poll(TIMEOUT, TimeUnit.MILLISECONDS);
@@ -374,4 +376,11 @@
                 + SatelliteTestApp.getTestSatelliteService()
                 .isRequestIsSatelliteEnabledForCarrier());
     }
+
+    private void getIsEmergencyApp(View view) {
+        TextView textView = findViewById(R.id.text_id);
+        textView.setText("[SatelliteService] getIsEmergencyApp= "
+                + SatelliteTestApp.getTestSatelliteService()
+                .getIsEmergency());
+    }
 }
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java
index c8ee5fa..7c4ae00 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 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.
@@ -89,6 +89,13 @@
                 startActivity(intent);
             }
         });
+        findViewById(R.id.NbIotSatellite).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(SatelliteTestApp.this, NbIotSatellite.class);
+                startActivity(intent);
+            }
+        });
         findViewById(R.id.TestSatelliteWrapper).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SendReceive.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SendReceive.java
index ab7b1c4..ede2377 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SendReceive.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SendReceive.java
@@ -108,6 +108,14 @@
         }
 
         @Override
+        public void onSendDatagramStateChanged(
+                int datagramType, int state, int sendPendingCount, int errorCode) {
+            Log.d(TAG, "onSendDatagramStateChanged in TestApp for sendReceive: state = "
+                    + state + ", sendPendingCount =" + sendPendingCount + ", errorCode="
+                    + errorCode + ", datagramType = " + datagramType);
+        }
+
+        @Override
         public void onReceiveDatagramStateChanged(
                 int state, int receivePendingCount, int errorCode) {
             Log.d(TAG, "onReceiveDatagramStateChanged in TestApp for sendReceive: state = "
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 af37611..b5b781c 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 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.
@@ -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;
@@ -100,6 +101,7 @@
     private List<String> mAllPlmnList = new ArrayList<>();
     private boolean mIsSatelliteEnabledForCarrier;
     private boolean mIsRequestIsSatelliteEnabledForCarrier;
+    private boolean mIsEmergnecy;
 
     /**
      * Create TestSatelliteService using the Executor specified for methods being called from
@@ -117,6 +119,7 @@
         mIsCellularModemEnabledMode = false;
         mIsSatelliteEnabledForCarrier = false;
         mIsRequestIsSatelliteEnabledForCarrier = false;
+        mIsEmergnecy = false;
     }
 
     /**
@@ -184,8 +187,9 @@
 
     @Override
     public void requestSatelliteEnabled(boolean enableSatellite, boolean enableDemoMode,
-            @NonNull IIntegerConsumer errorCallback) {
-        logd("requestSatelliteEnabled: mErrorCode=" + mErrorCode + " enable = " + enableSatellite);
+            boolean isEmergency, @NonNull IIntegerConsumer errorCallback) {
+        logd("requestSatelliteEnabled: mErrorCode=" + mErrorCode + " enable = " + enableSatellite
+                + " isEmergency=" + isEmergency);
         if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
             runWithExecutor(() -> errorCallback.accept(mErrorCode));
             return;
@@ -196,6 +200,7 @@
         } else {
             disableSatellite(errorCallback);
         }
+        mIsEmergnecy = isEmergency;
     }
 
     private void enableSatellite(@NonNull IIntegerConsumer errorCallback) {
@@ -371,22 +376,6 @@
     }
 
     @Override
-    public void requestIsSatelliteCommunicationAllowedForCurrentLocation(
-            @NonNull IIntegerConsumer errorCallback, @NonNull IBooleanConsumer callback) {
-        logd("requestIsCommunicationAllowedForCurrentLocation: mErrorCode=" + mErrorCode);
-        if (mErrorCode != SatelliteResult.SATELLITE_RESULT_SUCCESS) {
-            runWithExecutor(() -> errorCallback.accept(mErrorCode));
-            return;
-        }
-
-        if (mIsCommunicationAllowedInLocation) {
-            runWithExecutor(() -> callback.accept(true));
-        } else {
-            runWithExecutor(() -> callback.accept(false));
-        }
-    }
-
-    @Override
     public void requestTimeForNextSatelliteVisibility(@NonNull IIntegerConsumer errorCallback,
             @NonNull IIntegerConsumer callback) {
         logd("requestTimeForNextSatelliteVisibility: mErrorCode=" + mErrorCode);
@@ -446,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;
@@ -483,6 +489,16 @@
     }
 
     /**
+     * Helper method to report satellite supported from modem side for testing purpose.
+     * @param supported whether satellite is supported from modem or not.
+     */
+    public void sendOnSatelliteSupportedStateChanged(boolean supported) {
+        logd("sendOnSatelliteSupportedStateChanged: supported=" + supported);
+        mRemoteListeners.values().forEach(listener -> runWithExecutor(() ->
+                listener.onSatelliteSupportedStateChanged(supported)));
+    }
+
+    /**
      * Helper method to verify that the satellite modem is properly configured to receive
      * requests.
      *
@@ -581,6 +597,26 @@
         return mIsRequestIsSatelliteEnabledForCarrier;
     }
 
+    public boolean getIsEmergency() {
+        return mIsEmergnecy;
+    }
+
+    /**
+     * Helper methoid to provide a way to set supported state from test application to mock modem.
+     * @param supported whether satellite is supported by modem or not.
+     */
+    public void updateSatelliteSupportedState(boolean  supported) {
+        logd("updateSatelliteSupportedState: supported=" + supported);
+        mIsSupported = supported;
+        mRemoteListeners.values().forEach(listener -> runWithExecutor(
+                () -> listener.onSatelliteSupportedStateChanged(mIsSupported)));
+
+    }
+
+    public boolean getSatelliteSupportedState() {
+        return mIsSupported;
+    }
+
     /**
      * Log the message to the radio buffer with {@code DEBUG} priority.
      *
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
index 4f0679d..93a8131 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
@@ -23,6 +23,7 @@
 import android.os.OutcomeReceiver;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
+import android.telephony.satellite.wrapper.CarrierRoamingNtnModeListenerWrapper;
 import android.telephony.satellite.wrapper.NtnSignalStrengthCallbackWrapper;
 import android.telephony.satellite.wrapper.NtnSignalStrengthWrapper;
 import android.telephony.satellite.wrapper.SatelliteCapabilitiesCallbackWrapper;
@@ -53,6 +54,7 @@
     private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
     private SatelliteManagerWrapper mSatelliteManagerWrapper;
     private NtnSignalStrengthCallback mNtnSignalStrengthCallback = null;
+    private CarrierRoamingNtnModeListener mCarrierRoamingNtnModeListener = null;
     private SatelliteCapabilitiesCallbackWrapper mSatelliteCapabilitiesCallback;
     private SubscriptionManager mSubscriptionManager;
     private int mSubId;
@@ -99,6 +101,10 @@
                 .setOnClickListener(this::getAttachRestrictionReasonsForCarrier);
         findViewById(R.id.getSatellitePlmnsForCarrier)
                 .setOnClickListener(this::getSatellitePlmnsForCarrier);
+        findViewById(R.id.registerForCarrierRoamingNtnModeChanged)
+                .setOnClickListener(this::registerForCarrierRoamingNtnModeChanged);
+        findViewById(R.id.unregisterForCarrierRoamingNtnModeChanged)
+                .setOnClickListener(this::unregisterForCarrierRoamingNtnModeChanged);
         findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -180,6 +186,39 @@
         }
     }
 
+    private void registerForCarrierRoamingNtnModeChanged(View view) {
+        addLogMessage("registerForCarrierRoamingNtnModeChanged");
+        logd("registerForCarrierRoamingNtnModeChanged()");
+        if (mCarrierRoamingNtnModeListener == null) {
+            logd("Creating new CarrierRoamingNtnModeListener instance.");
+            mCarrierRoamingNtnModeListener = new CarrierRoamingNtnModeListener();
+        }
+
+        try {
+            mSatelliteManagerWrapper.registerForCarrierRoamingNtnModeChanged(mSubId, mExecutor,
+                    mCarrierRoamingNtnModeListener);
+        } catch (Exception ex) {
+            String errorMessage = "registerForCarrierRoamingNtnModeChanged: " + ex.getMessage();
+            logd(errorMessage);
+            addLogMessage(errorMessage);
+            mCarrierRoamingNtnModeListener = null;
+        }
+    }
+
+    private void unregisterForCarrierRoamingNtnModeChanged(View view) {
+        addLogMessage("unregisterForCarrierRoamingNtnModeChanged");
+        logd("unregisterForCarrierRoamingNtnModeChanged()");
+        if (mCarrierRoamingNtnModeListener != null) {
+            mSatelliteManagerWrapper.unregisterForCarrierRoamingNtnModeChanged(mSubId,
+                    mCarrierRoamingNtnModeListener);
+            mCarrierRoamingNtnModeListener = null;
+            addLogMessage("mCarrierRoamingNtnModeListener was unregistered");
+        } else {
+            addLogMessage("mCarrierRoamingNtnModeListener is null, ignored.");
+        }
+    }
+
+
     private void registerForNtnSignalStrengthChanged(View view) {
         addLogMessage("registerForNtnSignalStrengthChanged");
         logd("registerForNtnSignalStrengthChanged()");
@@ -248,7 +287,7 @@
                         String message = "Received SatelliteCapabillities : "
                                 + SatelliteCapabilities;
                         logd(message);
-                        runOnUiThread(() -> addLogMessage(message));
+                        addLogMessage(message);
                     };
         }
 
@@ -281,7 +320,17 @@
                 @NonNull NtnSignalStrengthWrapper ntnSignalStrength) {
             String message = "Received NTN SignalStrength : " + ntnSignalStrength.getLevel();
             logd(message);
-            runOnUiThread(() -> addLogMessage(message));
+            addLogMessage(message);
+        }
+    }
+
+    private class CarrierRoamingNtnModeListener implements CarrierRoamingNtnModeListenerWrapper {
+
+        @Override
+        public void onCarrierRoamingNtnModeChanged(boolean active) {
+            String message = "Received onCarrierRoamingNtnModeChanged active: " + active;
+            logd(message);
+            addLogMessage(message);
         }
     }
 
@@ -317,7 +366,7 @@
         }
 
         Consumer<Integer> callback = result -> {
-            runOnUiThread(() -> addLogMessage("requestAttachEnabledForCarrier result: " + result));
+            addLogMessage("requestAttachEnabledForCarrier result: " + result);
             logd("requestAttachEnabledForCarrier result: " + result);
         };
 
@@ -342,7 +391,7 @@
         }
 
         Consumer<Integer> callback = result -> {
-            runOnUiThread(() -> addLogMessage("requestAttachEnabledForCarrier result: " + result));
+            addLogMessage("requestAttachEnabledForCarrier result: " + result);
             logd("requestAttachEnabledForCarrier result: " + result);
         };
 
@@ -409,7 +458,7 @@
         int reason = SatelliteManagerWrapper.SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER;
 
         Consumer<Integer> callback = result -> {
-            runOnUiThread(() -> addLogMessage("addAttachRestrictionForCarrier result: " + result));
+            addLogMessage("addAttachRestrictionForCarrier result: " + result);
             logd("addAttachRestrictionForCarrier result: " + result);
         };
 
@@ -436,8 +485,7 @@
         int reason = SatelliteManagerWrapper.SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER;
 
         Consumer<Integer> callback = result -> {
-            runOnUiThread(
-                    () -> addLogMessage("removeAttachRestrictionForCarrier result: " + result));
+            addLogMessage("removeAttachRestrictionForCarrier result: " + result);
             logd("removeAttachRestrictionForCarrier result: " + result);
         };
 
@@ -569,9 +617,11 @@
     }
 
     private void addLogMessage(String message) {
-        mLogMessages.add(message);
-        mAdapter.notifyDataSetChanged();
-        mLogListView.setSelection(mAdapter.getCount() - 1);
+        runOnUiThread(() -> {
+            mLogMessages.add(message);
+            mAdapter.notifyDataSetChanged();
+            mLogListView.setSelection(mAdapter.getCount() - 1);
+        });
     }
 
     private static void logd(String message) {
diff --git a/tests/Android.bp b/tests/Android.bp
index 6086781..22b2f46 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -50,7 +50,6 @@
         "testables",
         "platform-compat-test-rules",
         "flag-junit",
-        "telephony_flags_core_java_lib",
         "satellite-s2storage-rw",
         "satellite-s2storage-testutils",
         "s2-geometry-library-java",
diff --git a/tests/src/com/android/TestContext.java b/tests/src/com/android/TestContext.java
index 111df53..a96ce2e 100644
--- a/tests/src/com/android/TestContext.java
+++ b/tests/src/com/android/TestContext.java
@@ -19,6 +19,7 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.when;
 
 import android.content.AttributionSource;
 import android.content.BroadcastReceiver;
@@ -61,6 +62,7 @@
     @Mock SubscriptionManager mMockSubscriptionManager;
     @Mock ImsManager mMockImsManager;
     @Mock UserManager mMockUserManager;
+    @Mock PackageManager mPackageManager;
 
     private final SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
 
@@ -80,6 +82,7 @@
             int subId = (int) invocation.getArguments()[0];
             return getTestConfigs(subId);
         }).when(mMockCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
+        when(mPackageManager.hasSystemFeature(anyString())).thenReturn(true);
     }
 
     @Override
@@ -145,6 +148,11 @@
     }
 
     @Override
+    public PackageManager getPackageManager() {
+        return mPackageManager;
+    }
+
+    @Override
     public ContentResolver getContentResolver() {
         return null;
     }
diff --git a/tests/src/com/android/phone/ImsProvisioningControllerTest.java b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
index e12be53..6599f03 100644
--- a/tests/src/com/android/phone/ImsProvisioningControllerTest.java
+++ b/tests/src/com/android/phone/ImsProvisioningControllerTest.java
@@ -77,6 +77,7 @@
 import com.android.ims.ImsConfig;
 import com.android.ims.ImsManager;
 import com.android.ims.RcsFeatureManager;
+import com.android.internal.telephony.flags.FeatureFlags;
 
 import org.junit.After;
 import org.junit.Before;
@@ -169,6 +170,9 @@
     @Mock
     IBinder mIbinder1;
 
+    @Mock
+    FeatureFlags mFeatureFlags;
+
     private SubscriptionManager.OnSubscriptionsChangedListener mSubChangedListener;
 
     private Handler mHandler;
@@ -192,7 +196,7 @@
         TestImsProvisioningController() {
             super(mPhone, 2, mHandlerThread.getLooper(),
                     mMmTelFeatureConnector, mRcsFeatureConnector,
-                    mImsProvisioningLoader);
+                    mImsProvisioningLoader, mFeatureFlags);
         }
 
         protected int getSubId(int slotId) {
@@ -369,8 +373,6 @@
         }
 
         // verify other interactions
-        verifyNoMoreInteractions(mIFeatureProvisioningCallback0);
-        verifyNoMoreInteractions(mIFeatureProvisioningCallback1);
         verifyNoMoreInteractions(mImsConfig);
     }
 
@@ -408,8 +410,6 @@
         verify(mImsConfig, times(1)).setConfig(eq(key), anyInt());
 
         // verify other interactions
-        verifyNoMoreInteractions(mIFeatureProvisioningCallback0);
-        verifyNoMoreInteractions(mIFeatureProvisioningCallback1);
         verifyNoMoreInteractions(mImsConfig);
     }
 
@@ -926,8 +926,6 @@
         verify(mImsConfig, times(1)).setConfig(
                 eq(KEY_VOICE_OVER_WIFI_ENABLED_OVERRIDE), eq(PROVISIONING_VALUE_ENABLED));
 
-        verifyNoMoreInteractions(mIFeatureProvisioningCallback0);
-        verifyNoMoreInteractions(mIFeatureProvisioningCallback1);
         verifyNoMoreInteractions(mImsConfig);
         verifyNoMoreInteractions(mImsProvisioningLoader);
     }
@@ -1849,6 +1847,184 @@
         verifyNoMoreInteractions(mImsConfig);
     }
 
+    @Test
+    @SmallTest
+    public void initialNotifyMmTelProvisioningStatusWhenCallbackRegistered() throws Exception {
+        when(mFeatureFlags.notifyInitialImsProvisioningStatus()).thenReturn(true);
+
+        createImsProvisioningController();
+
+        // Provisioning required for capability on all network type
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_UT_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_SMS_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_CALL_COMPOSER_INT_ARRAY, RADIO_TECHS);
+
+        // Stored provisioning Status
+        mMmTelProvisioningStorage = new int[][] {
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, 0},
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN, 1},
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_CROSS_SIM, 1},
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_NR, 1},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE, 0},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_IWLAN, 0},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_CROSS_SIM, 1},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_NR, 1},
+                {CAPABILITY_TYPE_UT, REGISTRATION_TECH_LTE, 0},
+                {CAPABILITY_TYPE_UT, REGISTRATION_TECH_IWLAN, 0},
+                {CAPABILITY_TYPE_UT, REGISTRATION_TECH_CROSS_SIM, 0},
+                {CAPABILITY_TYPE_UT, REGISTRATION_TECH_NR, 0},
+                {CAPABILITY_TYPE_SMS, REGISTRATION_TECH_LTE, 1},
+                {CAPABILITY_TYPE_SMS, REGISTRATION_TECH_IWLAN, 1},
+                {CAPABILITY_TYPE_SMS, REGISTRATION_TECH_CROSS_SIM, 1},
+                {CAPABILITY_TYPE_SMS, REGISTRATION_TECH_NR, 1},
+                {CAPABILITY_TYPE_CALL_COMPOSER, REGISTRATION_TECH_LTE, 1},
+                {CAPABILITY_TYPE_CALL_COMPOSER, REGISTRATION_TECH_IWLAN, 1},
+                {CAPABILITY_TYPE_CALL_COMPOSER, REGISTRATION_TECH_CROSS_SIM, 0},
+                {CAPABILITY_TYPE_CALL_COMPOSER, REGISTRATION_TECH_NR, 1}
+        };
+
+        try {
+            mTestImsProvisioningController.addFeatureProvisioningChangedCallback(
+                    mSubId0, mIFeatureProvisioningCallback0);
+        } catch (Exception e) {
+            throw new AssertionError("not expected exception", e);
+        }
+        processAllMessages();
+
+        for (int[] capa: mMmTelProvisioningStorage) {
+            verify(mIFeatureProvisioningCallback0, times(1))
+                    .onFeatureProvisioningChanged(eq(capa[0]), eq(capa[1]), eq(capa[2] == 1));
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void initialNotifyRcsProvisioningStatusWhenCallbackRegistered() throws Exception {
+        when(mFeatureFlags.notifyInitialImsProvisioningStatus()).thenReturn(true);
+
+        createImsProvisioningController();
+
+        // Provisioning required capability : PRESENCE, tech : all
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
+
+        // Stored provisioning Status
+        mRcsProvisioningStorage = new int[][]{
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, 1},
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_IWLAN, 1},
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_CROSS_SIM, 0},
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_NR, 1}
+        };
+
+        try {
+            mTestImsProvisioningController.addFeatureProvisioningChangedCallback(
+                    mSubId0, mIFeatureProvisioningCallback0);
+        } catch (Exception e) {
+            throw new AssertionError("not expected exception", e);
+        }
+        processAllMessages();
+
+        for (int[] capa: mRcsProvisioningStorage) {
+            verify(mIFeatureProvisioningCallback0, times(1))
+                    .onRcsFeatureProvisioningChanged(eq(capa[0]), eq(capa[1]), eq(capa[2] == 1));
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void initialNotifyMmTelProvisioningStatusWhenImsServiceConnected() throws Exception {
+        when(mFeatureFlags.notifyInitialImsProvisioningStatus()).thenReturn(true);
+
+        createImsProvisioningController();
+
+        // Provisioning required for capability on all network type
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VOICE_INT_ARRAY,
+                RADIO_TECHS);
+        setCarrierConfig(mSubId0, CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_VIDEO_INT_ARRAY,
+                RADIO_TECHS);
+
+        // Stored provisioning Status
+        mMmTelProvisioningStorage = new int[][] {
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_LTE, 1},
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_IWLAN, 1},
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_CROSS_SIM, 1},
+                {CAPABILITY_TYPE_VOICE, REGISTRATION_TECH_NR, 1},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_LTE, 1},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_IWLAN, 0},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_CROSS_SIM, 0},
+                {CAPABILITY_TYPE_VIDEO, REGISTRATION_TECH_NR, 1},
+        };
+
+        try {
+            mTestImsProvisioningController.addFeatureProvisioningChangedCallback(
+                    mSubId0, mIFeatureProvisioningCallback0);
+        } catch (Exception e) {
+            throw new AssertionError("not expected exception", e);
+        }
+        processAllMessages();
+
+        // clear interactions
+        clearInvocations(mIFeatureProvisioningCallback0);
+
+        // ImsService connected
+        mMmTelConnectorListener0.getValue().connectionReady(mImsManager, mSubId0);
+
+        for (int[] capa: mMmTelProvisioningStorage) {
+            verify(mIFeatureProvisioningCallback0, times(1))
+                    .onFeatureProvisioningChanged(eq(capa[0]), eq(capa[1]), eq(capa[2] == 1));
+        }
+
+        verifyNoMoreInteractions(mIFeatureProvisioningCallback0);
+    }
+
+    @Test
+    @SmallTest
+    public void initialNotifyRcsProvisioningStatusWhenRcsServiceConnected() throws Exception {
+        when(mFeatureFlags.notifyInitialImsProvisioningStatus()).thenReturn(true);
+
+        createImsProvisioningController();
+
+        // Provisioning required capability : PRESENCE, tech : all
+        setCarrierConfig(mSubId0,
+                CarrierConfigManager.Ims.KEY_CAPABILITY_TYPE_PRESENCE_UCE_INT_ARRAY, RADIO_TECHS);
+
+        // Stored provisioning Status
+        mRcsProvisioningStorage = new int[][]{
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_LTE, 1},
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_IWLAN, 0},
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_CROSS_SIM, 0},
+                {CAPABILITY_TYPE_PRESENCE_UCE, REGISTRATION_TECH_NR, 1}
+        };
+
+        try {
+            mTestImsProvisioningController.addFeatureProvisioningChangedCallback(
+                    mSubId0, mIFeatureProvisioningCallback0);
+        } catch (Exception e) {
+            throw new AssertionError("not expected exception", e);
+        }
+        processAllMessages();
+
+        // clear interactions
+        clearInvocations(mIFeatureProvisioningCallback0);
+
+        // ImsService connected
+        mRcsConnectorListener0.getValue().connectionReady(mRcsFeatureManager, mSubId0);
+
+        for (int[] capa: mRcsProvisioningStorage) {
+            verify(mIFeatureProvisioningCallback0, times(1))
+                    .onRcsFeatureProvisioningChanged(eq(capa[0]), eq(capa[1]), eq(capa[2] == 1));
+        }
+
+        verifyNoMoreInteractions(mIFeatureProvisioningCallback0);
+    }
+
     private void createImsProvisioningController() throws Exception {
         if (Looper.myLooper() == null) {
             Looper.prepare();
diff --git a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
index 04fce84..2d46c80 100644
--- a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
+++ b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
@@ -23,6 +23,8 @@
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
@@ -32,6 +34,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.AppOpsManager;
 import android.compat.testing.PlatformCompatChangeRule;
 import android.content.Context;
 import android.content.SharedPreferences;
@@ -64,6 +67,7 @@
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import java.util.Collections;
 import java.util.Locale;
 
 /**
@@ -91,6 +95,9 @@
     @Mock
     private SubscriptionManagerService mSubscriptionManagerService;
 
+    @Mock
+    private AppOpsManager mAppOps;
+
     @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Before
@@ -118,6 +125,8 @@
         doReturn(false).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
         mPhoneInterfaceManager.setPackageManager(mPackageManager);
         doReturn(true).when(mPackageManager).hasSystemFeature(anyString());
+
+        mPhoneInterfaceManager.setAppOpsManager(mAppOps);
     }
 
     @Test
@@ -414,7 +423,8 @@
      */
     @Test
     public void getCarrierRestrictionStatus() {
-        when(mPhoneInterfaceManager.validateCallerAndGetCarrierId(anyString())).thenReturn(1);
+        when(mPhoneInterfaceManager.validateCallerAndGetCarrierIds(anyString())).thenReturn(
+                Collections.singleton(1));
         mPhoneInterfaceManager.getCarrierRestrictionStatus(mIIntegerConsumer,
                 "com.test.package");
     }
@@ -423,37 +433,18 @@
     public void notifyEnableDataWithAppOps_enableByUser_doNoteOp() {
         mSetFlagsRule.enableFlags(Flags.FLAG_OP_ENABLE_MOBILE_DATA_BY_USER);
         String packageName = "INVALID_PACKAGE";
-        String error = "";
-        try {
-            mPhoneInterfaceManager.setDataEnabledForReason(1,
-                    TelephonyManager.DATA_ENABLED_REASON_USER, true, packageName);
-        } catch (SecurityException expected) {
-            // The test doesn't have access to note the op, but we're just interested that it makes
-            // the attempt.
-            error = expected.getMessage();
-        }
-
-        String appop = "ENABLE_MOBILE_DATA_BY_USER";
-        assertTrue("expected error to contain " + packageName + " but it didn't: " + error,
-                error.contains(packageName));
-        assertTrue("expected error to contain " + appop + " but it didn't: " + error,
-                error.contains(appop));
+        mPhoneInterfaceManager.setDataEnabledForReason(1,
+                TelephonyManager.DATA_ENABLED_REASON_USER, true, packageName);
+        verify(mAppOps).noteOpNoThrow(eq(AppOpsManager.OPSTR_ENABLE_MOBILE_DATA_BY_USER), anyInt(),
+                eq(packageName), isNull(), isNull());
     }
 
     @Test
     public void notifyEnableDataWithAppOps_enableByCarrier_doNotNoteOp() {
         mSetFlagsRule.enableFlags(Flags.FLAG_OP_ENABLE_MOBILE_DATA_BY_USER);
         String packageName = "INVALID_PACKAGE";
-        String error = "";
-        try {
-            mPhoneInterfaceManager.setDataEnabledForReason(1,
-                    TelephonyManager.DATA_ENABLED_REASON_CARRIER, true, packageName);
-        } catch (SecurityException expected) {
-            // The test doesn't have access to note the op, but we're just interested that it makes
-            // the attempt.
-            error = expected.getMessage();
-        }
-        assertEquals("Expected error to be empty, was " + error, error, "");
+        verify(mAppOps, never()).noteOpNoThrow(eq(AppOpsManager.OPSTR_ENABLE_MOBILE_DATA_BY_USER),
+                anyInt(), eq(packageName), isNull(), isNull());
     }
 
     @Test
diff --git a/tests/src/com/android/phone/ServiceStateProviderTest.java b/tests/src/com/android/phone/ServiceStateProviderTest.java
index 1d2ca74..ab26e94 100644
--- a/tests/src/com/android/phone/ServiceStateProviderTest.java
+++ b/tests/src/com/android/phone/ServiceStateProviderTest.java
@@ -123,6 +123,11 @@
             public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
                 throw new TestNotifierException();
             }
+            @Override
+            public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork,
+                    int userHandle) {
+                throw new TestNotifierException();
+            }
         };
         doReturn(mContentResolver).when(mContext).getContentResolver();
 
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index e6f70aa..8eba53b 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -17,21 +17,27 @@
 package com.android.phone.satellite.accesscontrol;
 
 import static android.telephony.satellite.SatelliteManager.KEY_SATELLITE_COMMUNICATION_ALLOWED;
-import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_ERROR;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_LOCATION_NOT_AVAILABLE;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_ERROR;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
 import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
 
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.EVENT_CONFIG_DATA_UPDATED;
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.GOOGLE_US_SAN_SAT_S2_FILE_NAME;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -42,16 +48,22 @@
 
 import android.annotation.Nullable;
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.location.Location;
 import android.location.LocationManager;
 import android.location.LocationRequest;
+import android.os.AsyncResult;
 import android.os.Bundle;
 import android.os.CancellationSignal;
+import android.os.DropBoxManager;
+import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
+import android.os.Message;
 import android.os.ResultReceiver;
 import android.telecom.TelecomManager;
+import android.telephony.satellite.SatelliteManager;
 import android.testing.TestableLooper;
 import android.util.Log;
 import android.util.Pair;
@@ -65,6 +77,7 @@
 import com.android.internal.telephony.satellite.SatelliteConfig;
 import com.android.internal.telephony.satellite.SatelliteConfigParser;
 import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.internal.telephony.satellite.SatelliteModemInterface;
 
 import org.junit.After;
 import org.junit.Before;
@@ -77,13 +90,12 @@
 
 import java.io.File;
 import java.lang.reflect.Field;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
@@ -114,26 +126,50 @@
     @Mock
     private SatelliteController mMockSatelliteController;
     @Mock
+    private SatelliteModemInterface mMockSatelliteModemInterface;
+    @Mock
+    private DropBoxManager mMockDropBoxManager;
+    @Mock
     private Context mMockContext;
-    @Mock private Phone mMockPhone;
-    @Mock private Phone mMockPhone2;
-    @Mock private FeatureFlags mMockFeatureFlags;
-    @Mock private Resources mMockResources;
-    @Mock private SatelliteOnDeviceAccessController mMockSatelliteOnDeviceAccessController;
-    @Mock Location mMockLocation0;
-    @Mock Location mMockLocation1;
-    @Mock File mMockSatS2File;
+    @Mock
+    private Phone mMockPhone;
+    @Mock
+    private Phone mMockPhone2;
+    @Mock
+    private FeatureFlags mMockFeatureFlags;
+    @Mock
+    private Resources mMockResources;
+    @Mock
+    private SatelliteOnDeviceAccessController mMockSatelliteOnDeviceAccessController;
+    @Mock
+    Location mMockLocation0;
+    @Mock
+    Location mMockLocation1;
+    @Mock
+    File mMockSatS2File;
+    @Mock
+    SharedPreferences mMockSharedPreferences;
+    @Mock
+    private SharedPreferences.Editor mMockSharedPreferencesEditor;
+    @Mock
+    private Map<SatelliteOnDeviceAccessController.LocationToken, Boolean>
+            mMockCachedAccessRestrictionMap;
 
     private Looper mLooper;
     private TestableLooper mTestableLooper;
     private Phone[] mPhones;
     private TestSatelliteAccessController mSatelliteAccessControllerUT;
+
     @Captor
     private ArgumentCaptor<CancellationSignal> mLocationRequestCancellationSignalCaptor;
     @Captor
     private ArgumentCaptor<Consumer<Location>> mLocationRequestConsumerCaptor;
     @Captor
-    private ArgumentCaptor<ResultReceiver> mResultReceiverFromSatelliteControllerCaptor;
+    private ArgumentCaptor<Handler> mConfigUpdateHandlerCaptor;
+    @Captor
+    private ArgumentCaptor<Integer> mConfigUpdateIntCaptor;
+    @Captor
+    private ArgumentCaptor<Object> mConfigUpdateObjectCaptor;
     private boolean mQueriedSatelliteAllowed = false;
     private int mQueriedSatelliteAllowedResultCode = SATELLITE_RESULT_SUCCESS;
     private Semaphore mSatelliteAllowedSemaphore = new Semaphore(0);
@@ -161,33 +197,6 @@
         }
     };
 
-    private boolean mQueriedSatelliteAllowed2 = false;
-    private int mQueriedSatelliteAllowedResultCode2 = SATELLITE_RESULT_SUCCESS;
-    private Semaphore mSatelliteAllowedSemaphore2 = new Semaphore(0);
-    private ResultReceiver mSatelliteAllowedReceiver2 = new ResultReceiver(null) {
-        @Override
-        protected void onReceiveResult(int resultCode, Bundle resultData) {
-            mQueriedSatelliteAllowedResultCode2 = resultCode;
-            if (resultCode == SATELLITE_RESULT_SUCCESS) {
-                if (resultData.containsKey(KEY_SATELLITE_COMMUNICATION_ALLOWED)) {
-                    mQueriedSatelliteAllowed2 = resultData.getBoolean(
-                            KEY_SATELLITE_COMMUNICATION_ALLOWED);
-                } else {
-                    logd("KEY_SATELLITE_COMMUNICATION_ALLOWED does not exist.");
-                    mQueriedSatelliteAllowed2 = false;
-                }
-            } else {
-                logd("mSatelliteAllowedReceiver2: resultCode=" + resultCode);
-                mQueriedSatelliteAllowed2 = false;
-            }
-            try {
-                mSatelliteAllowedSemaphore2.release();
-            } catch (Exception ex) {
-                fail("mSatelliteAllowedReceiver2: Got exception in releasing semaphore, ex=" + ex);
-            }
-        }
-    };
-
     @Before
     public void setUp() throws Exception {
         logd("setUp");
@@ -205,14 +214,20 @@
                 Context.LOCATION_SERVICE);
         when(mMockContext.getSystemServiceName(TelecomManager.class)).thenReturn(
                 Context.TELECOM_SERVICE);
+        when(mMockContext.getSystemServiceName(DropBoxManager.class)).thenReturn(
+                Context.DROPBOX_SERVICE);
         when(mMockContext.getSystemService(LocationManager.class)).thenReturn(
                 mMockLocationManager);
         when(mMockContext.getSystemService(TelecomManager.class)).thenReturn(
                 mMockTelecomManager);
-        mPhones = new Phone[] {mMockPhone, mMockPhone2};
+        when(mMockContext.getSystemService(DropBoxManager.class)).thenReturn(
+                mMockDropBoxManager);
+        mPhones = new Phone[]{mMockPhone, mMockPhone2};
         replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
         replaceInstance(SatelliteController.class, "sInstance", null,
                 mMockSatelliteController);
+        replaceInstance(SatelliteModemInterface.class, "sInstance", null,
+                mMockSatelliteModemInterface);
         replaceInstance(TelephonyCountryDetector.class, "sInstance", null,
                 mMockCountryDetector);
         when(mMockContext.getResources()).thenReturn(mMockResources);
@@ -228,9 +243,6 @@
         when(mMockResources.getInteger(com.android.internal.R.integer
                 .config_oem_enabled_satellite_location_fresh_duration))
                 .thenReturn(TEST_LOCATION_FRESH_DURATION_SECONDS);
-        doNothing().when(mMockSatelliteController)
-                .requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                        anyInt(), any(ResultReceiver.class));
 
         when(mMockLocationManager.getProviders(true)).thenReturn(LOCATION_PROVIDERS);
         when(mMockLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER))
@@ -244,6 +256,19 @@
         when(mMockSatelliteOnDeviceAccessController.isSatCommunicationAllowedAtLocation(
                 any(SatelliteOnDeviceAccessController.LocationToken.class))).thenReturn(true);
 
+        when(mMockContext.getSharedPreferences(anyString(), anyInt())).thenReturn(
+                mMockSharedPreferences);
+        when(mMockSharedPreferences.getBoolean(anyString(), anyBoolean())).thenReturn(true);
+        when(mMockSharedPreferences.getStringSet(anyString(), any()))
+                .thenReturn(Set.of(TEST_SATELLITE_COUNTRY_CODES));
+        doReturn(mMockSharedPreferencesEditor).when(mMockSharedPreferences).edit();
+        doReturn(mMockSharedPreferencesEditor).when(mMockSharedPreferencesEditor)
+                .putBoolean(anyString(), anyBoolean());
+        doReturn(mMockSharedPreferencesEditor).when(mMockSharedPreferencesEditor)
+                .putStringSet(anyString(), any());
+
+        when(mMockFeatureFlags.satellitePersistentLogging()).thenReturn(true);
+
         mSatelliteAccessControllerUT = new TestSatelliteAccessController(mMockContext,
                 mMockFeatureFlags, mLooper, mMockLocationManager, mMockTelecomManager,
                 mMockSatelliteOnDeviceAccessController, mMockSatS2File);
@@ -284,93 +309,35 @@
                 mSatelliteAllowedSemaphore, 1));
         assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, mQueriedSatelliteAllowedResultCode);
 
-        // OEM-enabled satellite is supported, but SatelliteController returns error for the query
+        // OEM-enabled satellite is supported
         when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
-        mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
-                SUB_ID, mSatelliteAllowedReceiver);
-        mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
 
-        clearInvocations(mMockSatelliteController);
-        mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
-                SUB_ID, mSatelliteAllowedReceiver2);
-        mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController, never())
-                .requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                        anyInt(), any(ResultReceiver.class));
-
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_ERROR, null);
-        assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
-                mSatelliteAllowedSemaphore, 1));
-        assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
-                mSatelliteAllowedSemaphore2, 1));
-        assertEquals(SATELLITE_RESULT_ERROR, mQueriedSatelliteAllowedResultCode);
-        assertEquals(SATELLITE_RESULT_ERROR, mQueriedSatelliteAllowedResultCode2);
-        assertFalse(mQueriedSatelliteAllowed);
-        assertFalse(mQueriedSatelliteAllowed2);
-
-        // SatelliteController returns success result but the result bundle does not have
-        // KEY_SATELLITE_COMMUNICATION_ALLOWED
+        // Satellite is not supported
+        setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_SUCCESS);
         clearAllInvocations();
         mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
                 SUB_ID, mSatelliteAllowedReceiver);
         mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, null);
         assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
                 mSatelliteAllowedSemaphore, 1));
         assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
         assertFalse(mQueriedSatelliteAllowed);
 
-        // SatelliteController returns disallowed result
+        // Failed to query whether satellite is supported or not
+        setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_MODEM_ERROR);
         clearAllInvocations();
         mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
                 SUB_ID, mSatelliteAllowedReceiver);
         mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, false);
         assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
                 mSatelliteAllowedSemaphore, 1));
-        assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
-        assertFalse(mQueriedSatelliteAllowed);
+        assertEquals(SATELLITE_RESULT_MODEM_ERROR, mQueriedSatelliteAllowedResultCode);
 
-        // SatelliteController returns allowed result. Network country codes are available, but one
-        // country code is not in the allowed list
+        // 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();
-        when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(listOf("US", "IN"));
-        mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
-                SUB_ID, mSatelliteAllowedReceiver);
-        mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, true);
-        assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
-                mSatelliteAllowedSemaphore, 1));
-        assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
-        assertFalse(mQueriedSatelliteAllowed);
-
-        // SatelliteController returns allowed result. Network country codes are available, and all
-        // country codes are in the allowed list
-        clearAllInvocations();
-        when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(listOf("US", "CA"));
-        mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
-                SUB_ID, mSatelliteAllowedReceiver);
-        mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, true);
-        assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
-                mSatelliteAllowedSemaphore, 1));
-        assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
-        assertTrue(mQueriedSatelliteAllowed);
-
-        // SatelliteController returns allowed result. 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;
@@ -379,9 +346,6 @@
         mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
                 SUB_ID, mSatelliteAllowedReceiver);
         mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, true);
         assertTrue(
                 mSatelliteAccessControllerUT.isKeepOnDeviceAccessControllerResourcesTimerStarted());
         verify(mMockSatelliteOnDeviceAccessController).isSatCommunicationAllowedAtLocation(
@@ -405,9 +369,9 @@
         mSatelliteAccessControllerUT.setSatelliteOnDeviceAccessController(
                 mMockSatelliteOnDeviceAccessController);
 
-        // SatelliteController returns allowed result. Network country codes are not available.
-        // TelecomManager.isInEmergencyCall() returns false. Phone0 is in ECM. On-device access
-        // controller will be used. Last known location is not fresh.
+        // Network country codes are not available. TelecomManager.isInEmergencyCall() returns
+        // false. Phone0 is in ECM. On-device access controller will be used. Last known location is
+        // not fresh.
         clearAllInvocations();
         when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(EMPTY_STRING_LIST);
         when(mMockTelecomManager.isInEmergencyCall()).thenReturn(false);
@@ -418,9 +382,6 @@
         mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
                 SUB_ID, mSatelliteAllowedReceiver);
         mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, true);
         assertFalse(
                 mSatelliteAccessControllerUT.isKeepOnDeviceAccessControllerResourcesTimerStarted());
         verify(mMockLocationManager).getCurrentLocation(eq(LocationManager.GPS_PROVIDER),
@@ -437,8 +398,10 @@
         assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSatelliteAllowedResultCode);
         assertTrue(mQueriedSatelliteAllowed);
 
-        // Timed out to wait for current location. No cached country codes.
+        // Timed out to wait for current location. No cached allowed state.
         clearAllInvocations();
+        mSatelliteAccessControllerUT.setIsSatelliteCommunicationAllowedForCurrentLocationCache(
+                "cache_clear_and_not_allowed");
         when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(EMPTY_STRING_LIST);
         when(mMockTelecomManager.isInEmergencyCall()).thenReturn(false);
         when(mMockPhone.isInEcm()).thenReturn(true);
@@ -450,9 +413,6 @@
         mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
                 SUB_ID, mSatelliteAllowedReceiver);
         mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, true);
         assertFalse(
                 mSatelliteAccessControllerUT.isKeepOnDeviceAccessControllerResourcesTimerStarted());
         verify(mMockLocationManager).getCurrentLocation(anyString(), any(LocationRequest.class),
@@ -465,17 +425,13 @@
         assertFalse(mSatelliteAccessControllerUT.isWaitForCurrentLocationTimerStarted());
         verify(mMockSatelliteOnDeviceAccessController, never()).isSatCommunicationAllowedAtLocation(
                 any(SatelliteOnDeviceAccessController.LocationToken.class));
-        verifyCountryDetectorApisCalled();
         assertTrue(waitForRequestIsSatelliteAllowedForCurrentLocationResult(
                 mSatelliteAllowedSemaphore, 1));
-        assertEquals(SATELLITE_RESULT_SUCCESS,
-                mQueriedSatelliteAllowedResultCode);
-        assertFalse(mQueriedSatelliteAllowed);
+        assertEquals(SATELLITE_RESULT_LOCATION_NOT_AVAILABLE, mQueriedSatelliteAllowedResultCode);
 
-        // SatelliteController returns allowed result. 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. No
-        // cached country codes are available.
+        // 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. No cached country codes are available.
         clearAllInvocations();
         when(mMockCountryDetector.getCurrentNetworkCountryIso()).thenReturn(EMPTY_STRING_LIST);
         when(mMockCountryDetector.getCachedLocationCountryIsoInfo()).thenReturn(new Pair<>("", 0L));
@@ -489,91 +445,94 @@
         mSatelliteAccessControllerUT.requestIsCommunicationAllowedForCurrentLocation(
                 SUB_ID, mSatelliteAllowedReceiver);
         mTestableLooper.processAllMessages();
-        verify(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, true);
         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);
         assertFalse(mQueriedSatelliteAllowed);
-
-        // SatelliteController returns allowed result. 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(mMockSatelliteController).requestIsSatelliteCommunicationAllowedForCurrentLocation(
-                anyInt(), mResultReceiverFromSatelliteControllerCaptor.capture());
-        sendSatelliteAllowResultFromSatelliteController(SATELLITE_RESULT_SUCCESS, true);
-        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
-    public void testUpdateSatelliteConfigData() {
-        // Verify the case when the configParser is not exist.
-        SatelliteConfigParser spyConfigParserNull =
-                spy(new SatelliteConfigParser((byte[]) null));
-        doReturn(spyConfigParserNull).when(mMockSatelliteController).getSatelliteConfigParser();
-        mSatelliteAccessControllerUT.updateSatelliteConfigData(mMockContext);
+    public void testUpdateSatelliteConfigData() throws Exception {
+        verify(mMockSatelliteController).registerForConfigUpdateChanged(
+                mConfigUpdateHandlerCaptor.capture(), mConfigUpdateIntCaptor.capture(),
+                mConfigUpdateObjectCaptor.capture());
 
-        assertNull(spyConfigParserNull.getConfig());
+        assertSame(mConfigUpdateHandlerCaptor.getValue(), mSatelliteAccessControllerUT);
+        assertSame(mConfigUpdateIntCaptor.getValue(), EVENT_CONFIG_DATA_UPDATED);
+        assertSame(mConfigUpdateObjectCaptor.getValue(), mMockContext);
 
-        // Verify the case when the configParser is exist but empty.
-        SatelliteConfigParser spyConfigParserEmpty =
+        replaceInstance(SatelliteAccessController.class, "mCachedAccessRestrictionMap",
+                mSatelliteAccessControllerUT, mMockCachedAccessRestrictionMap);
+
+        // These APIs are executed during loadRemoteConfigs
+        verify(mMockSharedPreferences, times(1)).getStringSet(anyString(), any());
+        verify(mMockSharedPreferences, times(1)).getBoolean(anyString(), anyBoolean());
+
+        // satelliteConfig is null
+        SatelliteConfigParser spyConfigParser =
                 spy(new SatelliteConfigParser("test".getBytes()));
-        doReturn(spyConfigParserEmpty).when(mMockSatelliteController).getSatelliteConfigParser();
-        mSatelliteAccessControllerUT.updateSatelliteConfigData(mMockContext);
+        doReturn(spyConfigParser).when(mMockSatelliteController).getSatelliteConfigParser();
+        assertNull(spyConfigParser.getConfig());
 
-        assertNull(spyConfigParserEmpty.getConfig());
+        sendConfigUpdateChangedEvent(mMockContext);
+        verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
 
-        // Verify the case when the configParser is exist and valid data
-        SatelliteConfig mockSatelliteConfig = mock(SatelliteConfig.class);
-        final String filePath = "/data/user_de/0/com.android.phone/app_satellite/s2_cell_file";
-        Path targetSatS2FilePath = Paths.get(filePath);
-        doReturn(false).when(mockSatelliteConfig).isFileExist(any());
-        doReturn(targetSatS2FilePath).when(mockSatelliteConfig)
-                .copySatS2FileToPhoneDirectory(any(), any());
-        doReturn(Arrays.asList("US")).when(mockSatelliteConfig).getDeviceSatelliteCountryCodes();
-        doReturn(false).when(mockSatelliteConfig).isSatelliteDataForAllowedRegion();
-        doReturn(targetSatS2FilePath).when(mockSatelliteConfig).getSatelliteS2CellFile(any());
-        doReturn(mockSatelliteConfig).when(mMockSatelliteController).getSatelliteConfig();
+        // satelliteConfig has invalid country codes
+        SatelliteConfig mockConfig = mock(SatelliteConfig.class);
+        doReturn(List.of("USA", "JAP")).when(mockConfig).getDeviceSatelliteCountryCodes();
+        doReturn(mockConfig).when(mMockSatelliteController).getSatelliteConfig();
+        doReturn(false).when(mockConfig).isSatelliteDataForAllowedRegion();
 
-        mSatelliteAccessControllerUT.updateSatelliteConfigData(mMockContext);
-        verify(mockSatelliteConfig, times(0)).getDeviceSatelliteCountryCodes();
-        verify(mockSatelliteConfig, times(0)).isSatelliteDataForAllowedRegion();
-        verify(mockSatelliteConfig, times(2)).getSatelliteS2CellFile(any());
+        sendConfigUpdateChangedEvent(mMockContext);
+        verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
+
+        // satelliteConfig does not have is_allow_access_control data
+        doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
+                .when(mockConfig).getDeviceSatelliteCountryCodes();
+        doReturn(null).when(mockConfig).isSatelliteDataForAllowedRegion();
+
+        sendConfigUpdateChangedEvent(mMockContext);
+        verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
+
+        // satelliteConfig doesn't have S2CellFile
+        File mockFile = mock(File.class);
+        doReturn(false).when(mockFile).exists();
+        doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
+                .when(mockConfig).getDeviceSatelliteCountryCodes();
+        doReturn(true).when(mockConfig).isSatelliteDataForAllowedRegion();
+        doReturn(mockFile).when(mockConfig).getSatelliteS2CellFile(mMockContext);
+
+        sendConfigUpdateChangedEvent(mMockContext);
+        verify(mMockSharedPreferences, never()).edit();
+        verify(mMockCachedAccessRestrictionMap, never()).clear();
+
+        // satelliteConfig has valid data
+        doReturn(mockConfig).when(mMockSatelliteController).getSatelliteConfig();
+        File testS2File = mSatelliteAccessControllerUT
+                .getTestSatelliteS2File(GOOGLE_US_SAN_SAT_S2_FILE_NAME);
+        doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
+                .when(mockConfig).getDeviceSatelliteCountryCodes();
+        doReturn(true).when(mockConfig).isSatelliteDataForAllowedRegion();
+        doReturn(testS2File).when(mockConfig).getSatelliteS2CellFile(mMockContext);
+
+        sendConfigUpdateChangedEvent(mMockContext);
+        verify(mMockSharedPreferences, times(2)).edit();
+        verify(mMockCachedAccessRestrictionMap, times(1)).clear();
+    }
+
+    private void sendConfigUpdateChangedEvent(Context context) {
+        Message msg = mSatelliteAccessControllerUT.obtainMessage(EVENT_CONFIG_DATA_UPDATED);
+        msg.obj = new AsyncResult(context, SATELLITE_RESULT_SUCCESS, null);
+        msg.sendToTarget();
+        mTestableLooper.processAllMessages();
     }
 
     private void clearAllInvocations() {
@@ -607,24 +566,44 @@
         return true;
     }
 
-    private void sendSatelliteAllowResultFromSatelliteController(
-            int resultCode, Boolean satelliteAllowed) {
-        Bundle bundle = null;
-        if (resultCode == SATELLITE_RESULT_SUCCESS) {
-            bundle = new Bundle();
-            if (satelliteAllowed != null) {
-                bundle.putBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED, satelliteAllowed);
-            }
-        }
-        mResultReceiverFromSatelliteControllerCaptor.getValue().send(resultCode, bundle);
-        mTestableLooper.processAllMessages();
-    }
-
     private void sendLocationRequestResult(Location location) {
         mLocationRequestConsumerCaptor.getValue().accept(location);
         mTestableLooper.processAllMessages();
     }
 
+    private void setUpResponseForRequestIsSatelliteSupported(
+            boolean isSatelliteSupported, @SatelliteManager.SatelliteResult int error) {
+        doAnswer(invocation -> {
+            ResultReceiver resultReceiver = invocation.getArgument(1);
+            if (error == SATELLITE_RESULT_SUCCESS) {
+                Bundle bundle = new Bundle();
+                bundle.putBoolean(SatelliteManager.KEY_SATELLITE_SUPPORTED, isSatelliteSupported);
+                resultReceiver.send(error, bundle);
+            } else {
+                resultReceiver.send(error, Bundle.EMPTY);
+            }
+            return null;
+        }).when(mMockSatelliteController).requestIsSatelliteSupported(anyInt(),
+                any(ResultReceiver.class));
+    }
+
+    private void setUpResponseForRequestIsSatelliteProvisioned(
+            boolean isSatelliteProvisioned, @SatelliteManager.SatelliteResult int error) {
+        doAnswer(invocation -> {
+            ResultReceiver resultReceiver = invocation.getArgument(1);
+            if (error == SATELLITE_RESULT_SUCCESS) {
+                Bundle bundle = new Bundle();
+                bundle.putBoolean(SatelliteManager.KEY_SATELLITE_PROVISIONED,
+                        isSatelliteProvisioned);
+                resultReceiver.send(error, bundle);
+            } else {
+                resultReceiver.send(error, Bundle.EMPTY);
+            }
+            return null;
+        }).when(mMockSatelliteController).requestIsSatelliteProvisioned(anyInt(),
+                any(ResultReceiver.class));
+    }
+
     @SafeVarargs
     private static <E> List<E> listOf(E... values) {
         return Arrays.asList(values);
diff --git a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApiTest.java b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApiTest.java
index f096e0d..f7cbc55 100644
--- a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApiTest.java
+++ b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementApiTest.java
@@ -29,6 +29,7 @@
 import static org.mockito.ArgumentMatchers.anyVararg;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
 
 import android.content.Context;
 import android.os.PersistableBundle;
@@ -39,6 +40,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.libraries.entitlement.ServiceEntitlement;
+import com.android.libraries.entitlement.ServiceEntitlementRequest;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -54,6 +56,7 @@
 public class SatelliteEntitlementApiTest {
     private static final String TEST_URL = "https://test.url";
     private static final List<String> TEST_PLMN_ALLOWED = Arrays.asList("31026", "302820");
+    private static final String TEST_APP_NAME = "androidSatmode";
     @Mock
     Context mContext;
     @Mock
@@ -83,18 +86,22 @@
 
         mSatelliteEntitlementAPI = new SatelliteEntitlementApi(mContext, mCarrierConfigBundle,
                 SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
-    }
 
-    @Test
-    public void testCheckEntitlementStatus() throws Exception {
         mCarrierConfigBundle.putString(
                 CarrierConfigManager.ImsServiceEntitlement.KEY_ENTITLEMENT_SERVER_URL_STRING,
                 TEST_URL);
+        mCarrierConfigBundle.putString(
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_APP_NAME_STRING,
+                TEST_APP_NAME);
+
         Field fieldServiceEntitlement = SatelliteEntitlementApi.class.getDeclaredField(
                 "mServiceEntitlement");
         fieldServiceEntitlement.setAccessible(true);
         fieldServiceEntitlement.set(mSatelliteEntitlementAPI, mServiceEntitlement);
+    }
 
+    @Test
+    public void testCheckEntitlementStatus() throws Exception {
         // Get the EntitlementStatus to DISABLED
         int expectedEntitlementStatus = SATELLITE_ENTITLEMENT_STATUS_DISABLED;
         doReturn(getResponse(SATELLITE_ENTITLEMENT_STATUS_DISABLED))
@@ -137,6 +144,22 @@
         assertTrue(result.getAllowedPLMNList().size() == 0);
     }
 
+    @Test
+    public void testServiceEntitlementRequest() throws Exception {
+        String expectedAppId = ServiceEntitlement.APP_SATELLITE_ENTITLEMENT;
+        doReturn(getResponse(SATELLITE_ENTITLEMENT_STATUS_DISABLED))
+                .when(mServiceEntitlement)
+                .queryEntitlementStatus(eq(expectedAppId), any());
+        ServiceEntitlementRequest.Builder requestBuilder = ServiceEntitlementRequest.builder();
+        requestBuilder.setAcceptContentType(ServiceEntitlementRequest.ACCEPT_CONTENT_TYPE_JSON);
+        requestBuilder.setAppName(TEST_APP_NAME);
+        ServiceEntitlementRequest expectedRequest = requestBuilder.build();
+
+        mSatelliteEntitlementAPI.checkEntitlementStatus();
+
+        verify(mServiceEntitlement).queryEntitlementStatus(eq(expectedAppId), eq(expectedRequest));
+    }
+
     private String getResponse(int entitlementStatus) {
         return "{\"VERS\":{\"version\":\"1\",\"validity\":\"172800\"},"
                 + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
diff --git a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java
index 18a0284..e663519 100644
--- a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java
+++ b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementControllerTest.java
@@ -16,8 +16,13 @@
 
 package com.android.phone.satellite.entitlement;
 
+import static com.android.libraries.entitlement.ServiceEntitlementException.ERROR_HTTP_STATUS_NOT_SUCCESS;
+import static com.android.phone.satellite.entitlement.SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_DISABLED;
 import static com.android.phone.satellite.entitlement.SatelliteEntitlementResult.SATELLITE_ENTITLEMENT_STATUS_ENABLED;
 
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -29,8 +34,11 @@
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.net.ConnectivityManager;
@@ -55,6 +63,7 @@
 import com.android.internal.telephony.ExponentialBackoff;
 import com.android.internal.telephony.satellite.SatelliteController;
 import com.android.internal.telephony.subscription.SubscriptionManagerService;
+import com.android.libraries.entitlement.ServiceEntitlementException;
 
 import org.junit.After;
 import org.junit.Before;
@@ -62,6 +71,8 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -70,6 +81,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
 
 @RunWith(AndroidJUnit4.class)
 public class SatelliteEntitlementControllerTest extends TelephonyTestBase {
@@ -77,8 +89,14 @@
     private static final int SUB_ID = 0;
     private static final int SUB_ID_2 = 1;
     private static final int[] ACTIVE_SUB_ID = {SUB_ID};
-    private static final int DEFAULT_QUERY_REFRESH_DAY = 30;
+    private static final int DEFAULT_QUERY_REFRESH_DAY = 7;
     private static final List<String> PLMN_ALLOWED_LIST = Arrays.asList("31026", "302820");
+    private static final List<String> PLMN_BARRED_LIST = Arrays.asList("12345", "98765");
+    private static final List<String> EMPTY_PLMN_LIST = new ArrayList<>();
+    private static final int CMD_START_QUERY_ENTITLEMENT = 1;
+    private static final int CMD_RETRY_QUERY_ENTITLEMENT = 2;
+    private static final int CMD_SIM_REFRESH = 3;
+    private static final int MAX_RETRY_COUNT = 5;
     @Mock
     CarrierConfigManager mCarrierConfigManager;
     @Mock
@@ -89,7 +107,6 @@
     @Mock SatelliteEntitlementApi mSatelliteEntitlementApi;
     @Mock SatelliteEntitlementResult mSatelliteEntitlementResult;
     @Mock SatelliteController mSatelliteController;
-    @Mock ExponentialBackoff mExponentialBackoff;
     private PersistableBundle mCarrierConfigBundle;
     private TestSatelliteEntitlementController mSatelliteEntitlementController;
     private Handler mHandler;
@@ -156,7 +173,8 @@
     }
 
     @Test
-    public void testIsQueryAvailable() throws Exception {
+    public void testShouldStartQueryEntitlement() throws Exception {
+        logd("testShouldStartQueryEntitlement");
         doReturn(ACTIVE_SUB_ID).when(mMockSubscriptionManagerService).getActiveSubIdList(true);
 
         // Verify don't start the query when KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL is false.
@@ -166,29 +184,18 @@
 
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         mCarrierConfigBundle.putBoolean(
                 CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true);
-        // Verify don't start the query when ExponentialBackoff is in progressed.
-        replaceInstance(SatelliteEntitlementController.class, "mExponentialBackoffPerSub",
-                mSatelliteEntitlementController, Map.of(SUB_ID, mExponentialBackoff));
-        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
-
-        verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
-        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
-
-        replaceInstance(SatelliteEntitlementController.class, "mExponentialBackoffPerSub",
-                mSatelliteEntitlementController, new HashMap<>());
         // Verify don't start the query when Internet is disconnected.
-        doReturn(ACTIVE_SUB_ID).when(mMockSubscriptionManagerService).getActiveSubIdList(true);
+        clearInvocationsForMock();
         setInternetConnected(false);
         mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
 
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         setInternetConnected(true);
         // Verify don't start the query when last query refresh time is not expired.
@@ -197,22 +204,52 @@
 
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
-        // Verify start the query when isQueryAvailable return true
         setLastQueryTime(0L);
+        // Verify don't start the query when retry count is reached max
+        setLastQueryTime(0L);
+        Map<Integer, Integer> mRetryCountPerSub = new HashMap<>();
+        mRetryCountPerSub.put(SUB_ID, MAX_RETRY_COUNT);
+        replaceInstance(SatelliteEntitlementController.class, "mRetryCountPerSub",
+                mSatelliteEntitlementController, mRetryCountPerSub);
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        replaceInstance(SatelliteEntitlementController.class, "mRetryCountPerSub",
+                mSatelliteEntitlementController, new HashMap<>());
+
+        // Verify don't start the query when query is in progressed.
+        Map<Integer, Boolean> mIsEntitlementInProgressPerSub = new HashMap<>();
+        mIsEntitlementInProgressPerSub.put(SUB_ID, true);
+        replaceInstance(SatelliteEntitlementController.class, "mIsEntitlementInProgressPerSub",
+                mSatelliteEntitlementController, mIsEntitlementInProgressPerSub);
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        replaceInstance(SatelliteEntitlementController.class, "mIsEntitlementInProgressPerSub",
+                mSatelliteEntitlementController, new HashMap<>());
+        // Verify the query starts when ShouldStartQueryEntitlement returns true.
         doReturn(mSatelliteEntitlementResult).when(
                 mSatelliteEntitlementApi).checkEntitlementStatus();
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
         mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
     }
 
     @Test
     public void testCheckSatelliteEntitlementStatus() throws Exception {
+        logd("testCheckSatelliteEntitlementStatus");
         setIsQueryAvailableTrue();
         // Verify don't call the checkSatelliteEntitlementStatus when getActiveSubIdList is empty.
         doReturn(new int[]{}).when(mMockSubscriptionManagerService).getActiveSubIdList(true);
@@ -221,7 +258,7 @@
         verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
         // Verify don't call the updateSatelliteEntitlementStatus.
         verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
-                anyBoolean(), anyList(), any());
+                anyBoolean(), anyList(), anyList(), any());
 
         // Verify call the checkSatelliteEntitlementStatus with invalid response.
         setIsQueryAvailableTrue();
@@ -234,26 +271,27 @@
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         // Verify call the updateSatelliteEntitlementStatus with satellite service is disabled
-        // and empty PLMNAllowed
+        // , empty PLMNAllowed and empty PLMNBarred.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID),
-                eq(false), eq(new ArrayList<>()), any());
+                eq(false), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
 
         // Verify call the checkSatelliteEntitlementStatus with the subscribed result.
         clearInvocationsForMock();
         setIsQueryAvailableTrue();
         doReturn(mSatelliteEntitlementResult).when(
                 mSatelliteEntitlementApi).checkEntitlementStatus();
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
         mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
-        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable and
-        // availablePLMNAllowedList
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // availablePLMNAllowedList and availablePLMNBarredList.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
 
-        // Change subId and verify call the updateSatelliteEntitlementStatus with  satellite
-        // service is enable and availablePLMNAllowedList
+        // Change subId and verify call the updateSatelliteEntitlementStatus with satellite
+        // service is enable, availablePLMNAllowedList and availablePLMNBarredList
         clearInvocationsForMock();
         doReturn(new int[]{SUB_ID_2}).when(mMockSubscriptionManagerService).getActiveSubIdList(
                 true);
@@ -261,23 +299,57 @@
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID_2), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // availablePLMNAllowedList and empty plmn barred list.
+        clearInvocationsForMock();
+        setIsQueryAvailableTrue();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                new ArrayList<>());
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(PLMN_ALLOWED_LIST), eq(EMPTY_PLMN_LIST), any());
+
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // empty PLMNAllowedList and PLMNBarredList.
+        clearInvocationsForMock();
+        setIsQueryAvailableTrue();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, new ArrayList<>(),
+                new ArrayList<>());
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+
+        // Verify call the updateSatelliteEntitlementStatus with satellite service is enable,
+        // empty PLMNAllowedList and availablePLMNBarredList.
+        clearInvocationsForMock();
+        setIsQueryAvailableTrue();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, new ArrayList<>(),
+                PLMN_BARRED_LIST);
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(EMPTY_PLMN_LIST), eq(PLMN_BARRED_LIST), any());
     }
 
     @Test
     public void testCheckSatelliteEntitlementStatusWhenInternetConnected() throws Exception {
-        Field fieldNetworkCallback = SatelliteEntitlementController.class.getDeclaredField(
-                "mNetworkCallback");
-        fieldNetworkCallback.setAccessible(true);
+        logd("testCheckSatelliteEntitlementStatusWhenInternetConnected");
         ConnectivityManager.NetworkCallback networkCallback =
-                (ConnectivityManager.NetworkCallback) fieldNetworkCallback.get(
-                        mSatelliteEntitlementController);
+                (ConnectivityManager.NetworkCallback) getValue("mNetworkCallback");
         Network mockNetwork = mock(Network.class);
 
         // Verify the called the checkSatelliteEntitlementStatus when Internet is connected.
         setInternetConnected(true);
         setLastQueryTime(0L);
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
 
         networkCallback.onAvailable(mockNetwork);
         mTestableLooper.processAllMessages();
@@ -285,22 +357,485 @@
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         // Verify call the updateSatelliteEntitlementStatus with satellite service is available.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
     }
 
     @Test
     public void testCheckSatelliteEntitlementStatusWhenCarrierConfigChanged() throws Exception {
+        logd("testCheckSatelliteEntitlementStatusWhenCarrierConfigChanged");
         // Verify the called the checkSatelliteEntitlementStatus when CarrierConfigChanged
         // occurred and Internet is connected.
         setInternetConnected(true);
         setLastQueryTime(0L);
-        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST);
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
         triggerCarrierConfigChanged();
 
         verify(mSatelliteEntitlementApi).checkEntitlementStatus();
         // Verify call the updateSatelliteEntitlementStatus with satellite service is available.
         verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
-                eq(PLMN_ALLOWED_LIST), any());
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+    }
+
+    @Test
+    public void testCheckWhenStartCmdIsReceivedDuringRetry() throws Exception {
+        logd("testCheckWhenStartCmdIsReceivedDuringRetry");
+        // Verify that start cmd is ignored and retry is performed up to 5 times when start cmd
+        // occurs during retries.
+        setIsQueryAvailableTrue();
+        set503RetryAfterResponse();
+        Map<Integer, Integer> retryCountPerSub =
+                (Map<Integer, Integer>) getValue("mRetryCountPerSub");
+
+        // Verify that the first query.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(1)).checkEntitlementStatus();
+        // Verify that the retry count is 0 after receiving a 503 with retry-after header in
+        // response.
+        assertTrue(retryCountPerSub.getOrDefault(SUB_ID, 0) == 0);
+
+        // Verify that the retry count is 1 for the second query when receiving a 503 with
+        // retry-after header in response.
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 1);
+
+        // Verify that the retry count is 2 for the third query when receiving a 503 with
+        // retry-after header in response.
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(3)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 2);
+
+        // Verify that start CMD is ignored during retries.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(3)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 2);
+
+        // Verify that the retry count is 3 for the forth query when receiving a 503 with
+        // retry-after header in response.
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(4)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 3);
+
+        // Verify that the retry count is 4 for the fifth query when receiving a 503 with
+        // retry-after header in response.
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(5)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 4);
+
+        // Verify that start CMD is ignored during retries.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(5)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 4);
+
+        // Verify that the retry count is 5 for the sixth query when receiving a 503 with
+        // retry-after header in response.
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(6)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+
+        // Verify only called onSatelliteEntitlementStatusUpdated once.
+        verify(mSatelliteController, times(1)).onSatelliteEntitlementStatusUpdated(eq(SUB_ID),
+                eq(false), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+
+        // Verify that the query is not restarted after reaching the maximum retry count even if
+        // a start cmd is received.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(6)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+
+        // Verify that the query is not restarted after reaching the maximum retry count even if
+        // a start cmd is received.
+        sendMessage(CMD_RETRY_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(6)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+    }
+
+    @Test
+    public void testCheckAfterInternetConnectionChangedDuringRetry() throws Exception {
+        logd("testCheckAfterInternetConnectionChangedDuringRetry");
+        // Verify that the retry count is maintained even when internet connection is lost and
+        // connected during retries, and that up to 5 retries are performed.
+        setIsQueryAvailableTrue();
+        set503RetryAfterResponse();
+        Map<Integer, Integer> retryCountPerSub =
+                (Map<Integer, Integer>) getValue("mRetryCountPerSub");
+
+        // Verify that the first query.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(1)).checkEntitlementStatus();
+        // Verify that the retry count is 0 after receiving a 503 with retry-after header in
+        // response.
+        assertTrue(retryCountPerSub.getOrDefault(SUB_ID, 0) == 0);
+
+        // Verify that the retry count is 1 for the second query when receiving a 503 with
+        // retry-after header in response.
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 1);
+
+        // Verify that no query is executed and the retry count does not increase when internet
+        // connection is lost during the second retry.
+        setInternetConnected(false);
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 1);
+
+        // Verify that the query is started when internet connection is restored and that the
+        // retry count does not increase.
+        setInternetConnected(true);
+        logd("internet connected again");
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(3)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 1);
+
+        // Verify that the retry count is increases after received a 503 with retry-after header
+        // in response.
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(4)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 2);
+
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(5)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 3);
+
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(6)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 4);
+
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(7)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+
+        // Verify that the query is not restarted after reaching the maximum retry count even if
+        // a start cmd is received.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(7)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+
+        // Verify that the query is not restarted after reaching the maximum retry count even if
+        // a retry cmd is received.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(7)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+
+        // Verify only called onSatelliteEntitlementStatusUpdated once.
+        verify(mSatelliteController, times(1)).onSatelliteEntitlementStatusUpdated(eq(SUB_ID),
+                eq(false), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_error500() throws Exception {
+        logd("testStartQueryEntitlementStatus_error500");
+        setIsQueryAvailableTrue();
+        Map<Integer, Integer> retryCountPerSub =
+                (Map<Integer, Integer>) getValue("mRetryCountPerSub");
+        setErrorResponse(500);
+
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(1)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+        verify(mSatelliteController, times(1)).onSatelliteEntitlementStatusUpdated(eq(SUB_ID),
+                eq(false), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_error503_retrySuccess() throws Exception {
+        logd("testStartQueryEntitlementStatus_error503_retrySuccess");
+        setIsQueryAvailableTrue();
+        set503RetryAfterResponse();
+        Map<Integer, Integer> retryCountPerSub =
+                (Map<Integer, Integer>) getValue("mRetryCountPerSub");
+
+        // Verify that the first query.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(1)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+
+        // Verify whether the query has been retried and verify called
+        // onSatelliteEntitlementStatusUpdated after receive a success case.
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_otherError_retrySuccess() throws Exception {
+        logd("testStartQueryEntitlementStatus_otherError_retrySuccess");
+        setIsQueryAvailableTrue();
+        Map<Integer, Integer> retryCountPerSub =
+                (Map<Integer, Integer>) getValue("mRetryCountPerSub");
+        Map<Integer, Boolean> isEntitlementInProgressPerSub =
+                (Map<Integer, Boolean>) getValue("mIsEntitlementInProgressPerSub");
+        Map<Integer, ExponentialBackoff> exponentialBackoffPerSub =
+                (Map<Integer, ExponentialBackoff>) getValue("mExponentialBackoffPerSub");
+        setErrorResponse(400);
+
+        // Verify start the exponentialBackoff.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(1)).checkEntitlementStatus();
+        assertNull(retryCountPerSub.get(SUB_ID));
+        assertTrue(isEntitlementInProgressPerSub.get(SUB_ID));
+        assertNotNull(exponentialBackoffPerSub.get(SUB_ID));
+        // Verify don't call the onSatelliteEntitlementStatusUpdated.
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // Verify the retry in progress.
+        sendMessage(CMD_RETRY_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 1);
+        // Verify don't call the onSatelliteEntitlementStatusUpdated.
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // Received the 200 response, Verify call the onSatelliteEntitlementStatusUpdated.
+        setIsQueryAvailableTrue();
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
+
+        sendMessage(CMD_RETRY_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi, times(3)).checkEntitlementStatus();
+        assertTrue(retryCountPerSub.get(SUB_ID) == 1);
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+    }
+
+    @Test
+    public void testSatelliteEntitlementSupportedChangedFromSupportToNotSupport() throws Exception {
+        logd("testSatelliteEntitlementSupportedChangedFromSupportToNotSupport");
+        setIsQueryAvailableTrue();
+
+        // KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL changed from Support(entitlement status
+        // disabled) to not support.
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_DISABLED, EMPTY_PLMN_LIST,
+                EMPTY_PLMN_LIST);
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+
+        // Verify call the onSatelliteEntitlementStatusUpdated - entitlement status false
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(anyInt(),
+                eq(false), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+
+        // Verify call the onSatelliteEntitlementStatusUpdated - entitlement status true
+        mCarrierConfigBundle.putBoolean(
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false);
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(anyInt(),
+                eq(true), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+
+        // KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL changed from Support(entitlement status
+        // enabled) to not support.
+        mCarrierConfigBundle.putBoolean(
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true);
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+
+        // Verify call the onSatelliteEntitlementStatusUpdated - entitlement status true.
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(anyInt(),
+                eq(true), eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+
+        // Verify not call the onSatelliteEntitlementStatusUpdated.
+        clearInvocationsForMock();
+        mCarrierConfigBundle.putBoolean(
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false);
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                eq(true), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_refreshStatus() throws Exception {
+        logd("testStartQueryEntitlementStatus_refreshStatus");
+        setIsQueryAvailableTrue();
+        mCarrierConfigBundle.putInt(
+                CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT, 1);
+
+        // Verify start query and success.
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // After move to the refresh time, verify the query started and success.
+        setLastQueryTime(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1) - 1000);
+        mTestableLooper.moveTimeForward(TimeUnit.DAYS.toMillis(1));
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        verify(mSatelliteController, times(2)).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_internetDisconnectedAndConnectedAgain()
+            throws Exception {
+        logd("testStartQueryEntitlementStatus_internetDisconnectedAndConnectedAgain");
+        setIsQueryAvailableTrue();
+
+        // Verify the query does not start if there is no internet connection.
+        setInternetConnected(false);
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteEntitlementApi, never()).checkEntitlementStatus();
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // Verify the query start and success after internet connected.
+        setInternetConnected(true);
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_error503_error500() throws Exception {
+        logd("testStartQueryEntitlementStatus_error503_error500");
+        setIsQueryAvailableTrue();
+        set503RetryAfterResponse();
+
+        // Verify that the first query was triggered and that onSatelliteEntitlementStatusUpdated
+        // was not called after received a 503 error.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // Verify whether the second query has been triggered and whether
+        // onSatelliteEntitlementStatusUpdated has been called after received the 500 error.
+        reset(mSatelliteEntitlementApi);
+        setErrorResponse(500);
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID),
+                eq(false), eq(EMPTY_PLMN_LIST), eq(EMPTY_PLMN_LIST), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_error503_otherError() throws Exception {
+        logd("testStartQueryEntitlementStatus_error503_otherError");
+        setIsQueryAvailableTrue();
+        set503RetryAfterResponse();
+
+        // Verify that the first query was triggered and that onSatelliteEntitlementStatusUpdated
+        // was not called after received a 503 error.
+        sendMessage(CMD_START_QUERY_ENTITLEMENT, SUB_ID);
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // Verify whether the second query was triggered and onSatelliteEntitlementStatusUpdated
+        // was not called after received a 503 error without valid retry-after header.
+        reset(mSatelliteEntitlementApi);
+        setErrorResponse(503);
+        mTestableLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(1));
+        mTestableLooper.processAllMessages();
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController, never()).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // Verify whether the third query was triggered and onSatelliteEntitlementStatusUpdated
+        // was called after received a success case.
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
+        mTestableLooper.moveTimeForward(TimeUnit.MINUTES.toMillis(10));
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(eq(SUB_ID), eq(true),
+                eq(PLMN_ALLOWED_LIST), eq(PLMN_BARRED_LIST), any());
+    }
+
+    @Test
+    public void testStartQueryEntitlementStatus_AfterSimRefresh() throws Exception {
+        logd("testStartQueryEntitlementStatus_AfterSimRefresh");
+        setIsQueryAvailableTrue();
+
+        // Verify the first query complete.
+        doReturn(mSatelliteEntitlementResult).when(
+                mSatelliteEntitlementApi).checkEntitlementStatus();
+        setSatelliteEntitlementResult(SATELLITE_ENTITLEMENT_STATUS_ENABLED, PLMN_ALLOWED_LIST,
+                PLMN_BARRED_LIST);
+        mSatelliteEntitlementController.handleCmdStartQueryEntitlement();
+
+        verify(mSatelliteEntitlementApi).checkEntitlementStatus();
+        verify(mSatelliteController).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
+
+        // SIM_REFRESH event occurred before expired the query refresh timer, verify the start
+        // the query.
+        sendMessage(CMD_SIM_REFRESH, SUB_ID);
+        mTestableLooper.moveTimeForward(TimeUnit.MINUTES.toMillis(10));
+        mTestableLooper.processAllMessages();
+
+        verify(mSatelliteEntitlementApi, times(2)).checkEntitlementStatus();
+        verify(mSatelliteController, times(2)).onSatelliteEntitlementStatusUpdated(anyInt(),
+                anyBoolean(), anyList(), anyList(), any());
     }
 
     private void triggerCarrierConfigChanged() {
@@ -313,6 +848,16 @@
         mTestableLooper.processAllMessages();
     }
 
+    private void triggerCarrierConfigChanged(int subId) {
+        for (Pair<Executor, CarrierConfigManager.CarrierConfigChangeListener> pair
+                : mCarrierConfigChangedListenerList) {
+            pair.first.execute(() -> pair.second.onCarrierConfigChanged(
+                    /*slotIndex*/ 0, /*subId*/ subId, /*carrierId*/ 0, /*specificCarrierId*/ 0)
+            );
+        }
+        mTestableLooper.processAllMessages();
+    }
+
     private void clearInvocationsForMock() {
         clearInvocations(mSatelliteEntitlementApi);
         clearInvocations(mSatelliteController);
@@ -324,11 +869,15 @@
                 CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true);
         replaceInstance(SatelliteEntitlementController.class, "mRetryCountPerSub",
                 mSatelliteEntitlementController, new HashMap<>());
+        replaceInstance(SatelliteEntitlementController.class, "mIsEntitlementInProgressPerSub",
+                mSatelliteEntitlementController, new HashMap<>());
         setInternetConnected(true);
         setLastQueryTime(0L);
         replaceInstance(SatelliteEntitlementController.class,
                 "mSatelliteEntitlementResultPerSub", mSatelliteEntitlementController,
                 new HashMap<>());
+        replaceInstance(SatelliteEntitlementController.class,
+                "mSubIdPerSlot", mSatelliteEntitlementController, new HashMap<>());
     }
 
     private void setInternetConnected(boolean connected) {
@@ -344,9 +893,10 @@
     }
 
     private void setSatelliteEntitlementResult(int entitlementStatus,
-            List<String> plmnAllowedList) {
+            List<String> plmnAllowedList, List<String> plmnBarredList) {
         doReturn(entitlementStatus).when(mSatelliteEntitlementResult).getEntitlementStatus();
         doReturn(plmnAllowedList).when(mSatelliteEntitlementResult).getAllowedPLMNList();
+        doReturn(plmnBarredList).when(mSatelliteEntitlementResult).getBarredPLMNList();
     }
 
     private void setLastQueryTime(Long lastQueryTime) throws Exception {
@@ -356,6 +906,41 @@
         lastQueryTimePerSub.put(SUB_ID, lastQueryTime);
     }
 
+    private void set503RetryAfterResponse() throws Exception {
+        when(mSatelliteEntitlementApi.checkEntitlementStatus()).thenAnswer(
+                new Answer() {
+                    @Override
+                    public Object answer(InvocationOnMock invocation) throws Throwable {
+                        throw new ServiceEntitlementException(
+                                ERROR_HTTP_STATUS_NOT_SUCCESS, 503, "1", "503 occurred");
+                    }
+                }
+        );
+    }
+
+    private void setErrorResponse(int errorCode) throws Exception {
+        when(mSatelliteEntitlementApi.checkEntitlementStatus()).thenAnswer(
+                new Answer() {
+                    @Override
+                    public Object answer(InvocationOnMock invocation) throws Throwable {
+                        throw new ServiceEntitlementException(
+                                ERROR_HTTP_STATUS_NOT_SUCCESS, errorCode, "",
+                                errorCode + " occurred");
+                    }
+                }
+        );
+    }
+
+    private void sendMessage(int what, int subId) {
+        mSatelliteEntitlementController.handleMessage(mHandler.obtainMessage(what, subId, 0));
+    }
+
+    private Object getValue(String originalObjectName) throws Exception {
+        Field field = SatelliteEntitlementController.class.getDeclaredField(originalObjectName);
+        field.setAccessible(true);
+        return field.get(mSatelliteEntitlementController);
+    }
+
     public static class TestSatelliteEntitlementController extends SatelliteEntitlementController {
         private SatelliteEntitlementApi mInjectSatelliteEntitlementApi;
 
diff --git a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java
index 45e2a71..8e45a73 100644
--- a/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java
+++ b/tests/src/com/android/phone/satellite/entitlement/SatelliteEntitlementResponseTest.java
@@ -52,12 +52,27 @@
                     + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
                     + ServiceEntitlement.APP_SATELLITE_ENTITLEMENT + "\":{}}";
 
+    private static final String RESPONSE_WITHOUT_PLMN =
+            "{\"VERS\":{\"version\":\"1\",\"validity\":\"172800\"},"
+                    + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
+                    + ServiceEntitlement.APP_SATELLITE_ENTITLEMENT + "\":{"
+                    + "\"EntitlementStatus\":\"" + SATELLITE_ENTITLEMENT_STATUS_ENABLED + "\"}}";
+
+    private static final String RESPONSE_WITHOUT_PLMN_ALLOWED =
+            "{\"VERS\":{\"version\":\"1\",\"validity\":\"172800\"},"
+                    + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
+                    + ServiceEntitlement.APP_SATELLITE_ENTITLEMENT + "\":{"
+                    + "\"EntitlementStatus\":\"" + SATELLITE_ENTITLEMENT_STATUS_ENABLED + "\"" + ","
+                    + "\"PLMNBarred\":[{\"PLMN\":\"31017\"},"
+                    + "{\"PLMN\":\"302020\"}]}}";
+
     @Test
     public void testGetSatelliteEntitlementResponse() throws Exception {
         // Received the body with satellite service enabled.
         SatelliteEntitlementResponse response = new SatelliteEntitlementResponse(
                 getResponse(SATELLITE_ENTITLEMENT_STATUS_ENABLED));
         assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 2);
         assertEquals(TEST_PLMN_DATA_PLAN_TYPE_LIST.get(0).mPlmn,
                 response.getPlmnAllowed().get(0).mPlmn);
         assertEquals(TEST_PLMN_DATA_PLAN_TYPE_LIST.get(0).mDataPlanType,
@@ -66,6 +81,7 @@
                 response.getPlmnAllowed().get(1).mPlmn);
         assertEquals(TEST_PLMN_DATA_PLAN_TYPE_LIST.get(1).mDataPlanType,
                 response.getPlmnAllowed().get(1).mDataPlanType);
+        assertTrue(response.getPlmnBarredList().size() == 2);
         assertEquals(TEST_PLMN_BARRED_LIST, response.getPlmnBarredList());
 
         // Received the empty body.
@@ -106,6 +122,78 @@
         assertEquals(SATELLITE_ENTITLEMENT_STATUS_PROVISIONING, response.getEntitlementStatus());
         assertTrue(response.getPlmnAllowed().size() == 0);
         assertTrue(response.getPlmnBarredList().size() == 0);
+
+        // Received the body without plmn.
+        response = new SatelliteEntitlementResponse(RESPONSE_WITHOUT_PLMN);
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 0);
+        assertTrue(response.getPlmnBarredList().size() == 0);
+
+        // Received the body without plmn allowed key.
+        response = new SatelliteEntitlementResponse(RESPONSE_WITHOUT_PLMN_ALLOWED);
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 0);
+        assertTrue(response.getPlmnBarredList().size() == 2);
+        assertEquals(TEST_PLMN_BARRED_LIST, response.getPlmnBarredList());
+
+        // Received the body without plmn barred key.
+        response = new SatelliteEntitlementResponse(
+                getChangedAllowedPLMNListResponse(TEST_PLMN_DATA_PLAN_TYPE_LIST.get(0).mPlmn,
+                        TEST_PLMN_DATA_PLAN_TYPE_LIST.get(1).mPlmn));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 2);
+        assertTrue(response.getPlmnBarredList().size() == 0);
+
+        String plmn = "123456";
+        // Received the allowed plmn list set as 123456, empty string
+        response = new SatelliteEntitlementResponse(
+                getChangedAllowedPLMNListResponse(plmn, ""));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 1);
+        assertEquals(plmn, response.getPlmnAllowed().get(0).mPlmn);
+
+        // Received the allowed plmn list set as 123456, empty string
+        response = new SatelliteEntitlementResponse(
+                getChangedAllowedPLMNListResponse("", plmn));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 1);
+        assertEquals(plmn, response.getPlmnAllowed().get(0).mPlmn);
+
+        // RReceived the allowed plmn list set as empty strings
+        response = new SatelliteEntitlementResponse(
+                getChangedAllowedPLMNListResponse("", ""));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 0);
+
+        // Received the barred plmn list set as 123456, empty string
+        response = new SatelliteEntitlementResponse(
+                getChangedBarredPLMNListResponse(plmn, ""));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnBarredList().size() == 1);
+        assertEquals(plmn, response.getPlmnBarredList().get(0));
+
+        // Received the barred plmn list set as empty string, 123456
+        response = new SatelliteEntitlementResponse(
+                getChangedBarredPLMNListResponse("", plmn));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnBarredList().size() == 1);
+        assertEquals(plmn, response.getPlmnBarredList().get(0));
+
+        // Received the barred plmn list set as empty strings
+        response = new SatelliteEntitlementResponse(
+                getChangedBarredPLMNListResponse("", ""));
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_ENABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnBarredList().size() == 0);
+
+        // Received null
+        response = new SatelliteEntitlementResponse(null);
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_DISABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 0);
+
+        // Received empty string
+        response = new SatelliteEntitlementResponse("");
+        assertEquals(SATELLITE_ENTITLEMENT_STATUS_DISABLED, response.getEntitlementStatus());
+        assertTrue(response.getPlmnAllowed().size() == 0);
     }
 
     private String getResponse(int entitlementStatus) {
@@ -124,4 +212,34 @@
                 + "\"PLMNBarred\":[{\"PLMN\":\"31017\"},"
                 + "{\"PLMN\":\"302020\"}]" : "";
     }
+
+    private String getAllowedPlmns(String firstPlmn, String secondPlmn) {
+        return ",\"PLMNAllowed\":[{\"PLMN\":\"" + firstPlmn + "\",\"DataPlanType\":\"unmetered\"},"
+                + "{\"PLMN\":\"" + secondPlmn + "\",\"DataPlanType\":\"metered\"}]";
+    }
+
+    private String getBarredPlmns(String firstPlmn, String secondPlmn) {
+        return ",\"PLMNBarred\":[{\"PLMN\":\"" + firstPlmn + "\"}," + "{\"PLMN\":\"" + secondPlmn
+                + "\"}]";
+    }
+
+    private String getChangedAllowedPLMNListResponse(String firstPlmn, String secondPlmn) {
+        return "{\"VERS\":{\"version\":\"1\",\"validity\":\"172800\"},"
+                + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
+                + ServiceEntitlement.APP_SATELLITE_ENTITLEMENT + "\":{"
+                + "\"EntitlementStatus\":\"" + SATELLITE_ENTITLEMENT_STATUS_ENABLED + "\""
+                + getAllowedPlmns(firstPlmn, secondPlmn)
+                + "}}";
+    }
+
+    private String getChangedBarredPLMNListResponse(String firstPlmn, String secondPlmn) {
+        return "{\"VERS\":{\"version\":\"1\",\"validity\":\"172800\"},"
+                + "\"TOKEN\":{\"token\":\"ASH127AHHA88SF\"},\""
+                + ServiceEntitlement.APP_SATELLITE_ENTITLEMENT + "\":{"
+                + "\"EntitlementStatus\":\"" + SATELLITE_ENTITLEMENT_STATUS_ENABLED + "\""
+                + ",\"PLMNAllowed\":[{\"PLMN\":\"31026\",\"DataPlanType\":\"unmetered\"},"
+                + "{\"PLMN\":\"302820\",\"DataPlanType\":\"metered\"}]"
+                + getBarredPlmns(firstPlmn, secondPlmn)
+                + "}}";
+    }
 }
diff --git a/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java b/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java
index e5f7fd3..71a23e6 100644
--- a/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java
+++ b/tests/src/com/android/services/telephony/DisconnectCauseUtilTest.java
@@ -152,7 +152,8 @@
         android.telecom.DisconnectCause tcCause =
                 DisconnectCauseUtil.toTelecomDisconnectCause(
                         DisconnectCause.BUSY, -1 /*  precise label is NOT given */,
-                        EMPTY_STRING, PHONE_ID, null, getBundleWithBusyToneArray(), mFeatureFlags);
+                        EMPTY_STRING, PHONE_ID, null, getBundleWithBusyToneArray(), mFeatureFlags,
+                        false);
 
         assertBusyCauseWithTargetLabel(R.string.callFailed_userBusy, tcCause);
     }
@@ -170,7 +171,8 @@
         android.telecom.DisconnectCause tcCause =
                 DisconnectCauseUtil.toTelecomDisconnectCause(DisconnectCause.BUSY,
                         CallFailCause.USER_BUSY /* Telephony defined a precise label */,
-                        EMPTY_STRING, PHONE_ID, null, getBundleWithBusyToneArray(), mFeatureFlags);
+                        EMPTY_STRING, PHONE_ID, null, getBundleWithBusyToneArray(), mFeatureFlags,
+                        false);
         // Note: The precise label should not be overridden even though the carrier defined
         // the cause to play a busy tone
         assertBusyCauseWithTargetLabel(R.string.clh_callFailed_user_busy_txt, tcCause);
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index e791d3c..304cf2a 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -37,7 +37,7 @@
 import static junit.framework.Assert.assertTrue;
 import static junit.framework.Assert.fail;
 
-import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
@@ -56,6 +56,7 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.os.AsyncResult;
 import android.os.Bundle;
@@ -224,6 +225,9 @@
     private static final Uri TEST_ADDRESS = Uri.parse("tel:+16505551212");
     private static final String TELECOM_CALL_ID1 = "TC1";
     private static final String TEST_EMERGENCY_NUMBER = "911";
+    private static final String DISCONNECT_REASON_SATELLITE_ENABLED = "SATELLITE_ENABLED";
+    private static final String DISCONNECT_REASON_CARRIER_ROAMING_SATELLITE_MODE =
+            "CARRIER_ROAMING_SATELLITE_MODE";
     private android.telecom.Connection mConnection;
 
     @Mock TelephonyConnectionService.TelephonyManagerProxy mTelephonyManagerProxy;
@@ -249,6 +253,7 @@
     @Mock ImsPhone mImsPhone;
     @Mock private SatelliteSOSMessageRecommender mSatelliteSOSMessageRecommender;
     @Mock private EmergencyStateTracker mEmergencyStateTracker;
+    @Mock private Resources mMockResources;
     private Phone mPhone0;
     private Phone mPhone1;
 
@@ -317,6 +322,8 @@
                 any(), anyInt(), anyBoolean());
         replaceInstance(TelephonyConnectionService.class,
                 "mSatelliteController", mTestConnectionService, mSatelliteController);
+        doReturn(mMockResources).when(mContext).getResources();
+
         mBinderStub = (IConnectionService.Stub) mTestConnectionService.onBind(null);
         mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
         mSetFlagsRule.enableFlags(Flags.FLAG_DO_NOT_OVERRIDE_PRECISE_LABEL);
@@ -1428,6 +1435,9 @@
     @SmallTest
     public void testCreateOutgoingEmergencyConnection_exitingSatellite_placeCall() {
         when(mSatelliteController.isSatelliteEnabled()).thenReturn(true);
+        doReturn(true).when(mMockResources).getBoolean(anyInt());
+        doReturn(true).when(mTelephonyManagerProxy).isCurrentEmergencyNumber(
+                anyString());
         Phone testPhone = setupConnectionServiceInApm();
 
         ArgumentCaptor<RadioOnStateListener.Callback> callback =
@@ -2174,7 +2184,7 @@
                 .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(true));
         verify(mEmergencyStateTracker)
                 .startEmergencyCall(eq(mPhone0), connectionCaptor.capture(), eq(false));
-        verify(mSatelliteSOSMessageRecommender).onEmergencyCallStarted(any());
+        verify(mSatelliteSOSMessageRecommender, times(2)).onEmergencyCallStarted(any());
         verify(mEmergencyCallDomainSelectionConnection).createEmergencyConnection(any(), any());
 
         android.telecom.Connection tc = connectionCaptor.getValue();
@@ -2213,7 +2223,7 @@
                 .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(true));
         verify(mEmergencyStateTracker)
                 .startEmergencyCall(eq(mPhone0), connectionCaptor.capture(), eq(false));
-        verify(mSatelliteSOSMessageRecommender).onEmergencyCallStarted(any());
+        verify(mSatelliteSOSMessageRecommender, times(2)).onEmergencyCallStarted(any());
         verify(mEmergencyCallDomainSelectionConnection).createEmergencyConnection(any(), any());
 
         android.telecom.Connection tc = connectionCaptor.getValue();
@@ -2242,7 +2252,9 @@
         replaceInstance(TelephonyConnectionService.class,
                 "mImsManager", mTestConnectionService, imsManager);
 
-        setupForDialForDomainSelection(mPhone0, DOMAIN_PS, true);
+        int selectedDomain = DOMAIN_PS;
+
+        setupForDialForDomainSelection(mPhone0, selectedDomain, true);
 
         mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
                 createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
@@ -2251,13 +2263,12 @@
         ArgumentCaptor<android.telecom.Connection> connectionCaptor =
                 ArgumentCaptor.forClass(android.telecom.Connection.class);
 
-        verify(mEmergencyStateTracker, times(1))
-                .startEmergencyCall(eq(mPhone0), connectionCaptor.capture(), eq(false));
-        verify(mSatelliteSOSMessageRecommender).onEmergencyCallStarted(any());
-        verify(mDomainSelectionResolver, times(0))
+        verify(mDomainSelectionResolver)
                 .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(true));
-        verify(mEmergencyCallDomainSelectionConnection, times(0))
-                .createEmergencyConnection(any(), any());
+        verify(mEmergencyStateTracker)
+                .startEmergencyCall(eq(mPhone0), connectionCaptor.capture(), eq(false));
+        verify(mSatelliteSOSMessageRecommender, times(2)).onEmergencyCallStarted(any());
+        verify(mEmergencyCallDomainSelectionConnection).createEmergencyConnection(any(), any());
 
         android.telecom.Connection tc = connectionCaptor.getValue();
 
@@ -2272,7 +2283,8 @@
         assertNotNull("DialArgs param is null", dialArgs);
         assertNotNull("intentExtras is null", dialArgs.intentExtras);
         assertTrue(dialArgs.intentExtras.containsKey(PhoneConstants.EXTRA_DIAL_DOMAIN));
-        assertEquals(DOMAIN_CS, dialArgs.intentExtras.getInt(PhoneConstants.EXTRA_DIAL_DOMAIN, -1));
+        assertEquals(selectedDomain,
+                dialArgs.intentExtras.getInt(PhoneConstants.EXTRA_DIAL_DOMAIN, -1));
     }
 
     @Test
@@ -2289,6 +2301,8 @@
         assertTrue(mTestConnectionService.maybeReselectDomain(c, null, true,
                 android.telephony.DisconnectCause.NOT_VALID));
         verify(mEmergencyCallDomainSelectionConnection).reselectDomain(any());
+        verify(mEmergencyCallDomainSelectionConnection).setDisconnectCause(
+                eq(disconnectCause), eq(preciseDisconnectCause), any());
 
         ArgumentCaptor<DialArgs> argsCaptor = ArgumentCaptor.forClass(DialArgs.class);
 
@@ -2314,9 +2328,13 @@
         TestTelephonyConnection c = setupForReDialForDomainSelection(
                 mPhone0, selectedDomain, preciseDisconnectCause, disconnectCause, true);
 
-        assertTrue(mTestConnectionService.maybeReselectDomain(c, null, true,
-                android.telephony.DisconnectCause.NOT_VALID));
+        assertTrue(mTestConnectionService.maybeReselectDomain(c, null, false,
+                android.telephony.DisconnectCause.ICC_ERROR));
         verify(mEmergencyCallDomainSelectionConnection).reselectDomain(any());
+        verify(mEmergencyCallDomainSelectionConnection).setDisconnectCause(
+                eq(android.telephony.DisconnectCause.ICC_ERROR),
+                eq(com.android.internal.telephony.CallFailCause.NOT_VALID),
+                any());
 
         ArgumentCaptor<DialArgs> argsCaptor = ArgumentCaptor.forClass(DialArgs.class);
 
@@ -2362,7 +2380,7 @@
         setupForDialForDomainSelection(mPhone0, selectedDomain, true);
 
         doReturn(mInternalConnection2).when(mCall).getLatestConnection();
-        doReturn(true).when(mCall).isRinging();
+        doReturn(Call.State.INCOMING).when(mCall).getState();
         doReturn(mCall).when(mPhone0).getRingingCall();
 
         mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
@@ -2397,7 +2415,7 @@
 
         listener.onDisconnect(0);
 
-        verify(mSatelliteSOSMessageRecommender).onEmergencyCallStarted(any());
+        verify(mSatelliteSOSMessageRecommender, times(2)).onEmergencyCallStarted(any());
 
         ArgumentCaptor<DialArgs> argsCaptor = ArgumentCaptor.forClass(DialArgs.class);
 
@@ -2424,7 +2442,7 @@
                 mPhone0, selectedDomain, preciseDisconnectCause, disconnectCause, true);
 
         doReturn(mInternalConnection2).when(mCall).getLatestConnection();
-        doReturn(true).when(mCall).isRinging();
+        doReturn(Call.State.DISCONNECTING).when(mCall).getState();
         doReturn(mCall).when(mPhone0).getRingingCall();
 
         assertTrue(mTestConnectionService.maybeReselectDomain(c, null, true,
@@ -2476,6 +2494,30 @@
                 createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
                         TEST_EMERGENCY_NUMBER, TELECOM_CALL_ID1));
 
+        ArgumentCaptor<TelephonyConnection> connectionCaptor =
+                ArgumentCaptor.forClass(TelephonyConnection.class);
+        ArgumentCaptor<Consumer<Boolean>> consumerCaptor = ArgumentCaptor
+                .forClass(Consumer.class);
+
+        verify(mEmergencyStateTracker).startNormalRoutingEmergencyCall(eq(mPhone0),
+                connectionCaptor.capture(), consumerCaptor.capture());
+
+        TelephonyConnection tc = connectionCaptor.getValue();
+
+        assertNotNull(tc);
+        assertNotNull(mTestConnectionService.getNormalRoutingEmergencyConnection());
+        assertEquals(mTestConnectionService.getNormalRoutingEmergencyConnection(), tc);
+
+        verify(mDomainSelectionResolver, never())
+                .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(false));
+        verify(mNormalCallDomainSelectionConnection, never()).createNormalConnection(any(), any());
+
+        Consumer<Boolean> consumer = consumerCaptor.getValue();
+
+        assertNotNull(consumer);
+
+        consumer.accept(true);
+
         verify(mDomainSelectionResolver)
                 .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(false));
         verify(mNormalCallDomainSelectionConnection).createNormalConnection(any(), any());
@@ -2493,6 +2535,59 @@
     }
 
     @Test
+    public void testDomainSelectionNormalRoutingEmergencyNumberAndDiscarded() 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());
+        doReturn(Arrays.asList(emergencyNumber)).when(mEmergencyNumberTracker).getEmergencyNumbers(
+                anyString());
+
+        mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
+                        TEST_EMERGENCY_NUMBER, TELECOM_CALL_ID1));
+
+        ArgumentCaptor<TelephonyConnection> connectionCaptor =
+                ArgumentCaptor.forClass(TelephonyConnection.class);
+        ArgumentCaptor<Consumer<Boolean>> consumerCaptor = ArgumentCaptor
+                .forClass(Consumer.class);
+
+        verify(mEmergencyStateTracker).startNormalRoutingEmergencyCall(eq(mPhone0),
+                connectionCaptor.capture(), consumerCaptor.capture());
+
+        TelephonyConnection tc = connectionCaptor.getValue();
+
+        assertNotNull(tc);
+        assertNotNull(mTestConnectionService.getNormalRoutingEmergencyConnection());
+        assertEquals(mTestConnectionService.getNormalRoutingEmergencyConnection(), tc);
+
+        verify(mDomainSelectionResolver, never())
+                .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(false));
+        verify(mNormalCallDomainSelectionConnection, never()).createNormalConnection(any(), any());
+
+        Consumer<Boolean> consumer = consumerCaptor.getValue();
+
+        assertNotNull(consumer);
+
+        // Discard dialing
+        tc.hangup(android.telephony.DisconnectCause.LOCAL);
+
+        consumer.accept(true);
+
+        verify(mDomainSelectionResolver, never())
+                .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(false));
+        verify(mNormalCallDomainSelectionConnection, never()).createNormalConnection(any(), any());
+    }
+
+    @Test
     public void testDomainSelectionDialedSimEmergencyNumberOnlyFalse() throws Exception {
         setupForCallTest();
 
@@ -2523,7 +2618,7 @@
                 .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(true));
         verify(mEmergencyStateTracker)
                 .startEmergencyCall(eq(mPhone0), connectionCaptor.capture(), eq(false));
-        verify(mSatelliteSOSMessageRecommender).onEmergencyCallStarted(any());
+        verify(mSatelliteSOSMessageRecommender, times(2)).onEmergencyCallStarted(any());
         verify(mEmergencyCallDomainSelectionConnection).createEmergencyConnection(any(), any());
 
         android.telecom.Connection tc = connectionCaptor.getValue();
@@ -2567,6 +2662,30 @@
                 createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
                         TEST_EMERGENCY_NUMBER, TELECOM_CALL_ID1));
 
+        ArgumentCaptor<TelephonyConnection> connectionCaptor =
+                ArgumentCaptor.forClass(TelephonyConnection.class);
+        ArgumentCaptor<Consumer<Boolean>> consumerCaptor = ArgumentCaptor
+                .forClass(Consumer.class);
+
+        verify(mEmergencyStateTracker).startNormalRoutingEmergencyCall(eq(mPhone0),
+                connectionCaptor.capture(), consumerCaptor.capture());
+
+        TelephonyConnection tc = connectionCaptor.getValue();
+
+        assertNotNull(tc);
+        assertNotNull(mTestConnectionService.getNormalRoutingEmergencyConnection());
+        assertEquals(mTestConnectionService.getNormalRoutingEmergencyConnection(), tc);
+
+        verify(mDomainSelectionResolver, never())
+                .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(false));
+        verify(mNormalCallDomainSelectionConnection, never()).createNormalConnection(any(), any());
+
+        Consumer<Boolean> consumer = consumerCaptor.getValue();
+
+        assertNotNull(consumer);
+
+        consumer.accept(true);
+
         verify(mDomainSelectionResolver)
                 .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(false));
         verify(mNormalCallDomainSelectionConnection).createNormalConnection(any(), any());
@@ -2758,6 +2877,23 @@
     }
 
     @Test
+    public void testDomainSelectionNormalRoutingEmergencyNumber_exitingApm_DiscardDialing()
+            throws Exception {
+        when(mDeviceState.isAirplaneModeOn(any())).thenReturn(true);
+        Phone testPhone = setupConnectionServiceInApmForDomainSelection(true);
+
+        ArgumentCaptor<RadioOnStateListener.Callback> callback =
+                ArgumentCaptor.forClass(RadioOnStateListener.Callback.class);
+        verify(mRadioOnHelper).triggerRadioOnAndListen(callback.capture(), eq(true),
+                eq(testPhone), eq(false), eq(TIMEOUT_TO_DYNAMIC_ROUTING_MS));
+
+        mConnection.setDisconnected(null);
+
+        assertTrue(callback.getValue()
+                .isOkToCall(testPhone, ServiceState.STATE_POWER_OFF, false));
+    }
+
+    @Test
     public void testDomainSelectionNormalToEmergencyCs() throws Exception {
         setupForCallTest();
 
@@ -2806,6 +2942,8 @@
                 dialArgs.intentExtras.getInt(PhoneConstants.EXTRA_DIAL_DOMAIN, -1));
         assertTrue(dialArgs.isEmergency);
         assertEquals(eccCategory, dialArgs.eccCategory);
+        assertTrue(dialArgs.intentExtras.getBoolean(
+                PhoneConstants.EXTRA_USE_EMERGENCY_ROUTING, false));
     }
 
     @Test
@@ -2857,6 +2995,43 @@
                 dialArgs.intentExtras.getInt(PhoneConstants.EXTRA_DIAL_DOMAIN, -1));
         assertTrue(dialArgs.isEmergency);
         assertEquals(eccCategory, dialArgs.eccCategory);
+        assertTrue(dialArgs.intentExtras.getBoolean(
+                PhoneConstants.EXTRA_USE_EMERGENCY_ROUTING, false));
+    }
+
+    @Test
+    public void testDomainSelectionSwitchPhones() throws Exception {
+        setupForCallTest();
+
+        doReturn(CompletableFuture.completedFuture(EMERGENCY_PERM_FAILURE))
+                .when(mEmergencyStateTracker)
+                .startEmergencyCall(eq(mPhone0), any(), eq(false));
+        doReturn(CompletableFuture.completedFuture(NOT_DISCONNECTED))
+                .when(mEmergencyStateTracker)
+                .startEmergencyCall(eq(mPhone1), any(), eq(false));
+
+        doReturn(mEmergencyCallDomainSelectionConnection).when(mDomainSelectionResolver)
+                .getDomainSelectionConnection(any(), anyInt(), eq(true));
+        doReturn(true).when(mTelephonyManagerProxy).isCurrentEmergencyNumber(anyString());
+
+        doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported();
+
+        mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
+                        TEST_EMERGENCY_NUMBER, TELECOM_CALL_ID1));
+
+        ArgumentCaptor<DomainSelectionService.SelectionAttributes> attrCaptor =
+                ArgumentCaptor.forClass(
+                        DomainSelectionService.SelectionAttributes.class);
+
+        verify(mEmergencyStateTracker).startEmergencyCall(eq(mPhone0), any(), anyBoolean());
+        verify(mEmergencyStateTracker).startEmergencyCall(eq(mPhone1), any(), anyBoolean());
+        verify(mEmergencyCallDomainSelectionConnection).createEmergencyConnection(
+                attrCaptor.capture(), any());
+
+        DomainSelectionService.SelectionAttributes attr = attrCaptor.getValue();
+
+        assertEquals(mPhone1.getPhoneId(), attr.getSlotIndex());
     }
 
     @Test
@@ -2967,9 +3142,10 @@
                 createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
                         TEST_EMERGENCY_NUMBER, TELECOM_CALL_ID1));
 
-        android.telecom.Connection c = mTestConnectionService.getEmergencyConnection();
+        TelephonyConnection c = mTestConnectionService.getEmergencyConnection();
 
         assertNotNull(c);
+        assertNull(c.getOriginalConnection());
 
         ArgumentCaptor<DomainSelectionConnection.DomainSelectionConnectionCallback> callbackCaptor =
                 ArgumentCaptor.forClass(
@@ -2987,6 +3163,11 @@
 
         verify(mEmergencyCallDomainSelectionConnection).cancelSelection();
         verify(mEmergencyStateTracker).endCall(eq(c));
+
+        android.telecom.DisconnectCause disconnectCause = c.getDisconnectCause();
+
+        assertNotNull(disconnectCause);
+        assertEquals(ERROR_UNSPECIFIED, disconnectCause.getTelephonyDisconnectCause());
     }
 
     @Test
@@ -3205,7 +3386,7 @@
                 .getDomainSelectionConnection(eq(mPhone0), eq(SELECTOR_TYPE_CALLING), eq(true));
         verify(mEmergencyStateTracker)
                 .startEmergencyCall(eq(mPhone0), connectionCaptor.capture(), eq(false));
-        verify(mSatelliteSOSMessageRecommender).onEmergencyCallStarted(any());
+        verify(mSatelliteSOSMessageRecommender, times(2)).onEmergencyCallStarted(any());
         verify(mEmergencyCallDomainSelectionConnection).createEmergencyConnection(any(), any());
         verify(mPhone0).dial(anyString(), any(), any());
 
@@ -3234,7 +3415,7 @@
 
         verify(mEmergencyStateTracker, times(0)).onEmergencyCallStateChanged(
                 any(), eq(c));
-        verify(mSatelliteSOSMessageRecommender, times(0))
+        verify(mSatelliteSOSMessageRecommender, times(2))
                 .onEmergencyCallConnectionStateChanged(eq(TELECOM_CALL_ID1), anyInt());
 
         c.setActive();
@@ -3258,7 +3439,7 @@
         // state change not notified any more after CONNECTED once
         verify(mEmergencyStateTracker, times(1)).onEmergencyCallStateChanged(
                 any(), eq(c));
-        verify(mSatelliteSOSMessageRecommender, times(1))
+        verify(mSatelliteSOSMessageRecommender, times(3))
                 .onEmergencyCallConnectionStateChanged(eq(TELECOM_CALL_ID1), anyInt());
 
         // state change to ACTIVE again
@@ -3270,7 +3451,7 @@
         // state change not notified any more after CONNECTED once
         verify(mEmergencyStateTracker, times(1)).onEmergencyCallStateChanged(
                 any(), eq(c));
-        verify(mSatelliteSOSMessageRecommender, times(1))
+        verify(mSatelliteSOSMessageRecommender, times(3))
                 .onEmergencyCallConnectionStateChanged(eq(TELECOM_CALL_ID1), anyInt());
 
         // SRVCC happens
@@ -3292,7 +3473,7 @@
         // state change not notified
         verify(mEmergencyStateTracker, times(1)).onEmergencyCallStateChanged(
                 any(), eq(c));
-        verify(mSatelliteSOSMessageRecommender, times(1))
+        verify(mSatelliteSOSMessageRecommender, times(3))
                 .onEmergencyCallConnectionStateChanged(eq(TELECOM_CALL_ID1), anyInt());
     }
 
@@ -3463,6 +3644,25 @@
         DisconnectCause disconnectCause = mConnection.getDisconnectCause();
         assertEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
                 disconnectCause.getTelephonyDisconnectCause());
+        assertEquals(DISCONNECT_REASON_SATELLITE_ENABLED, disconnectCause.getReason());
+    }
+
+    @Test
+    public void testEmergencyCallSatelliteEnabled_blockEmergencyCall() {
+        setupForCallTest();
+        doReturn(true).when(mSatelliteController).isSatelliteEnabled();
+        doReturn(false).when(mMockResources).getBoolean(anyInt());
+        doReturn(true).when(mTelephonyManagerProxy).isCurrentEmergencyNumber(
+                anyString());
+
+        // Simulates an outgoing emergency call.
+        mConnection = mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1,
+                        TEST_EMERGENCY_NUMBER, TELECOM_CALL_ID1));
+        DisconnectCause disconnectCause = mConnection.getDisconnectCause();
+        assertEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
+                disconnectCause.getTelephonyDisconnectCause());
+        assertEquals(DISCONNECT_REASON_SATELLITE_ENABLED, disconnectCause.getReason());
     }
 
     @Test
@@ -3471,30 +3671,53 @@
 
         setupForCallTest();
         // Call is not supported while using satellite
-        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
-                .setIsNonTerrestrialNetwork(true)
-                .setAvailableServices(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA))
-                .build();
-        ServiceState ss = new ServiceState();
-        ss.addNetworkRegistrationInfo(nri);
-        when(mPhone0.getServiceState()).thenReturn(ss);
+        when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
+                .thenReturn(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA));
+
         mConnection = mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
                 createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", TELECOM_CALL_ID1));
         DisconnectCause disconnectCause = mConnection.getDisconnectCause();
         assertEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
                 disconnectCause.getTelephonyDisconnectCause());
+        assertEquals(DISCONNECT_REASON_CARRIER_ROAMING_SATELLITE_MODE, disconnectCause.getReason());
 
         // Call is supported while using satellite
-        nri = new NetworkRegistrationInfo.Builder()
-                .setIsNonTerrestrialNetwork(true)
-                .setAvailableServices(List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE))
-                .build();
-        ss.addNetworkRegistrationInfo(nri);
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
+                .thenReturn(List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE));
+
+        // UnsupportedOperationException is thrown as we cannot perform actual call
+        assertThrows(UnsupportedOperationException.class, () -> mTestConnectionService
+                .onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", "TC@2")));
+    }
+
+    @Test
+    public void testNormalCallUsingSatelliteConnectedWithinHysteresisTime() throws Exception {
+        mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
+
+        // Call is not supported when device is connected to satellite within hysteresis time
+        setupForCallTest();
+        when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
+                .thenReturn(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA));
+
         mConnection = mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
-                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", "TC@2"));
-        disconnectCause = mConnection.getDisconnectCause();
-        assertNotEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", TELECOM_CALL_ID1));
+        DisconnectCause disconnectCause = mConnection.getDisconnectCause();
+        assertEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
                 disconnectCause.getTelephonyDisconnectCause());
+        assertEquals(DISCONNECT_REASON_CARRIER_ROAMING_SATELLITE_MODE, disconnectCause.getReason());
+
+        // Call is supported when device is connected to satellite within hysteresis time
+        setupForCallTest();
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any())).thenReturn(
+                List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE));
+
+        // UnsupportedOperationException is thrown as we cannot perform actual call
+        assertThrows(UnsupportedOperationException.class, () -> mTestConnectionService
+                .onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                        createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", "TC@2")));
     }
 
     @Test
@@ -3503,18 +3726,14 @@
 
         setupForCallTest();
         // Flag is disabled, so call is supported while using satellite
-        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
-                .setIsNonTerrestrialNetwork(true)
-                .setAvailableServices(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA))
-                .build();
-        ServiceState ss = new ServiceState();
-        ss.addNetworkRegistrationInfo(nri);
-        when(mPhone0.getServiceState()).thenReturn(ss);
-        mConnection = mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
-                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", TELECOM_CALL_ID1));
-        DisconnectCause disconnectCause = mConnection.getDisconnectCause();
-        assertNotEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
-                disconnectCause.getTelephonyDisconnectCause());
+        when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any())).thenReturn(
+                List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE));
+
+        // UnsupportedOperationException is thrown as we cannot perform actual call
+        assertThrows(UnsupportedOperationException.class, () -> mTestConnectionService
+                .onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", TELECOM_CALL_ID1)));
     }
 
     @Test
@@ -3523,22 +3742,17 @@
 
         setupForCallTest();
         // Call is not supported while using satellite
-        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
-                .setIsNonTerrestrialNetwork(true)
-                .setAvailableServices(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA))
-                .build();
-        ServiceState ss = new ServiceState();
-        ss.addNetworkRegistrationInfo(nri);
-        when(mPhone0.getServiceState()).thenReturn(ss);
+        when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
+                .thenReturn(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA));
         // Wi-Fi call is possible
         doReturn(true).when(mImsPhone).canMakeWifiCall();
         when(mPhone0.getImsPhone()).thenReturn(mImsPhone);
 
-        mConnection = mTestConnectionService.onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
-                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", TELECOM_CALL_ID1));
-        DisconnectCause disconnectCause = mConnection.getDisconnectCause();
-        assertNotEquals(android.telephony.DisconnectCause.SATELLITE_ENABLED,
-                disconnectCause.getTelephonyDisconnectCause());
+        // UnsupportedOperationException is thrown as we cannot perform actual call
+        assertThrows(UnsupportedOperationException.class, () -> mTestConnectionService
+                .onCreateOutgoingConnection(PHONE_ACCOUNT_HANDLE_1,
+                createConnectionRequest(PHONE_ACCOUNT_HANDLE_1, "1234", TELECOM_CALL_ID1)));
     }
 
     @Test
@@ -3558,13 +3772,12 @@
     public void testIsAvailableForEmergencyCallsUsingNonTerrestrialNetwork_enableFlag() {
         mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
 
+        // Call is not supported while using satellite
+        when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
+                .thenReturn(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA));
         Phone mockPhone = Mockito.mock(Phone.class);
-        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
-                .setIsNonTerrestrialNetwork(true)
-                .setAvailableServices(List.of(NetworkRegistrationInfo.SERVICE_TYPE_DATA))
-                .build();
         ServiceState ss = new ServiceState();
-        ss.addNetworkRegistrationInfo(nri);
         ss.setEmergencyOnly(true);
         ss.setState(ServiceState.STATE_EMERGENCY_ONLY);
         when(mockPhone.getServiceState()).thenReturn(ss);
@@ -3581,13 +3794,12 @@
     public void testIsAvailableForEmergencyCallsUsingNonTerrestrialNetwork_disableFlag() {
         mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
 
+        // Call is supported while using satellite
+        when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
+        when(mSatelliteController.getCapabilitiesForCarrierRoamingSatelliteMode(any()))
+                .thenReturn(List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE));
         Phone mockPhone = Mockito.mock(Phone.class);
-        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
-                .setIsNonTerrestrialNetwork(true)
-                .setAvailableServices(List.of(NetworkRegistrationInfo.SERVICE_TYPE_VOICE))
-                .build();
         ServiceState ss = new ServiceState();
-        ss.addNetworkRegistrationInfo(nri);
         ss.setEmergencyOnly(true);
         ss.setState(ServiceState.STATE_EMERGENCY_ONLY);
         when(mockPhone.getServiceState()).thenReturn(ss);
@@ -3713,6 +3925,30 @@
                         NORMAL_ROUTED_EMERGENCY_NUMBER));
     }
 
+    /**
+     * Verify where there are two sims, we choose the sim in emergency callback mode for the
+     * next emergency call.
+     */
+    @Test
+    public void testGetPhoneInEmergencyCallbackModeMultiSim() {
+        Phone mockPhone1 = Mockito.mock(Phone.class);
+        Phone mockPhone2 = Mockito.mock(Phone.class);
+
+        when(mPhoneFactoryProxy.getPhones()).thenReturn(
+                new Phone[] {mockPhone1, mockPhone2});
+
+        doReturn(false).when(mEmergencyStateTracker).isInEcm(eq(mockPhone1));
+        doReturn(true).when(mEmergencyStateTracker).isInEcm(eq(mockPhone2));
+
+        // Only applicable for AP domain seleciton service
+        assertNull(mTestConnectionService.getPhoneInEmergencyCallbackMode());
+
+        doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported();
+
+        assertEquals(mockPhone2,
+                mTestConnectionService.getPhoneInEmergencyCallbackMode());
+    }
+
     private void setupMockEmergencyNumbers(Phone mockPhone, List<EmergencyNumber> numbers) {
         EmergencyNumberTracker emergencyNumberTracker = Mockito.mock(EmergencyNumberTracker.class);
         // Yuck.  There should really be a fake emergency number class which makes it easy to inject
diff --git a/tests/src/com/android/services/telephony/domainselection/CarrierConfigHelperTest.java b/tests/src/com/android/services/telephony/domainselection/CarrierConfigHelperTest.java
deleted file mode 100644
index 8f51dab..0000000
--- a/tests/src/com/android/services/telephony/domainselection/CarrierConfigHelperTest.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.services.telephony.domainselection;
-
-import static android.telephony.AccessNetworkConstants.AccessNetworkType.EUTRAN;
-import static android.telephony.AccessNetworkConstants.AccessNetworkType.NGRAN;
-import static android.telephony.CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL;
-import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.assertNotNull;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.testing.TestableLooper;
-import android.util.Log;
-
-import com.android.TestContext;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.concurrent.Executor;
-
-/**
- * Unit tests for CarrierConfigHelper
- */
-public class CarrierConfigHelperTest {
-    private static final String TAG = "CarrierConfigHelperTest";
-
-    private static final int SLOT_0 = 0;
-    private static final int SLOT_1 = 1;
-    private static final int SUB_1 = 1;
-    private static final int TEST_SIM_CARRIER_ID = 1911;
-
-    @Mock private SharedPreferences mSharedPreferences;
-    @Mock private SharedPreferences.Editor mEditor;
-    @Mock private Resources mResources;
-
-    private Context mContext;
-    private HandlerThread mHandlerThread;
-    private TestableLooper mLooper;
-    private CarrierConfigHelper mCarrierConfigHelper;
-    private CarrierConfigManager mCarrierConfigManager;
-    private TelephonyManager mTelephonyManager;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mContext = new TestContext() {
-            @Override
-            public String getSystemServiceName(Class<?> serviceClass) {
-                if (serviceClass == TelephonyManager.class) {
-                    return Context.TELEPHONY_SERVICE;
-                } else if (serviceClass == CarrierConfigManager.class) {
-                    return Context.CARRIER_CONFIG_SERVICE;
-                }
-                return super.getSystemServiceName(serviceClass);
-            }
-
-            @Override
-            public String getOpPackageName() {
-                return "";
-            }
-
-            @Override
-            public Resources getResources() {
-                return mResources;
-            }
-        };
-
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-
-        mHandlerThread = new HandlerThread("CarrierConfigHelperTest");
-        mHandlerThread.start();
-
-        try {
-            mLooper = new TestableLooper(mHandlerThread.getLooper());
-        } catch (Exception e) {
-            logd("Unable to create looper from handler.");
-        }
-
-        doReturn(mEditor).when(mSharedPreferences).edit();
-
-        mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
-        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
-        doReturn(2).when(mTelephonyManager).getActiveModemCount();
-        doReturn(TelephonyManager.SIM_STATE_READY)
-                .when(mTelephonyManager).getSimState(anyInt());
-
-        doReturn(new int[] { TEST_SIM_CARRIER_ID }).when(mResources).getIntArray(anyInt());
-
-        mCarrierConfigHelper = new CarrierConfigHelper(mContext, mHandlerThread.getLooper(),
-                mSharedPreferences);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        if (mCarrierConfigHelper != null) {
-            mCarrierConfigHelper.destroy();
-            mCarrierConfigHelper = null;
-        }
-
-        if (mLooper != null) {
-            mLooper.destroy();
-            mLooper = null;
-        }
-    }
-
-    @Test
-    public void testInit() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-        ArgumentCaptor<Executor> executorCaptor = ArgumentCaptor.forClass(Executor.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(executorCaptor.capture(),
-                callbackCaptor.capture());
-        assertNotNull(executorCaptor.getValue());
-        assertNotNull(callbackCaptor.getValue());
-        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
-    }
-
-    @Test
-    public void testCarrierConfigNotApplied() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // NR is included but carrier config is not applied.
-        PersistableBundle b = getPersistableBundle(new int[] { EUTRAN, NGRAN }, false);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
-    }
-
-    @Test
-    public void testCarrierConfigApplied() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // NR is included and carrier config is applied.
-        PersistableBundle b = getPersistableBundle(new int[] { EUTRAN, NGRAN }, true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        assertTrue(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
-        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_1));
-
-        verify(mEditor).putBoolean(eq(CarrierConfigHelper.KEY_VONR_EMERGENCY_SUPPORT + SLOT_0),
-                eq(true));
-
-        // NR is not included and carrier config is applied.
-        b = getPersistableBundle(new int[] { EUTRAN }, true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
-
-        verify(mEditor).putBoolean(eq(CarrierConfigHelper.KEY_VONR_EMERGENCY_SUPPORT + SLOT_0),
-                eq(false));
-    }
-
-    @Test
-    public void testCarrierConfigInvalidSubId() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // NR is included and carrier config is applied.
-        PersistableBundle b = getPersistableBundle(new int[] { EUTRAN, NGRAN }, true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-
-        // Invalid subscription
-        callback.onCarrierConfigChanged(SLOT_0, SubscriptionManager.INVALID_SUBSCRIPTION_ID, 0, 0);
-
-        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
-    }
-
-    @Test
-    public void testRestoreFromSharedPreferences() throws Exception {
-        doReturn(true).when(mSharedPreferences).getBoolean(anyString(), anyBoolean());
-        mCarrierConfigHelper = new CarrierConfigHelper(mContext, mHandlerThread.getLooper(),
-                mSharedPreferences);
-
-        assertTrue(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
-    }
-
-    @Test
-    public void testCarrierIgnoreNrWhenSimRemoved() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // NR is included and carrier config for TEST SIM is applied.
-        PersistableBundle b = getPersistableBundle(new int[] { EUTRAN, NGRAN }, true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, TEST_SIM_CARRIER_ID, 0);
-
-        // NR is ignored.
-        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_0));
-        assertFalse(mCarrierConfigHelper.isVoNrEmergencySupported(SLOT_1));
-    }
-
-    private static PersistableBundle getPersistableBundle(int[] imsRats, boolean applied) {
-        PersistableBundle bundle  = new PersistableBundle();
-        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY, imsRats);
-        bundle.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, applied);
-        return bundle;
-    }
-
-    private static void logd(String str) {
-        Log.d(TAG, str);
-    }
-}
diff --git a/tests/src/com/android/services/telephony/domainselection/DataConnectionStateHelperTest.java b/tests/src/com/android/services/telephony/domainselection/DataConnectionStateHelperTest.java
new file mode 100644
index 0000000..8d950c2
--- /dev/null
+++ b/tests/src/com/android/services/telephony/domainselection/DataConnectionStateHelperTest.java
@@ -0,0 +1,376 @@
+/*
+ * Copyright (C) 2024 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.services.telephony.domainselection;
+
+import static android.telephony.AccessNetworkConstants.TRANSPORT_TYPE_WWAN;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.assertNotNull;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.LinkProperties;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.telephony.CarrierConfigManager;
+import android.telephony.PreciseDataConnectionState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
+import android.telephony.data.ApnSetting;
+import android.testing.TestableLooper;
+import android.util.Log;
+
+import com.android.TestContext;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Unit tests for DataConnectionStateHelper
+ */
+public class DataConnectionStateHelperTest {
+    private static final String TAG = "DataConnectionStateHelperTest";
+
+    private static final int SLOT_0 = 0;
+    private static final int SLOT_1 = 1;
+    private static final int SUB_1 = 1;
+    private static final int SUB_2 = 2;
+
+    @Mock private TelephonyManager mTm1;
+    @Mock private TelephonyManager mTm2;
+    @Mock private EmergencyCallDomainSelector mDomainSelector;
+
+    private Context mContext;
+    private HandlerThread mHandlerThread;
+    private TestableLooper mLooper;
+    private DataConnectionStateHelper mEpdnHelper;
+    private CarrierConfigManager mCarrierConfigManager;
+    private TelephonyManager mTelephonyManager;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = new TestContext() {
+            private Intent mIntent;
+
+            @Override
+            public String getSystemServiceName(Class<?> serviceClass) {
+                if (serviceClass == TelephonyManager.class) {
+                    return Context.TELEPHONY_SERVICE;
+                } else if (serviceClass == CarrierConfigManager.class) {
+                    return Context.CARRIER_CONFIG_SERVICE;
+                }
+                return super.getSystemServiceName(serviceClass);
+            }
+
+            @Override
+            public String getOpPackageName() {
+                return "";
+            }
+
+            @Override
+            public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+                return mIntent;
+            }
+
+            @Override
+            public void sendStickyBroadcast(Intent intent) {
+                mIntent = intent;
+            }
+        };
+
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+
+        mHandlerThread = new HandlerThread("DataConnectionStateHelperTest");
+        mHandlerThread.start();
+
+        try {
+            mLooper = new TestableLooper(mHandlerThread.getLooper());
+        } catch (Exception e) {
+            logd("Unable to create looper from handler.");
+        }
+
+        mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
+        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
+        doReturn(mTm1).when(mTelephonyManager).createForSubscriptionId(eq(SUB_1));
+        doReturn(mTm2).when(mTelephonyManager).createForSubscriptionId(eq(SUB_2));
+
+        mEpdnHelper = new DataConnectionStateHelper(mContext, mHandlerThread.getLooper());
+        mEpdnHelper.setEmergencyCallDomainSelector(mDomainSelector);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (mEpdnHelper != null) {
+            mEpdnHelper.destroy();
+            mEpdnHelper = null;
+        }
+
+        if (mLooper != null) {
+            mLooper.destroy();
+            mLooper = null;
+        }
+    }
+
+    @Test
+    public void testInit() throws Exception {
+        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
+                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
+        ArgumentCaptor<Executor> executorCaptor = ArgumentCaptor.forClass(Executor.class);
+
+        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(executorCaptor.capture(),
+                callbackCaptor.capture());
+        assertNotNull(executorCaptor.getValue());
+        assertNotNull(callbackCaptor.getValue());
+    }
+
+    @Test
+    public void testCarrierConfigChanged() throws Exception {
+        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
+                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
+
+        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
+                callbackCaptor.capture());
+
+        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
+
+        assertNotNull(callback);
+
+        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
+
+        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_1));
+
+        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor1 =
+                ArgumentCaptor.forClass(TelephonyCallback.class);
+
+        // TelephonyCallback for SUB_1 registered
+        verify(mTm1).registerTelephonyCallback(any(), telephonyCallbackCaptor1.capture());
+
+        assertNotNull(telephonyCallbackCaptor1.getValue());
+
+        callback.onCarrierConfigChanged(SLOT_1, SUB_2, 0, 0);
+
+        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_2));
+
+        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor2 =
+                ArgumentCaptor.forClass(TelephonyCallback.class);
+
+        // TelephonyCallback for SUB_2 registered
+        verify(mTm2).registerTelephonyCallback(any(), telephonyCallbackCaptor2.capture());
+
+        assertNotNull(telephonyCallbackCaptor2.getValue());
+
+        verify(mTm1, never()).unregisterTelephonyCallback(any());
+        verify(mTm2, never()).unregisterTelephonyCallback(any());
+    }
+
+    @Test
+    public void testSubscriptionChangedOnTheSameSlot() throws Exception {
+        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
+                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
+
+        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
+                callbackCaptor.capture());
+
+        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
+
+        assertNotNull(callback);
+
+        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
+
+        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_1));
+
+        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor1 =
+                ArgumentCaptor.forClass(TelephonyCallback.class);
+
+        // TelephonyCallback for SUB_1 registered
+        verify(mTm1).registerTelephonyCallback(any(), telephonyCallbackCaptor1.capture());
+
+        TelephonyCallback telephonyCallback1 = telephonyCallbackCaptor1.getValue();
+
+        assertNotNull(telephonyCallback1);
+
+        // Subscription changed
+        callback.onCarrierConfigChanged(SLOT_0, SUB_2, 0, 0);
+
+        // TelephonyCallback for SUB_1 unregistered
+        verify(mTelephonyManager).unregisterTelephonyCallback(eq(telephonyCallback1));
+
+        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_2));
+
+        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor2 =
+                ArgumentCaptor.forClass(TelephonyCallback.class);
+
+        // TelephonyCallback for SUB_2 registered
+        verify(mTm2).registerTelephonyCallback(any(), telephonyCallbackCaptor2.capture());
+
+        TelephonyCallback telephonyCallback2 = telephonyCallbackCaptor2.getValue();
+
+        assertNotNull(telephonyCallback2);
+    }
+
+    @Test
+    public void testDataConnectionStateChanged() throws Exception {
+        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
+                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
+
+        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
+                callbackCaptor.capture());
+
+        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
+
+        assertNotNull(callback);
+
+        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
+
+        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_1));
+
+        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor1 =
+                ArgumentCaptor.forClass(TelephonyCallback.class);
+
+        // TelephonyCallback for SUB_1 registered
+        verify(mTm1).registerTelephonyCallback(any(), telephonyCallbackCaptor1.capture());
+
+        TelephonyCallback cb1 = telephonyCallbackCaptor1.getValue();
+
+        assertNotNull(cb1);
+        assertTrue(cb1 instanceof TelephonyCallback.PreciseDataConnectionStateListener);
+
+        callback.onCarrierConfigChanged(SLOT_1, SUB_2, 0, 0);
+
+        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_2));
+
+        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor2 =
+                ArgumentCaptor.forClass(TelephonyCallback.class);
+
+        // TelephonyCallback for SUB_2 registered
+        verify(mTm2).registerTelephonyCallback(any(), telephonyCallbackCaptor2.capture());
+
+        TelephonyCallback cb2 = telephonyCallbackCaptor2.getValue();
+
+        assertNotNull(cb2);
+        assertTrue(cb2 instanceof TelephonyCallback.PreciseDataConnectionStateListener);
+
+        TelephonyCallback.PreciseDataConnectionStateListener listener1 =
+                (TelephonyCallback.PreciseDataConnectionStateListener) cb1;
+        TelephonyCallback.PreciseDataConnectionStateListener listener2 =
+                (TelephonyCallback.PreciseDataConnectionStateListener) cb2;
+
+        PreciseDataConnectionState state = getPreciseDataConnectionState(
+                ApnSetting.TYPE_DEFAULT, TelephonyManager.DATA_CONNECTED);
+        listener1.onPreciseDataConnectionStateChanged(state);
+        listener2.onPreciseDataConnectionStateChanged(state);
+
+        verify(mDomainSelector, never()).notifyDataConnectionStateChange(anyInt(), anyInt());
+        verify(mDomainSelector, never()).notifyDataConnectionStateChange(anyInt(), anyInt());
+
+        state = getPreciseDataConnectionState(
+                ApnSetting.TYPE_EMERGENCY, TelephonyManager.DATA_CONNECTED);
+        listener1.onPreciseDataConnectionStateChanged(state);
+        listener2.onPreciseDataConnectionStateChanged(state);
+
+        verify(mDomainSelector, times(1)).notifyDataConnectionStateChange(
+                eq(SLOT_0), eq(TelephonyManager.DATA_CONNECTED));
+        verify(mDomainSelector, times(1)).notifyDataConnectionStateChange(
+                eq(SLOT_1), eq(TelephonyManager.DATA_CONNECTED));
+
+        state = getPreciseDataConnectionState(
+                ApnSetting.TYPE_EMERGENCY, TelephonyManager.DATA_DISCONNECTING);
+        listener1.onPreciseDataConnectionStateChanged(state);
+        listener2.onPreciseDataConnectionStateChanged(state);
+
+        verify(mDomainSelector, times(1)).notifyDataConnectionStateChange(
+                eq(SLOT_0), eq(TelephonyManager.DATA_DISCONNECTING));
+        verify(mDomainSelector, times(1)).notifyDataConnectionStateChange(
+                eq(SLOT_1), eq(TelephonyManager.DATA_DISCONNECTING));
+
+        state = getPreciseDataConnectionState(
+                ApnSetting.TYPE_EMERGENCY, TelephonyManager.DATA_DISCONNECTED);
+        listener1.onPreciseDataConnectionStateChanged(state);
+        listener2.onPreciseDataConnectionStateChanged(state);
+
+        verify(mDomainSelector, times(1)).notifyDataConnectionStateChange(
+                eq(SLOT_0), eq(TelephonyManager.DATA_DISCONNECTED));
+        verify(mDomainSelector, times(1)).notifyDataConnectionStateChange(
+                eq(SLOT_1), eq(TelephonyManager.DATA_DISCONNECTED));
+    }
+
+    @Test
+    public void testEmergencyCallbackModeEnter() throws Exception {
+        // Enter ECBM on slot 1
+        mContext.sendStickyBroadcast(getIntent(true, SLOT_1));
+
+        assertFalse(mEpdnHelper.isInEmergencyCallbackMode(SLOT_0));
+        assertTrue(mEpdnHelper.isInEmergencyCallbackMode(SLOT_1));
+    }
+
+    @Test
+    public void testEmergencyCallbackModeExit() throws Exception {
+        // Exit ECBM
+        mContext.sendStickyBroadcast(getIntent(false, SLOT_0));
+
+        assertFalse(mEpdnHelper.isInEmergencyCallbackMode(SLOT_0));
+    }
+
+    private static Intent getIntent(boolean inEcm, int slotIndex) {
+        Intent intent = new Intent(TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
+        intent.putExtra(TelephonyManager.EXTRA_PHONE_IN_ECM_STATE, inEcm);
+        intent.putExtra(SubscriptionManager.EXTRA_SLOT_INDEX, slotIndex);
+        return intent;
+    }
+
+    private static PreciseDataConnectionState getPreciseDataConnectionState(
+            int apnType, int state) {
+        return new PreciseDataConnectionState.Builder()
+                .setTransportType(TRANSPORT_TYPE_WWAN)
+                .setId(1)
+                .setState(state)
+                .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
+                .setApnSetting(new ApnSetting.Builder()
+                        .setApnTypeBitmask(apnType)
+                        .setApnName("default")
+                        .setEntryName("default")
+                        .build())
+                .setLinkProperties(new LinkProperties())
+                .setFailCause(0)
+                .build();
+    }
+
+    private static void logd(String str) {
+        Log.d(TAG, str);
+    }
+}
diff --git a/tests/src/com/android/services/telephony/domainselection/DynamicRoutingControllerTest.java b/tests/src/com/android/services/telephony/domainselection/DynamicRoutingControllerTest.java
new file mode 100644
index 0000000..f15ae4a
--- /dev/null
+++ b/tests/src/com/android/services/telephony/domainselection/DynamicRoutingControllerTest.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2024 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.services.telephony.domainselection;
+
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.os.Looper;
+import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
+import android.text.TextUtils;
+
+import com.android.TestContext;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.emergency.EmergencyNumberTracker;
+import com.android.phone.R;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+
+/**
+ * Unit tests for DynamicRoutingController
+ */
+public class DynamicRoutingControllerTest {
+    private static final String TAG = "DynamicRoutingControllerTest";
+
+    private static final int SLOT_0 = 0;
+    private static final int SLOT_1 = 1;
+
+    @Mock private Resources mResources;
+    @Mock private DynamicRoutingController.PhoneFactoryProxy mPhoneFactoryProxy;
+    @Mock private Phone mPhone0;
+    @Mock private Phone mPhone1;
+    @Mock private EmergencyNumberTracker mEmergencyNumberTracker;
+
+    private BroadcastReceiver mReceiver;
+    private IntentFilter mIntentFilter;
+
+    private Context mContext;
+    private DynamicRoutingController mDrc;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContext = new TestContext() {
+            @Override
+            public String getOpPackageName() {
+                return "";
+            }
+
+            @Override
+            public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+                mReceiver = receiver;
+                mIntentFilter = filter;
+                return null;
+            }
+
+            @Override
+            public Resources getResources() {
+                return mResources;
+            }
+        };
+
+        if (Looper.myLooper() == null) {
+            Looper.prepare();
+        }
+
+        when(mResources.getStringArray(anyInt())).thenReturn(null);
+        when(mPhoneFactoryProxy.getPhone(eq(SLOT_0))).thenReturn(mPhone0);
+        when(mPhoneFactoryProxy.getPhone(eq(SLOT_1))).thenReturn(mPhone1);
+        when(mPhone0.getPhoneId()).thenReturn(SLOT_0);
+        when(mPhone1.getPhoneId()).thenReturn(SLOT_1);
+        when(mPhone0.getEmergencyNumberTracker()).thenReturn(mEmergencyNumberTracker);
+        when(mPhone1.getEmergencyNumberTracker()).thenReturn(mEmergencyNumberTracker);
+        when(mEmergencyNumberTracker.getEmergencyNumbers(anyString()))
+                .thenReturn(new ArrayList<EmergencyNumber>());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        mDrc = null;
+    }
+
+    @Test
+    public void testNotEnabledInitialize() throws Exception {
+        createController(false, null);
+
+        assertFalse(mDrc.isDynamicRoutingEnabled());
+
+        assertNull(mReceiver);
+        assertNull(mIntentFilter);
+    }
+
+    @Test
+    public void testEnabledInitialize() throws Exception {
+        createController(true, null);
+
+        assertTrue(mDrc.isDynamicRoutingEnabled());
+        assertFalse(mDrc.isDynamicRoutingEnabled(mPhone0));
+        assertFalse(mDrc.isDynamicRoutingEnabled(mPhone1));
+    }
+
+    @Test
+    public void testEnabledCountryChanged() throws Exception {
+        createController(true, "us");
+
+        sendNetworkCountryChanged(SLOT_0, "zz");
+        assertTrue(mDrc.isDynamicRoutingEnabled());
+        assertFalse(mDrc.isDynamicRoutingEnabled(mPhone0));
+        assertFalse(mDrc.isDynamicRoutingEnabled(mPhone1));
+
+        sendNetworkCountryChanged(SLOT_0, "us");
+        assertTrue(mDrc.isDynamicRoutingEnabled(mPhone0));
+        assertTrue(mDrc.isDynamicRoutingEnabled(mPhone1));
+    }
+
+    @Test
+    public void testDynamicRouting() throws Exception {
+        doReturn(new String[] {"us,,110,117,118,119", "zz,,200"})
+                .when(mResources).getStringArray(
+                eq(R.array.config_dynamic_routing_emergency_numbers));
+
+        createController(true, "us");
+
+        sendNetworkCountryChanged(SLOT_0, "us");
+
+        ArrayList<EmergencyNumber> nums = new ArrayList<EmergencyNumber>();
+        nums.add(getEmergencyNumber("us", "110", "92"));
+        when(mEmergencyNumberTracker.getEmergencyNumbers(eq("110"))).thenReturn(nums);
+
+        // Not included in the resource configuration.
+        nums = new ArrayList<EmergencyNumber>();
+        nums.add(getEmergencyNumber("us", "111", "92"));
+        when(mEmergencyNumberTracker.getEmergencyNumbers(eq("111"))).thenReturn(nums);
+
+        // Different country.
+        nums = new ArrayList<EmergencyNumber>();
+        nums.add(getEmergencyNumber("zz", "117", "92"));
+        when(mEmergencyNumberTracker.getEmergencyNumbers(eq("117"))).thenReturn(nums);
+
+        // No info in the EmergencyNumberTracker
+        nums = new ArrayList<EmergencyNumber>();
+        when(mEmergencyNumberTracker.getEmergencyNumbers(eq("118"))).thenReturn(nums);
+
+        nums = new ArrayList<EmergencyNumber>();
+        nums.add(getEmergencyNumber("us", "119", "92"));
+        when(mEmergencyNumberTracker.getEmergencyNumbers(eq("119"))).thenReturn(nums);
+
+        // Different country.
+        nums = new ArrayList<EmergencyNumber>();
+        nums.add(getEmergencyNumber("us", "200", "92"));
+        when(mEmergencyNumberTracker.getEmergencyNumbers(eq("200"))).thenReturn(nums);
+
+        assertTrue(mDrc.isDynamicNumber(mPhone0, "110"));
+        assertFalse(mDrc.isDynamicNumber(mPhone0, "111"));
+        assertFalse(mDrc.isDynamicNumber(mPhone0, "117"));
+        assertFalse(mDrc.isDynamicNumber(mPhone0, "118"));
+        assertTrue(mDrc.isDynamicNumber(mPhone0, "119"));
+        assertFalse(mDrc.isDynamicNumber(mPhone0, "200"));
+    }
+
+    private EmergencyNumber getEmergencyNumber(String iso, String number, String mnc) {
+        return new EmergencyNumber(number, iso, mnc,
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED,
+                new ArrayList<String>(),
+                EmergencyNumber.EMERGENCY_NUMBER_SOURCE_MODEM_CONFIG,
+                EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
+    }
+
+    private void sendNetworkCountryChanged(int phoneId, String iso) {
+        Intent intent = new Intent(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED);
+        intent.putExtra(PhoneConstants.PHONE_KEY, phoneId);
+        intent.putExtra(TelephonyManager.EXTRA_NETWORK_COUNTRY, iso);
+        mReceiver.onReceive(mContext, intent);
+    }
+
+    private void createController(boolean enabled, String iso) throws Exception {
+        doReturn(enabled).when(mResources).getBoolean(
+                eq(R.bool.dynamic_routing_emergency_enabled));
+        if (!TextUtils.isEmpty(iso)) {
+            doReturn(new String[] {iso}).when(mResources).getStringArray(
+                    eq(R.array.config_countries_dynamic_routing_emergency_enabled));
+        }
+
+        mDrc = new DynamicRoutingController(mPhoneFactoryProxy);
+        mDrc.initialize(mContext);
+
+        if (enabled) {
+            assertNotNull(mReceiver);
+            assertNotNull(mIntentFilter);
+            assertTrue(mIntentFilter.hasAction(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED));
+        }
+    }
+}
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 0735c3f..d4ee933 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -25,6 +25,7 @@
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.UTRAN;
 import static android.telephony.BarringInfo.BARRING_SERVICE_TYPE_EMERGENCY;
 import static android.telephony.BarringInfo.BarringServiceInfo.BARRING_TYPE_UNCONDITIONAL;
+import static android.telephony.CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_CALL_SETUP_TIMER_ON_CURRENT_NETWORK_SEC_INT;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_CDMA_PREFERRED_NUMBERS_STRING_ARRAY;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY;
@@ -39,6 +40,7 @@
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_REQUIRES_VOLTE_ENABLED_BOOL;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_SCAN_TIMER_SEC_INT;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_VOWIFI_REQUIRES_CONDITION_INT;
+import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_IMS_REASONINFO_CODE_TO_RETRY_EMERGENCY_INT_ARRAY;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_MAXIMUM_NUMBER_OF_EMERGENCY_TRIES_OVER_VOWIFI_INT;
 import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_PREFER_IMS_EMERGENCY_WHEN_VOICE_CALLS_ON_CS_BOOL;
@@ -58,10 +60,14 @@
 import static android.telephony.NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN;
 import static android.telephony.PreciseDisconnectCause.SERVICE_OPTION_NOT_AVAILABLE;
 import static android.telephony.TelephonyManager.DATA_CONNECTED;
+import static android.telephony.TelephonyManager.DATA_DISCONNECTED;
+import static android.telephony.TelephonyManager.DATA_DISCONNECTING;
 import static android.telephony.TelephonyManager.SIM_ACTIVATION_STATE_DEACTIVATED;
 
 import static com.android.services.telephony.domainselection.EmergencyCallDomainSelector.MSG_MAX_CELLULAR_TIMEOUT;
 import static com.android.services.telephony.domainselection.EmergencyCallDomainSelector.MSG_NETWORK_SCAN_TIMEOUT;
+import static com.android.services.telephony.domainselection.EmergencyCallDomainSelector.MSG_WAIT_DISCONNECTION_TIMEOUT;
+import static com.android.services.telephony.domainselection.EmergencyCallDomainSelector.MSG_WAIT_FOR_IMS_STATE_TIMEOUT;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
@@ -86,6 +92,7 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.net.ConnectivityManager;
+import android.net.Network;
 import android.net.NetworkRequest;
 import android.net.Uri;
 import android.os.CancellationSignal;
@@ -97,6 +104,7 @@
 import android.os.PersistableBundle;
 import android.os.PowerManager;
 import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.BarringInfo;
 import android.telephony.CarrierConfigManager;
@@ -113,6 +121,7 @@
 import android.telephony.WwanSelectorCallback;
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ImsReasonInfo;
 import android.telephony.ims.ProvisioningManager;
 import android.testing.TestableLooper;
 import android.util.Log;
@@ -121,6 +130,7 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.TestContext;
+import com.android.phone.R;
 
 import org.junit.After;
 import org.junit.Before;
@@ -155,10 +165,11 @@
     @Mock private DomainSelectorBase.DestroyListener mDestroyListener;
     @Mock private ProvisioningManager mProvisioningManager;
     @Mock private CrossSimRedialingController mCsrdCtrl;
-    @Mock private CarrierConfigHelper mCarrierConfigHelper;
-    @Mock private EmergencyCallbackModeHelper mEcbmHelper;
+    @Mock private DataConnectionStateHelper mEpdnHelper;
     @Mock private Resources mResources;
 
+    private TelecomManager mTelecomManager;
+
     private Context mContext;
 
     private HandlerThread mHandlerThread;
@@ -178,6 +189,8 @@
             public String getSystemServiceName(Class<?> serviceClass) {
                 if (serviceClass == ImsManager.class) {
                     return Context.TELEPHONY_IMS_SERVICE;
+                } else if (serviceClass == TelecomManager.class) {
+                    return Context.TELECOM_SERVICE;
                 } else if (serviceClass == TelephonyManager.class) {
                     return Context.TELEPHONY_SERVICE;
                 } else if (serviceClass == CarrierConfigManager.class) {
@@ -234,6 +247,9 @@
         when(mTelephonyManager.getSimState(anyInt())).thenReturn(TelephonyManager.SIM_STATE_READY);
         when(mTelephonyManager.getActiveModemCount()).thenReturn(1);
 
+        mTelecomManager = mContext.getSystemService(TelecomManager.class);
+        when(mTelecomManager.getCurrentTtyMode()).thenReturn(TelecomManager.TTY_MODE_OFF);
+
         mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
         when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg()))
             .thenReturn(getDefaultPersistableBundle());
@@ -306,6 +322,7 @@
         verify(mWwanSelectorCallback, times(0)).onRequestEmergencyNetworkScan(
                 any(), anyInt(), anyBoolean(), any(), any());
         verify(mWwanSelectorCallback, times(0)).onDomainSelected(anyInt(), eq(true));
+        verify(mEpdnHelper).setEmergencyCallDomainSelector(eq(mDomainSelector));
     }
 
     @Test
@@ -327,6 +344,7 @@
         unsolBarringInfoChanged(false);
 
         verify(mTransportSelectorCallback, never()).onWwanSelected(any());
+        verify(mEpdnHelper).setEmergencyCallDomainSelector(eq(null));
     }
 
     @Test
@@ -381,11 +399,14 @@
         mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
         processAllMessages();
 
+        assertTrue(mDomainSelector.hasMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
         bindImsService();
         unsolBarringInfoChanged(false);
 
         processAllMessages();
 
+        assertFalse(mDomainSelector.hasMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
         verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
         verify(mWwanSelectorCallback, times(1)).onDomainSelected(anyInt(), anyBoolean());
     }
@@ -563,6 +584,84 @@
     }
 
     @Test
+    public void testDefaultCombinedImsRegisteredSelectPsThenExtendedServiceRequestFailIsoMatch()
+            throws Exception {
+        doReturn(new String[] {"us"}).when(mResources).getStringArray(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
+                true, true, 0, 0, "", "", "us");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyCsDialed();
+
+        //Extended service request failed
+        SelectionAttributes.Builder builder =
+                new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCsDisconnectCause(SERVICE_OPTION_NOT_AVAILABLE)
+                .setEmergency(true)
+                .setEmergencyRegistrationResult(regResult);
+        attr = builder.build();
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyScanCsPreferred();
+    }
+
+    @Test
+    public void testDefaultCombinedImsRegisteredSelectPsThenExtendedServiceRequestFailIsoNotMatch()
+            throws Exception {
+        doReturn(new String[] {"us"}).when(mResources).getStringArray(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
+                true, true, 0, 0, "", "", "zz");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyCsDialed();
+
+        //Extended service request failed
+        SelectionAttributes.Builder builder =
+                new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCsDisconnectCause(SERVICE_OPTION_NOT_AVAILABLE)
+                .setEmergency(true)
+                .setEmergencyRegistrationResult(regResult);
+        attr = builder.build();
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyScanPsPreferred();
+    }
+
+    @Test
     public void testDefaultCombinedImsRegisteredSelectPsThenNotExtendedServiceRequestFails()
             throws Exception {
         createSelector(SLOT_0_SUB_ID);
@@ -1756,9 +1855,8 @@
         bindImsServiceUnregistered();
         processAllMessages();
 
-        verify(mTransportSelectorCallback, times(0))
-                .onSelectionTerminated(eq(DisconnectCause.EMERGENCY_PERM_FAILURE));
-        verifyScanPsPreferred();
+        verify(mTransportSelectorCallback, times(1))
+                .onSelectionTerminated(eq(DisconnectCause.ICC_ERROR));
     }
 
     @Test
@@ -1784,6 +1882,39 @@
     }
 
     @Test
+    public void testDualSimNormalServiceOnTheOtherSubscriptionAfterScan() throws Exception {
+        mResultConsumer = null;
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        doReturn(2).when(mTelephonyManager).getActiveModemCount();
+        doReturn(true).when(mCsrdCtrl).isThereOtherSlotInService();
+        doReturn(new String[] {"in"}).when(mResources).getStringArray(anyInt());
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), eq(false), any(), any());
+        assertNotNull(mResultConsumer);
+
+        regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "", "in");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verify(mTransportSelectorCallback, times(1))
+                .onSelectionTerminated(eq(DisconnectCause.EMERGENCY_TEMP_FAILURE));
+    }
+
+    @Test
     public void testEutranWithCsDomainOnly() throws Exception {
         setupForHandleScanResult();
 
@@ -1797,6 +1928,32 @@
     }
 
     @Test
+    public void testEutranVopsNotSupported() throws Exception {
+        setupForHandleScanResult();
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                DOMAIN_CS | DOMAIN_PS, false, true, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verifyPsDialed();
+    }
+
+    @Test
+    public void testEutranEmcBearerNotSupported() throws Exception {
+        setupForHandleScanResult();
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                DOMAIN_CS | DOMAIN_PS, true, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
     public void testEutranWithPsDomainOnly() throws Exception {
         setupForHandleScanResult();
 
@@ -1849,22 +2006,50 @@
         mResultConsumer.accept(regResult);
         processAllMessages();
 
-        verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
                 any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), eq(false), any(), any());
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), eq(true), any(), any());
     }
 
     @Test
-    public void testFullServiceInRoaming() throws Exception {
+    public void testFullServiceInDomesticRoaming() throws Exception {
         PersistableBundle bundle = getDefaultPersistableBundle();
         bundle.putInt(KEY_EMERGENCY_NETWORK_SCAN_TYPE_INT, SCAN_TYPE_FULL_SERVICE);
         when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn("us").when(mTelephonyManager).getSimCountryIso();
 
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(true);
 
         EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
                 REGISTRATION_STATE_ROAMING,
-                0, true, false, 0, 0, "", "");
+                0, true, false, 0, 0, "", "", "us");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE),
+                anyBoolean(), any(), any());
+    }
+
+    @Test
+    public void testFullServiceInInterNationalRoaming() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putInt(KEY_EMERGENCY_NETWORK_SCAN_TYPE_INT, SCAN_TYPE_FULL_SERVICE);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn("us").when(mTelephonyManager).getSimCountryIso();
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(true);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_ROAMING,
+                0, true, false, 0, 0, "", "", "zz");
         SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
         mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
         processAllMessages();
@@ -2346,7 +2531,7 @@
         processAllMessages();
 
         verify(mCsrdCtrl).notifyCallFailure(eq(PreciseDisconnectCause.EMERGENCY_PERM_FAILURE));
-        verify(mTransportSelectorCallback, never())
+        verify(mTransportSelectorCallback)
                 .onSelectionTerminated(eq(DisconnectCause.EMERGENCY_PERM_FAILURE));
     }
 
@@ -2412,6 +2597,53 @@
     }
 
     @Test
+    public void testScanTimeoutWifiNotAvailable() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyScanPsPreferred();
+
+        assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
+
+        // Wi-Fi is not connected.
+        verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
+
+        // Wi-Fi is connected.
+        mNetworkCallback.onAvailable(null);
+        processAllMessages();
+
+        verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
+
+        // Wi-Fi is disconnected.
+        mNetworkCallback.onUnavailable();
+        mDomainSelector.removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
+
+        // Timer is expired
+        mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
+
+        verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
+
+        // Wi-Fi is connected.
+        mNetworkCallback.onAvailable(null);
+        processAllMessages();
+
+        verify(mTransportSelectorCallback, times(1)).onWlanSelected(eq(true));
+    }
+
+    @Test
     public void testMaxCellularTimeout() throws Exception {
         PersistableBundle bundle = getDefaultPersistableBundle();
         bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
@@ -2456,6 +2688,13 @@
 
         assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
         verify(mTransportSelectorCallback, never()).onWlanSelected(anyBoolean());
+
+        // Wi-Fi is connected.
+        mNetworkCallback.onAvailable(null);
+        processAllMessages();
+
+        assertFalse(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
+        verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
     }
 
     @Test
@@ -2700,34 +2939,6 @@
     }
 
     @Test
-    public void testSimLockScanPsPreferredWithNr() throws Exception {
-        createSelector(SLOT_0_SUB_ID);
-        unsolBarringInfoChanged(false);
-
-        // The last valid subscription supported NR.
-        doReturn(true).when(mCarrierConfigHelper).isVoNrEmergencySupported(eq(SLOT_0));
-        when(mTelephonyManager.getSimState(anyInt())).thenReturn(
-                TelephonyManager.SIM_STATE_PIN_REQUIRED);
-
-        EmergencyRegistrationResult regResult = getEmergencyRegResult(
-                UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
-        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
-        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
-        processAllMessages();
-
-        bindImsServiceUnregistered();
-        processAllMessages();
-
-        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
-                any(), anyInt(), anyBoolean(), any(), any());
-        assertEquals(4, mAccessNetwork.size());
-        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
-        assertEquals(NGRAN, (int) mAccessNetwork.get(1));
-        assertEquals(UTRAN, (int) mAccessNetwork.get(2));
-        assertEquals(GERAN, (int) mAccessNetwork.get(3));
-    }
-
-    @Test
     public void testSimLockScanPsPreferredWithNrAtTheEnd() throws Exception {
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
@@ -2778,33 +2989,6 @@
     }
 
     @Test
-    public void testInvalidSubscriptionScanPsPreferredWithNr() throws Exception {
-        createSelector(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-        unsolBarringInfoChanged(false);
-
-        // The last valid subscription supported NR.
-        doReturn(true).when(mCarrierConfigHelper).isVoNrEmergencySupported(eq(SLOT_0));
-
-        EmergencyRegistrationResult regResult = getEmergencyRegResult(
-                UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
-        SelectionAttributes attr = getSelectionAttributes(SLOT_0,
-                SubscriptionManager.INVALID_SUBSCRIPTION_ID, regResult);
-        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
-        processAllMessages();
-
-        bindImsServiceUnregistered();
-        processAllMessages();
-
-        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
-                any(), anyInt(), anyBoolean(), any(), any());
-        assertEquals(4, mAccessNetwork.size());
-        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
-        assertEquals(NGRAN, (int) mAccessNetwork.get(1));
-        assertEquals(UTRAN, (int) mAccessNetwork.get(2));
-        assertEquals(GERAN, (int) mAccessNetwork.get(3));
-    }
-
-    @Test
     public void testDefaultLimitedServiceEutran() throws Exception {
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
@@ -2819,6 +3003,120 @@
         bindImsServiceUnregistered();
 
         verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyScanCsPreferred();
+    }
+
+    @Test
+    public void testDefaultLimitedServiceEutranFail() throws Exception {
+        mResultConsumer = null;
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_PS), eq(true));
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify PS preferred scan
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE),
+                anyBoolean(), any(), any());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertNotNull(mResultConsumer);
+
+        regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(2)).onDomainSelected(eq(DOMAIN_PS), eq(true));
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify RAT preference change
+        verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE),
+                anyBoolean(), any(), any());
+        assertEquals(UTRAN, (int) mAccessNetwork.get(0));
+    }
+
+    @Test
+    public void testDefaultLimitedServiceEutranFailScanLimitedOnly() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putBoolean(KEY_SCAN_LIMITED_SERVICE_AFTER_VOLTE_FAILURE_BOOL,
+                true);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_PS), eq(true));
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify CS preferred limited service only scan
+        verify(mWwanSelectorCallback).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_LIMITED_SERVICE),
+                anyBoolean(), any(), any());
+        assertEquals(UTRAN, (int) mAccessNetwork.get(0));
+    }
+
+    @Test
+    public void testDefaultLimitedServiceEutranFailPinLocked() throws Exception {
+        doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
+                .when(mTelephonyManager).getSimState(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_PS), eq(true));
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyScanCsPreferred();
     }
 
     @Test
@@ -2843,12 +3141,51 @@
     }
 
     @Test
-    public void testScanLtePreferredAfterNgranFailure() throws Exception {
+    public void testScanLtePreferredAfterNgranFailureSupportEmf() throws Exception {
         PersistableBundle bundle = getDefaultPersistableBundle();
         bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
                 new int[] { NGRAN, EUTRAN });
         bundle.putBoolean(KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL, true);
         when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_PS, true, false, 1, 1, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify not waiting for the disconnection in case EMF is supported.
+        assertFalse(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(1));
+        assertEquals(GERAN, (int) mAccessNetwork.get(2));
+        assertEquals(NGRAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testScanLtePreferredAfterNgranFailureNotSupportEmf() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        bundle.putBoolean(KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL, true);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
 
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
@@ -2867,6 +3204,176 @@
         mDomainSelector.reselectDomain(attr);
         processAllMessages();
 
+        // Verify waiting for the disconnection in case EMF is supported.
+        assertTrue(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+
+        mDomainSelector.removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, never()).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+
+        mDomainSelector.sendEmptyMessage(MSG_WAIT_DISCONNECTION_TIMEOUT);
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(1));
+        assertEquals(GERAN, (int) mAccessNetwork.get(2));
+        assertEquals(NGRAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testScanLtePreferredAfterNgranFailureRestartWaitingTimer() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        bundle.putBoolean(KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL, true);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_PS, true, false, 1, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        assertTrue(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+
+        mDomainSelector.removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
+
+        assertFalse(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+
+        mDomainSelector.notifyDataConnectionStateChange(SLOT_0, DATA_DISCONNECTING);
+
+        assertTrue(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+    }
+
+    @Test
+    public void testScanLtePreferredAfterNgranFailureDataDisconnected() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        bundle.putBoolean(KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL, true);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_PS, true, false, 1, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        assertTrue(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+
+        mDomainSelector.removeMessages(MSG_WAIT_DISCONNECTION_TIMEOUT);
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, never()).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+
+        mDomainSelector.notifyDataConnectionStateChange(SLOT_0, DATA_DISCONNECTED);
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertEquals(UTRAN, (int) mAccessNetwork.get(1));
+        assertEquals(GERAN, (int) mAccessNetwork.get(2));
+        assertEquals(NGRAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testDefaultAfterNgranFailureNotSupportEmf() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_PS, true, false, 1, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify not waiting for the disconnection
+        // in case KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL is false.
+        assertFalse(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(4, mAccessNetwork.size());
+        assertEquals(UTRAN, (int) mAccessNetwork.get(0));
+        assertEquals(GERAN, (int) mAccessNetwork.get(1));
+        assertEquals(NGRAN, (int) mAccessNetwork.get(2));
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(3));
+    }
+
+    @Test
+    public void testDefaultAfterNgranFailureSupportEmf() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                new int[] { NGRAN, EUTRAN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(NGRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_PS, true, false, 1, 1, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify not waiting for the disconnection
+        // in case KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL is false.
+        assertFalse(mDomainSelector.hasMessages(MSG_WAIT_DISCONNECTION_TIMEOUT));
+
         verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
                 any(), anyInt(), anyBoolean(), any(), any());
         assertEquals(4, mAccessNetwork.size());
@@ -2970,9 +3477,9 @@
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
 
-        doReturn(true).when(mEcbmHelper).isInEmergencyCallbackMode(anyInt());
-        doReturn(TRANSPORT_TYPE_WWAN).when(mEcbmHelper).getTransportType(anyInt());
-        doReturn(DATA_CONNECTED).when(mEcbmHelper).getDataConnectionState(anyInt());
+        doReturn(true).when(mEpdnHelper).isInEmergencyCallbackMode(anyInt());
+        doReturn(TRANSPORT_TYPE_WWAN).when(mEpdnHelper).getTransportType(anyInt());
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
 
         doAnswer(new Answer<Void>() {
             @Override
@@ -3004,9 +3511,9 @@
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
 
-        doReturn(true).when(mEcbmHelper).isInEmergencyCallbackMode(anyInt());
-        doReturn(TRANSPORT_TYPE_WLAN).when(mEcbmHelper).getTransportType(anyInt());
-        doReturn(DATA_CONNECTED).when(mEcbmHelper).getDataConnectionState(anyInt());
+        doReturn(true).when(mEpdnHelper).isInEmergencyCallbackMode(anyInt());
+        doReturn(TRANSPORT_TYPE_WLAN).when(mEpdnHelper).getTransportType(anyInt());
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
 
         EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
                 REGISTRATION_STATE_UNKNOWN,
@@ -3027,8 +3534,8 @@
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
 
-        doReturn(true).when(mEcbmHelper).isInEmergencyCallbackMode(anyInt());
-        doReturn(TRANSPORT_TYPE_WLAN).when(mEcbmHelper).getTransportType(anyInt());
+        doReturn(true).when(mEpdnHelper).isInEmergencyCallbackMode(anyInt());
+        doReturn(TRANSPORT_TYPE_WLAN).when(mEpdnHelper).getTransportType(anyInt());
 
         EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
                 REGISTRATION_STATE_UNKNOWN,
@@ -3049,9 +3556,9 @@
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
 
-        doReturn(false).when(mEcbmHelper).isInEmergencyCallbackMode(anyInt());
-        doReturn(TRANSPORT_TYPE_WLAN).when(mEcbmHelper).getTransportType(anyInt());
-        doReturn(DATA_CONNECTED).when(mEcbmHelper).getDataConnectionState(anyInt());
+        doReturn(false).when(mEpdnHelper).isInEmergencyCallbackMode(anyInt());
+        doReturn(TRANSPORT_TYPE_WLAN).when(mEpdnHelper).getTransportType(anyInt());
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
 
         EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
                 REGISTRATION_STATE_UNKNOWN,
@@ -3072,9 +3579,9 @@
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
 
-        doReturn(false).when(mEcbmHelper).isInEmergencyCallbackMode(anyInt());
-        doReturn(TRANSPORT_TYPE_WLAN).when(mEcbmHelper).getTransportType(anyInt());
-        doReturn(DATA_CONNECTED).when(mEcbmHelper).getDataConnectionState(anyInt());
+        doReturn(false).when(mEpdnHelper).isInEmergencyCallbackMode(anyInt());
+        doReturn(TRANSPORT_TYPE_WLAN).when(mEpdnHelper).getTransportType(anyInt());
+        doReturn(DATA_CONNECTED).when(mEpdnHelper).getDataConnectionState(anyInt());
 
         doAnswer(new Answer<Void>() {
             @Override
@@ -3155,6 +3662,637 @@
         assertEquals(EUTRAN, (int) mAccessNetwork.get(2));
     }
 
+    @Test
+    public void testReselectDomainCauseNoValidSim() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+        doReturn(false).when(mCsrdCtrl).isThereOtherSlot();
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(UTRAN,
+                REGISTRATION_STATE_HOME,
+                NetworkRegistrationInfo.DOMAIN_CS,
+                true, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyCsDialed();
+
+        attr = new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setEmergency(true)
+                .setEmergencyRegistrationResult(regResult)
+                .setCsDisconnectCause(PreciseDisconnectCause.NO_VALID_SIM)
+                .build();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verify(mCsrdCtrl).notifyCallFailure(eq(PreciseDisconnectCause.NO_VALID_SIM));
+        verify(mTransportSelectorCallback)
+                .onSelectionTerminated(eq(DisconnectCause.NOT_VALID));
+    }
+
+    @Test
+    public void testReceiveSipErrorThenTerminateSelection() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult 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();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_SIP_FORBIDDEN, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verify(mTransportSelectorCallback)
+                .onSelectionTerminated(eq(DisconnectCause.NOT_VALID));
+    }
+
+    @Test
+    public void testReceiveSipErrorThenNotTerminateSelection() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putIntArray(KEY_IMS_REASONINFO_CODE_TO_RETRY_EMERGENCY_INT_ARRAY,
+                new int[] { ImsReasonInfo.CODE_SIP_FORBIDDEN });
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult 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();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_SIP_FORBIDDEN, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testRetryWithCodeLocalCallCsRetryRequired() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult 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();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testRetryWithCodeLocalNotRegistered() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult 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();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testRetryWithCodeSipAlternateEemergencyCall() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult 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();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testRetryWithCodeLocalInternalError() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult 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();
+
+        bindImsService();
+
+        verifyPsDialed();
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testSimLockedNoCellularScanTimeout() throws Exception {
+        doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
+                .when(mTelephonyManager).getSimState(anyInt());
+
+        setupForHandleScanResult();
+
+        assertFalse(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
+        assertFalse(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
+    }
+
+    @Test
+    public void testWaitForImsStateTimeout() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        assertTrue(mDomainSelector.hasMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
+        verify(mTransportSelectorCallback, times(0)).onWwanSelected(any());
+        verify(mWwanSelectorCallback, times(0)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+
+        unsolBarringInfoChanged(false);
+        processAllMessages();
+
+        verify(mTransportSelectorCallback, times(0)).onWwanSelected(any());
+        verify(mWwanSelectorCallback, times(0)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertTrue(mDomainSelector.hasMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
+        mDomainSelector.handleMessage(
+                mDomainSelector.obtainMessage(MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
+        assertFalse(mDomainSelector.hasMessages(MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+        verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
+
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+    }
+
+    @Test
+    public void testSupportVoLteTtyLimitedServiceEutranWithNonTtyCall() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        bundle.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true);
+        bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, 20);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyScanCsPreferred();
+
+        // Verify timers for VoWi-Fi
+        assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
+        assertTrue(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
+    }
+
+    @Test
+    public void testNotSupportVoLteTtyLimitedServiceEutranWithTtyCall() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        int[] domainPreference = new int[] {
+                CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
+                CarrierConfigManager.ImsEmergency.DOMAIN_CS,
+                };
+        bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                    new int[] { NGRAN, EUTRAN });
+        bundle.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
+        bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, 20);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt(), anyVararg())).thenReturn(bundle);
+
+        when(mTelecomManager.getCurrentTtyMode()).thenReturn(TelecomManager.TTY_MODE_FULL);
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        processAllMessages();
+
+        // Verify CS only network scan
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertEquals(2, mAccessNetwork.size());
+        assertEquals(UTRAN, (int) mAccessNetwork.get(0));
+        assertEquals(GERAN, (int) mAccessNetwork.get(1));
+
+        // Verify no timer for VoWi-Fi
+        assertFalse(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
+        assertFalse(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
+    }
+
+    @Test
+    public void testInvalidSubscriptionAdjustCsRatPreference() throws Exception {
+        doReturn(new String[] {"us"}).when(mResources).getStringArray(
+                eq(R.array.config_countries_prefer_geran_when_sim_absent));
+
+        createSelector(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN, 0, false, true, 0, 0, "", "", "us");
+        // Invalid subscription id
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0,
+                SubscriptionManager.INVALID_SUBSCRIPTION_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 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));
+
+        createSelector(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        unsolBarringInfoChanged(false);
+
+        // Country is not identified
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN, 0, false, true, 0, 0, "", "");
+        // Invalid subscription id
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0,
+                SubscriptionManager.INVALID_SUBSCRIPTION_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify not adjusted RAT preference
+        verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, UTRAN);
+    }
+
+    @Test
+    public void testNotAdjustCsRatPreferenceValidSubscription() 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);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN, 0, false, true, 0, 0, "", "", "us");
+        // Valid subscription id
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify not adjusted RAT preference
+        verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, UTRAN);
+    }
+
+    @Test
+    public void testNotTerminateSelectionAfterCsFailure() throws Exception {
+        mResultConsumer = null;
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        // mcc is identified but it doesn't start with 00.
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                UTRAN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "999", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_CS), eq(false));
+
+        SelectionAttributes.Builder builder =
+                new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCsDisconnectCause(SERVICE_OPTION_NOT_AVAILABLE)
+                .setEmergency(true)
+                .setEmergencyRegistrationResult(regResult);
+        attr = builder.build();
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify reselection.
+        verify(mWwanSelectorCallback).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        verify(mTransportSelectorCallback, never())
+                .onSelectionTerminated(eq(DisconnectCause.NOT_VALID));
+    }
+
+    @Test
+    public void testTerminateSelectionAfterCsFailure() throws Exception {
+        mResultConsumer = null;
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        // mcc is identified and it starts with 00.
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                UTRAN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "003", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_CS), eq(false));
+
+        SelectionAttributes.Builder builder =
+                new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCsDisconnectCause(SERVICE_OPTION_NOT_AVAILABLE)
+                .setEmergency(true)
+                .setEmergencyRegistrationResult(regResult);
+        attr = builder.build();
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify selection termination.
+        verify(mWwanSelectorCallback, never()).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        verify(mTransportSelectorCallback)
+                .onSelectionTerminated(eq(DisconnectCause.NOT_VALID));
+    }
+
+    @Test
+    public void testTerminateSelectionAfterCsFailureAfterScan() throws Exception {
+        mResultConsumer = null;
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(
+                UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertNotNull(mResultConsumer);
+
+        // mcc is not identified.
+        regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_CS), eq(false));
+
+        SelectionAttributes.Builder builder =
+                new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
+                .setAddress(TEST_URI)
+                .setCsDisconnectCause(SERVICE_OPTION_NOT_AVAILABLE)
+                .setEmergency(true)
+                .setEmergencyRegistrationResult(regResult);
+        attr = builder.build();
+        mResultConsumer = null;
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify reselection.
+        verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertNotNull(mResultConsumer);
+
+        // mcc is identified but it doesn't start with 00.
+        regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "999", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(2)).onDomainSelected(eq(DOMAIN_CS), eq(false));
+
+        mResultConsumer = null;
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify reselection.
+        verify(mWwanSelectorCallback, times(3)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        assertNotNull(mResultConsumer);
+
+        // mcc is identified and it starts with 00.
+        regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "003", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(3)).onDomainSelected(eq(DOMAIN_CS), eq(false));
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify selection termination.
+        verify(mWwanSelectorCallback, times(3)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), anyBoolean(), any(), any());
+        verify(mTransportSelectorCallback)
+                .onSelectionTerminated(eq(DisconnectCause.NOT_VALID));
+    }
+
+    @Test
+    public void testMultipleWiFiNetworksAvailable() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyScanPsPreferred();
+
+        Network network1 = mock(Network.class);
+
+        // Wi-Fi is connected.
+        mNetworkCallback.onAvailable(network1);
+
+        assertTrue(mDomainSelector.isWiFiAvailable());
+        assertFalse(mDomainSelector.getWiFiNetworksAvailable().isEmpty());
+        assertTrue(mDomainSelector.getWiFiNetworksAvailable().contains(network1));
+
+        // Wi-Fi is lost.
+        mNetworkCallback.onLost(network1);
+
+        assertFalse(mDomainSelector.isWiFiAvailable());
+        assertTrue(mDomainSelector.getWiFiNetworksAvailable().isEmpty());
+
+        Network network2 = mock(Network.class);
+        Network network3 = mock(Network.class);
+
+        // Wi-Fi networks are connected.
+        mNetworkCallback.onAvailable(network2);
+
+        assertTrue(mDomainSelector.isWiFiAvailable());
+        assertFalse(mDomainSelector.getWiFiNetworksAvailable().isEmpty());
+        assertTrue(mDomainSelector.getWiFiNetworksAvailable().contains(network2));
+        assertFalse(mDomainSelector.getWiFiNetworksAvailable().contains(network3));
+
+        mNetworkCallback.onAvailable(network3);
+
+        assertTrue(mDomainSelector.isWiFiAvailable());
+        assertFalse(mDomainSelector.getWiFiNetworksAvailable().isEmpty());
+        assertTrue(mDomainSelector.getWiFiNetworksAvailable().contains(network2));
+        assertTrue(mDomainSelector.getWiFiNetworksAvailable().contains(network3));
+
+        // Wi-Fi network2 is lost.
+        mNetworkCallback.onLost(network2);
+
+        assertTrue(mDomainSelector.isWiFiAvailable());
+        assertFalse(mDomainSelector.getWiFiNetworksAvailable().isEmpty());
+        assertFalse(mDomainSelector.getWiFiNetworksAvailable().contains(network2));
+        assertTrue(mDomainSelector.getWiFiNetworksAvailable().contains(network3));
+
+        // Wi-Fi is unavailable.
+        mNetworkCallback.onUnavailable();
+
+        assertFalse(mDomainSelector.isWiFiAvailable());
+        assertTrue(mDomainSelector.getWiFiNetworksAvailable().isEmpty());
+    }
+
     private void setupForScanListTest(PersistableBundle bundle) throws Exception {
         setupForScanListTest(bundle, false);
     }
@@ -3230,7 +4368,7 @@
     private void createSelector(int subId) throws Exception {
         mDomainSelector = new EmergencyCallDomainSelector(
                 mContext, SLOT_0, subId, mHandlerThread.getLooper(),
-                mImsStateTracker, mDestroyListener, mCsrdCtrl, mCarrierConfigHelper, mEcbmHelper);
+                mImsStateTracker, mDestroyListener, mCsrdCtrl, mEpdnHelper);
         mDomainSelector.clearResourceConfiguration();
         replaceInstance(DomainSelectorBase.class,
                 "mWwanSelectorCallback", mDomainSelector, mWwanSelectorCallback);
@@ -3395,6 +4533,7 @@
                 ltePreferredAfterNrFailed);
         bundle.putStringArray(KEY_EMERGENCY_CDMA_PREFERRED_NUMBERS_STRING_ARRAY,
                 cdmaPreferredNumbers);
+        bundle.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
 
         return bundle;
     }
@@ -3406,11 +4545,18 @@
 
     private static SelectionAttributes getSelectionAttributes(int slotId, int subId,
             boolean isTestEmergencyNumber, EmergencyRegistrationResult regResult) {
+        return getSelectionAttributes(slotId, subId, isTestEmergencyNumber, regResult, null);
+    }
+
+    private static SelectionAttributes getSelectionAttributes(int slotId, int subId,
+            boolean isTestEmergencyNumber, EmergencyRegistrationResult regResult,
+            ImsReasonInfo imsReasonInfo) {
         SelectionAttributes.Builder builder =
                 new SelectionAttributes.Builder(slotId, subId, SELECTOR_TYPE_CALLING)
                 .setAddress(TEST_URI)
                 .setEmergency(true)
                 .setTestEmergencyNumber(isTestEmergencyNumber)
+                .setPsDisconnectCause(imsReasonInfo)
                 .setEmergencyRegistrationResult(regResult);
         return builder.build();
     }
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelperTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelperTest.java
deleted file mode 100644
index 9a4e0d8..0000000
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelperTest.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (C) 2024 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.services.telephony.domainselection;
-
-import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL;
-
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.assertNotNull;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.PersistableBundle;
-import android.telephony.CarrierConfigManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyCallback;
-import android.telephony.TelephonyManager;
-import android.testing.TestableLooper;
-import android.util.Log;
-
-import com.android.TestContext;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.MockitoAnnotations;
-
-import java.util.concurrent.Executor;
-
-/**
- * Unit tests for EmergencyCallbackModeHelper
- */
-public class EmergencyCallbackModeHelperTest {
-    private static final String TAG = "EmergencyCallbackModeHelperTest";
-
-    private static final int SLOT_0 = 0;
-    private static final int SLOT_1 = 1;
-    private static final int SUB_1 = 1;
-    private static final int SUB_2 = 2;
-
-    private Context mContext;
-    private HandlerThread mHandlerThread;
-    private TestableLooper mLooper;
-    private EmergencyCallbackModeHelper mEcbmHelper;
-    private CarrierConfigManager mCarrierConfigManager;
-    private TelephonyManager mTelephonyManager;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mContext = new TestContext() {
-            private Intent mIntent;
-
-            @Override
-            public String getSystemServiceName(Class<?> serviceClass) {
-                if (serviceClass == TelephonyManager.class) {
-                    return Context.TELEPHONY_SERVICE;
-                } else if (serviceClass == CarrierConfigManager.class) {
-                    return Context.CARRIER_CONFIG_SERVICE;
-                }
-                return super.getSystemServiceName(serviceClass);
-            }
-
-            @Override
-            public String getOpPackageName() {
-                return "";
-            }
-
-            @Override
-            public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
-                return mIntent;
-            }
-
-            @Override
-            public void sendStickyBroadcast(Intent intent) {
-                mIntent = intent;
-            }
-        };
-
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-
-        mHandlerThread = new HandlerThread("EmergencyCallbackModeHelperTest");
-        mHandlerThread.start();
-
-        try {
-            mLooper = new TestableLooper(mHandlerThread.getLooper());
-        } catch (Exception e) {
-            logd("Unable to create looper from handler.");
-        }
-
-        mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
-        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
-        doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(anyInt());
-
-        mEcbmHelper = new EmergencyCallbackModeHelper(mContext, mHandlerThread.getLooper());
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        if (mEcbmHelper != null) {
-            mEcbmHelper.destroy();
-            mEcbmHelper = null;
-        }
-
-        if (mLooper != null) {
-            mLooper.destroy();
-            mLooper = null;
-        }
-    }
-
-    @Test
-    public void testInit() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-        ArgumentCaptor<Executor> executorCaptor = ArgumentCaptor.forClass(Executor.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(executorCaptor.capture(),
-                callbackCaptor.capture());
-        assertNotNull(executorCaptor.getValue());
-        assertNotNull(callbackCaptor.getValue());
-    }
-
-    @Test
-    public void testEmergencyCallbackModeNotSupported() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // ECBM not supported
-        PersistableBundle b = getPersistableBundle(false);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        // No TelephonyCallback registered
-        verify(mTelephonyManager, never()).registerTelephonyCallback(any(), any());
-    }
-
-    @Test
-    public void testEmergencyCallbackModeSupported() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // ECBM supported
-        PersistableBundle b = getPersistableBundle(true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_1));
-
-        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor =
-                ArgumentCaptor.forClass(TelephonyCallback.class);
-
-        // TelephonyCallback registered
-        verify(mTelephonyManager).registerTelephonyCallback(any(),
-                telephonyCallbackCaptor.capture());
-
-        assertNotNull(telephonyCallbackCaptor.getValue());
-    }
-
-    @Test
-    public void testEmergencyCallbackModeChanged() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // ECBM supported
-        PersistableBundle b = getPersistableBundle(true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        verify(mTelephonyManager).createForSubscriptionId(eq(SUB_1));
-
-        ArgumentCaptor<TelephonyCallback> telephonyCallbackCaptor =
-                ArgumentCaptor.forClass(TelephonyCallback.class);
-
-        // TelephonyCallback registered
-        verify(mTelephonyManager).registerTelephonyCallback(any(),
-                telephonyCallbackCaptor.capture());
-
-        TelephonyCallback telephonyCallback = telephonyCallbackCaptor.getValue();
-
-        assertNotNull(telephonyCallback);
-
-        // Carrier config changes, ECBM not supported
-        b = getPersistableBundle(false);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        // TelephonyCallback unregistered
-        verify(mTelephonyManager).unregisterTelephonyCallback(eq(telephonyCallback));
-    }
-
-    @Test
-    public void testEmergencyCallbackModeEnter() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // ECBM supported
-        PersistableBundle b = getPersistableBundle(true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-        callback.onCarrierConfigChanged(SLOT_1, SUB_2, 0, 0);
-
-        // Enter ECBM on slot 1
-        mContext.sendStickyBroadcast(getIntent(true, SLOT_1));
-
-        assertFalse(mEcbmHelper.isInEmergencyCallbackMode(SLOT_0));
-        assertTrue(mEcbmHelper.isInEmergencyCallbackMode(SLOT_1));
-    }
-
-    @Test
-    public void testEmergencyCallbackModeExit() throws Exception {
-        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> callbackCaptor =
-                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
-
-        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
-                callbackCaptor.capture());
-
-        CarrierConfigManager.CarrierConfigChangeListener callback = callbackCaptor.getValue();
-
-        assertNotNull(callback);
-
-        // ECBM supported
-        PersistableBundle b = getPersistableBundle(true);
-        doReturn(b).when(mCarrierConfigManager).getConfigForSubId(anyInt(), anyString());
-        callback.onCarrierConfigChanged(SLOT_0, SUB_1, 0, 0);
-
-        // Exit ECBM
-        mContext.sendStickyBroadcast(getIntent(false, SLOT_0));
-
-        assertFalse(mEcbmHelper.isInEmergencyCallbackMode(SLOT_0));
-    }
-
-    private static Intent getIntent(boolean inEcm, int slotIndex) {
-        Intent intent = new Intent(TelephonyManager.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
-        intent.putExtra(TelephonyManager.EXTRA_PHONE_IN_ECM_STATE, inEcm);
-        intent.putExtra(SubscriptionManager.EXTRA_SLOT_INDEX, slotIndex);
-        return intent;
-    }
-
-    private static PersistableBundle getPersistableBundle(boolean supported) {
-        PersistableBundle bundle  = new PersistableBundle();
-        bundle.putBoolean(KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL, supported);
-        return bundle;
-    }
-
-    private static void logd(String str) {
-        Log.d(TAG, str);
-    }
-}
diff --git a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
index 6e438bf..9d5a017 100644
--- a/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/NormalCallDomainSelectorTest.java
@@ -19,6 +19,7 @@
 import static android.telephony.DomainSelectionService.SELECTOR_TYPE_CALLING;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.any;
@@ -48,10 +49,13 @@
 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;
 
+import com.android.internal.telephony.CallFailCause;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -60,7 +64,6 @@
 import org.mockito.MockitoAnnotations;
 
 import java.util.List;
-import java.util.concurrent.Executors;
 import java.util.function.Consumer;
 
 /**
@@ -79,7 +82,7 @@
 
     private HandlerThread mHandlerThread;
     private NormalCallDomainSelector mNormalCallDomainSelector;
-
+    private TestableLooper mTestableLooper;
     @Mock private Context mMockContext;
     @Mock private CarrierConfigManager mMockCarrierConfigMgr;
     @Mock private ImsManager mMockImsManager;
@@ -124,6 +127,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 +140,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 +180,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 +209,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 +234,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 +244,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 +254,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 +265,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 +285,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 +306,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 +326,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 +383,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 +401,88 @@
                 .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)
+                .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 +505,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 +565,186 @@
 
         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());
     }
 
+    @Test
+    public void testEmcCsFailureAndPsRedial() {
+        final TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
 
+        final ServiceState serviceState = new ServiceState();
 
-    static class MockTransportSelectorCallback implements TransportSelectorCallback,
+        // dial CS call
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        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);
+        DomainSelectionService.SelectionAttributes 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)
+                        .build();
+
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+
+        processAllMessages();
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_CS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+
+        // EMC_REDIAL_ON_IMS
+        transportSelectorCallback.reset();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        initialize(serviceState, true, false, true, false);
+        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)
+                .setCsDisconnectCause(CallFailCause.EMC_REDIAL_ON_IMS)
+                .build();
+
+        mNormalCallDomainSelector.reselectDomain(attributes);
+
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWwanSelected);
+        assertEquals(NetworkRegistrationInfo.DOMAIN_PS, transportSelectorCallback.mSelectedDomain);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+
+        // EMC_REDIAL_ON_VOWIFI
+        transportSelectorCallback.reset();
+        initialize(serviceState, true, true, true, false);
+        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)
+                .setCsDisconnectCause(CallFailCause.EMC_REDIAL_ON_VOWIFI)
+                .build();
+
+        mNormalCallDomainSelector.reselectDomain(attributes);
+
+        processAllMessages();
+        assertTrue(transportSelectorCallback.mWlanSelected);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+    }
+
+    @Test
+    public void testImsRegistrationStateTimeoutMessage() {
+        final TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
+
+        final ServiceState serviceState = new ServiceState();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        mNormalCallDomainSelector.onServiceStateUpdated(serviceState);
+        doReturn(true).when(mMockImsStateTracker).isImsStateReady();
+        doReturn(true).when(mMockImsStateTracker).isImsRegistered();
+        doReturn(true).when(mMockImsStateTracker).isImsVoiceCapable();
+        doReturn(false).when(mMockImsStateTracker).isImsVideoCapable();
+        doReturn(true).when(mMockImsStateTracker).isImsRegisteredOverWlan();
+
+        DomainSelectionService.SelectionAttributes 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)
+                        .build();
+
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(mNormalCallDomainSelector.hasMessages(
+                NormalCallDomainSelector.MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
+        mNormalCallDomainSelector.onImsRegistrationStateChanged();
+        mNormalCallDomainSelector.onImsMmTelCapabilitiesChanged();
+        processAllMessages();
+
+        assertFalse(mNormalCallDomainSelector.hasMessages(
+                NormalCallDomainSelector.MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+        assertTrue(transportSelectorCallback.mWlanSelected);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+    }
+
+    @Test
+    public void testImsRegistrationStateTimeoutHandler() {
+        final TestTransportSelectorCallback transportSelectorCallback =
+                new TestTransportSelectorCallback(mNormalCallDomainSelector);
+
+        final ServiceState serviceState = new ServiceState();
+        serviceState.setState(ServiceState.STATE_IN_SERVICE);
+        mNormalCallDomainSelector.onServiceStateUpdated(serviceState);
+        doReturn(true).when(mMockImsStateTracker).isImsStateReady();
+        doReturn(false).when(mMockImsStateTracker).isImsRegistered();
+        doReturn(true).when(mMockImsStateTracker).isImsVoiceCapable();
+        doReturn(false).when(mMockImsStateTracker).isImsVideoCapable();
+        doReturn(true).when(mMockImsStateTracker).isImsRegisteredOverWlan();
+
+        DomainSelectionService.SelectionAttributes 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)
+                        .build();
+
+        mNormalCallDomainSelector.selectDomain(attributes, transportSelectorCallback);
+        assertTrue(mNormalCallDomainSelector.hasMessages(
+                NormalCallDomainSelector.MSG_WAIT_FOR_IMS_STATE_TIMEOUT));
+
+        mTestableLooper.moveTimeForward(
+                NormalCallDomainSelector.WAIT_FOR_IMS_STATE_TIMEOUT_MS + 10);
+        processAllMessages();
+
+        assertEquals(transportSelectorCallback.mSelectedDomain, NetworkRegistrationInfo.DOMAIN_CS);
+        assertEquals(NormalCallDomainSelector.SelectorState.INACTIVE,
+                mNormalCallDomainSelector.getSelectorState());
+    }
+
+    static class TestTransportSelectorCallback implements TransportSelectorCallback,
             WwanSelectorCallback {
         public boolean mCreated;
         public boolean mWlanSelected;
@@ -566,8 +755,9 @@
         int mSelectedDomain;
         NormalCallDomainSelector mNormalCallDomainSelector;
 
-        MockTransportSelectorCallback(NormalCallDomainSelector normalCallDomainSelector) {
+        TestTransportSelectorCallback(NormalCallDomainSelector normalCallDomainSelector) {
             mNormalCallDomainSelector = normalCallDomainSelector;
+            mCauseCode = DisconnectCause.NOT_VALID;
         }
 
         @Override
@@ -575,50 +765,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 +788,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,
@@ -667,18 +809,21 @@
             Log.i(TAG, "onDomainSelected - called");
             mSelectedDomain = domain;
             mDomainSelected = true;
+            mWwanSelected = 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;
         }
     }
 }
diff --git a/tests/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionServiceTest.java b/tests/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionServiceTest.java
index e0f7ffb..7031bf3 100644
--- a/tests/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/TelephonyDomainSelectionServiceTest.java
@@ -82,8 +82,7 @@
                         @NonNull Looper looper, @NonNull ImsStateTracker imsStateTracker,
                         @NonNull DomainSelectorBase.DestroyListener listener,
                         @NonNull CrossSimRedialingController crossSimRedialingController,
-                        @NonNull CarrierConfigHelper carrierConfigHelper,
-                        @NonNull EmergencyCallbackModeHelper ecbmHelper) {
+                        @NonNull DataConnectionStateHelper dataConnectionStateHelper) {
                     switch (selectorType) {
                         case DomainSelectionService.SELECTOR_TYPE_CALLING: // fallthrough
                         case DomainSelectionService.SELECTOR_TYPE_SMS:
@@ -105,9 +104,9 @@
         TestTelephonyDomainSelectionService(Context context,
                 @NonNull ImsStateTrackerFactory imsStateTrackerFactory,
                 @NonNull DomainSelectorFactory domainSelectorFactory,
-                @Nullable CarrierConfigHelper carrierConfigHelper,
-                @Nullable EmergencyCallbackModeHelper ecbmHelper) {
-            super(imsStateTrackerFactory, domainSelectorFactory, carrierConfigHelper, ecbmHelper);
+                @Nullable DataConnectionStateHelper dataConnectionStateHelper) {
+            super(imsStateTrackerFactory, domainSelectorFactory,
+                    dataConnectionStateHelper);
             mContext = context;
         }
 
@@ -131,8 +130,7 @@
     @Mock private TransportSelectorCallback mSelectorCallback1;
     @Mock private TransportSelectorCallback mSelectorCallback2;
     @Mock private ImsStateTracker mImsStateTracker;
-    @Mock private CarrierConfigHelper mCarrierConfigHelper;
-    @Mock private EmergencyCallbackModeHelper mEcbmHelper;
+    @Mock private DataConnectionStateHelper mDataConnectionStateHelper;
 
     private final ServiceState mServiceState = new ServiceState();
     private final BarringInfo mBarringInfo = new BarringInfo();
@@ -154,7 +152,8 @@
 
         mContext = new TestContext();
         mDomainSelectionService = new TestTelephonyDomainSelectionService(mContext,
-                mImsStateTrackerFactory, mDomainSelectorFactory, mCarrierConfigHelper, mEcbmHelper);
+                mImsStateTrackerFactory, mDomainSelectorFactory,
+                mDataConnectionStateHelper);
         mDomainSelectionService.onCreate();
         mServiceHandler = new Handler(mDomainSelectionService.getLooper());
         mTestableLooper = new TestableLooper(mDomainSelectionService.getLooper());
diff --git a/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java b/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java
index d575d77..4cabf95 100644
--- a/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java
+++ b/tests/src/com/android/services/telephony/rcs/TelephonyRcsServiceTest.java
@@ -39,6 +39,7 @@
 import com.android.ims.FeatureConnector;
 import com.android.ims.RcsFeatureManager;
 import com.android.internal.telephony.ISub;
+import com.android.internal.telephony.flags.FeatureFlags;
 
 import org.junit.After;
 import org.junit.Before;
@@ -68,6 +69,8 @@
     @Mock
     private TelephonyManager mTelephonyManager;
 
+    @Mock FeatureFlags mFeatureFlags;
+
     private RcsFeatureController mFeatureControllerSlot0;
     private RcsFeatureController mFeatureControllerSlot1;
 
@@ -91,9 +94,9 @@
         doReturn(mFeatureControllerSlot1).when(mFeatureFactory).createController(any(), eq(1),
                 anyInt());
         doReturn(mMockUceSlot0).when(mFeatureFactory).createUceControllerManager(any(), eq(0),
-                anyInt());
+                anyInt(), any());
         doReturn(mMockUceSlot1).when(mFeatureFactory).createUceControllerManager(any(), eq(1),
-                anyInt());
+                anyInt(), any());
         doReturn(mMockSipTransportSlot0).when(mFeatureFactory).createSipTransportController(any(),
                 eq(0), anyInt());
         doReturn(mMockSipTransportSlot1).when(mFeatureFactory).createSipTransportController(any(),
@@ -363,7 +366,8 @@
     }
 
     private TelephonyRcsService createRcsService(int numSlots) {
-        TelephonyRcsService service = new TelephonyRcsService(mContext, numSlots, mResourceProxy);
+        TelephonyRcsService service = new TelephonyRcsService(mContext, numSlots, mResourceProxy,
+                mFeatureFlags);
         service.setFeatureFactory(mFeatureFactory);
         service.initialize();
         verify(mContext).registerReceiver(mReceiverCaptor.capture(), any());
diff --git a/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java b/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
index 17decb9..e506931 100644
--- a/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
+++ b/tests/src/com/android/services/telephony/rcs/UceControllerManagerTest.java
@@ -35,6 +35,7 @@
 import com.android.TestExecutorService;
 import com.android.ims.RcsFeatureManager;
 import com.android.ims.rcs.uce.UceController;
+import com.android.internal.telephony.flags.FeatureFlags;
 
 import org.junit.After;
 import org.junit.Before;
@@ -52,6 +53,7 @@
 
     @Mock private UceController mUceController;
     @Mock private RcsFeatureManager mRcsFeatureManager;
+    @Mock private FeatureFlags mFeatureFlags;
 
     private final ExecutorService mExecutorService = new TestExecutorService();
 
@@ -260,7 +262,7 @@
 
     private UceControllerManager getUceControllerManager() {
         UceControllerManager manager = new UceControllerManager(mContext, mSlotId,
-                mExecutorService, mUceController);
+                mExecutorService, mUceController, mFeatureFlags);
         return manager;
     }
 }
diff --git a/utils/satellite/s2storage/src/readonly/java/com/android/telephony/sats2range/read/SuffixTableBlock.java b/utils/satellite/s2storage/src/readonly/java/com/android/telephony/sats2range/read/SuffixTableBlock.java
index 1a6fad7..90ddd89 100644
--- a/utils/satellite/s2storage/src/readonly/java/com/android/telephony/sats2range/read/SuffixTableBlock.java
+++ b/utils/satellite/s2storage/src/readonly/java/com/android/telephony/sats2range/read/SuffixTableBlock.java
@@ -100,7 +100,7 @@
         if (blockData.getSize() == 0) {
             throw new IllegalArgumentException("blockData=" + blockData + ", is zero length");
         }
-        IntValueTypedPackedTable packedTable = new IntValueTypedPackedTable(blockData);
+        IntValueTypedPackedTable packedTable = new IntValueTypedPackedTable(blockData, true);
         PopulatedSuffixTableBlock delegate = new PopulatedSuffixTableBlock(fileFormat, packedTable);
         return new SuffixTableBlock(fileFormat, delegate);
     }
diff --git a/utils/satellite/s2storage/src/testutils/java/com/android/telephony/sats2range/testutils/TestUtils.java b/utils/satellite/s2storage/src/testutils/java/com/android/telephony/sats2range/testutils/TestUtils.java
index 3cf2c78..3dfc720 100644
--- a/utils/satellite/s2storage/src/testutils/java/com/android/telephony/sats2range/testutils/TestUtils.java
+++ b/utils/satellite/s2storage/src/testutils/java/com/android/telephony/sats2range/testutils/TestUtils.java
@@ -107,22 +107,19 @@
         try (PrintStream printer = new PrintStream(outputFile)) {
             // Range 1
             for (int suffix = 1000; suffix < 2000; suffix++) {
-                printer.println(
-                        Long.toUnsignedString(fileFormat.createCellId(0b100_11111111, suffix)));
+                printer.println(fileFormat.createCellId(0b100_11111111, suffix));
             }
 
             // Range 2
             for (int suffix = 2001; suffix < 3000; suffix++) {
-                printer.println(
-                        Long.toUnsignedString(fileFormat.createCellId(0b100_11111111, suffix)));
+                printer.println(fileFormat.createCellId(0b100_11111111, suffix));
             }
 
             // Range 3
             for (int suffix = 1000; suffix < 2000; suffix++) {
-                printer.println(
-                        Long.toUnsignedString(fileFormat.createCellId(0b101_11111111, suffix)));
+                printer.println(fileFormat.createCellId(0b101_11111111, suffix));
             }
-            printer.print(Long.toUnsignedString(fileFormat.createCellId(0b101_11111111, 2000)));
+            printer.print(fileFormat.createCellId(0b101_11111111, 2000));
 
             printer.close();
         }
@@ -133,13 +130,13 @@
             File outputFile, SatS2RangeFileFormat fileFormat) throws Exception {
         try (PrintStream printer = new PrintStream(outputFile)) {
             // Valid line
-            printer.println(Long.toUnsignedString(fileFormat.createCellId(0b100_11111111, 100)));
+            printer.println(fileFormat.createCellId(0b100_11111111, 100));
 
             // Invalid line
             printer.print("Invalid line");
 
             // Another valid line
-            printer.println(Long.toUnsignedString(fileFormat.createCellId(0b100_11111111, 200)));
+            printer.println(fileFormat.createCellId(0b100_11111111, 200));
 
             printer.close();
         }
diff --git a/utils/satellite/s2storage/src/write/java/com/android/telephony/sats2range/write/SuffixTableWriter.java b/utils/satellite/s2storage/src/write/java/com/android/telephony/sats2range/write/SuffixTableWriter.java
index d9e4575..dc265d5 100644
--- a/utils/satellite/s2storage/src/write/java/com/android/telephony/sats2range/write/SuffixTableWriter.java
+++ b/utils/satellite/s2storage/src/write/java/com/android/telephony/sats2range/write/SuffixTableWriter.java
@@ -68,8 +68,8 @@
         byte[] blockSharedData = SuffixTableSharedDataWriter.toBytes(sharedData);
         FileOutputStream fileOutputStream = new FileOutputStream(mFile);
         boolean signedValue = false;
-        mPackedTableWriter = PackedTableWriter.create(
-                fileOutputStream, entrySizeByteCount, keySizeBits, signedValue, blockSharedData);
+        mPackedTableWriter = PackedTableWriter.create(fileOutputStream, entrySizeByteCount,
+                keySizeBits, signedValue, blockSharedData, true);
     }
 
     /** Returns a {@link BlockWriter} capable of generating the block data for an empty table. */
diff --git a/utils/satellite/tools/src/main/java/com/android/telephony/tools/sats2/SatS2FileCreator.java b/utils/satellite/tools/src/main/java/com/android/telephony/tools/sats2/SatS2FileCreator.java
index bc25d6b..dd7d8c0 100644
--- a/utils/satellite/tools/src/main/java/com/android/telephony/tools/sats2/SatS2FileCreator.java
+++ b/utils/satellite/tools/src/main/java/com/android/telephony/tools/sats2/SatS2FileCreator.java
@@ -42,8 +42,8 @@
 public final class SatS2FileCreator {
     /**
      * @param inputFile The input text file containing the list of S2 Cell IDs. Each line in the
-     *                  file contains a number in the range of an unsigned-64bit number which
-     *                  represents the ID of a S2 cell.
+     *                  file contains a number in the range of a 64-bit number which represents the
+     *                  ID of a S2 cell.
      * @param s2Level The S2 level of all S2 cells in the input file.
      * @param isAllowedList {@code true} means the input file contains an allowed list of S2 cells.
      *                      {@code false} means the input file contains a disallowed list of S2
@@ -133,7 +133,7 @@
      * Read a list of S2 cells from the inputFile.
      *
      * @param inputFile A file containing the list of S2 cells. Each line in the inputFile contains
-     *                  an unsigned long number - the ID of a S2 cell.
+     *                  a 64-bit number - the ID of a S2 cell.
      * @return A list of S2 cells.
      */
     private static List<Long> readS2CellsFromFile(String inputFile) throws Exception {
@@ -143,7 +143,7 @@
             while (scanner.hasNextLine()) {
                 String line = scanner.nextLine();
                 try {
-                    s2Cells.add(Long.parseUnsignedLong(line));
+                    s2Cells.add(Long.parseLong(line));
                 } catch (Exception ex) {
                     throw new IllegalStateException("Input s2 cell file has invalid format, "
                             + "current line=" + line);