Merge "Ensure the VoicemailSettingsActivity supports edge to edge." into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f1d877f..355f6ef 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -281,6 +281,16 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="com.android.phone.settings.SatelliteConfigViewer"
+            android:label="@string/satellite_config_viewer"
+            android:exported="true"
+            android:theme="@style/DialerSettingsLight">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="CdmaCallOptions"
                 android:label="@string/cdma_options"
                 android:exported="false"
diff --git a/OWNERS b/OWNERS
index 96033ab..dd12ee3 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,4 +2,4 @@
 
 per-file *SimPhonebookProvider* = file:platform/packages/apps/Contacts:/OWNERS
 
-per-file config.xml=hwangoo@google.com,forestchoi@google.com,avinashmp@google.com,mkoon@google.com,seheele@google.com,radhikaagrawal@google.com,jdyou@google.com
+per-file config.xml=hwangoo@google.com,avinashmp@google.com,mkoon@google.com,seheele@google.com,radhikaagrawal@google.com,jdyou@google.com
diff --git a/res/layout/radio_info.xml b/res/layout/radio_info.xml
index c4ab74f..9084891 100644
--- a/res/layout/radio_info.xml
+++ b/res/layout/radio_info.xml
@@ -333,6 +333,16 @@
                 android:text="@string/demo_esos_satellite_string"
         />
 
+        <!-- Satellite Config Viewer -->
+        <Button android:id="@+id/satellite_config_viewer"
+            android:textSize="14sp"
+            android:layout_marginTop="8dip"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAllCaps="false"
+            android:text="@string/satellite_config_viewer"
+            />
+
         <!-- VoLTE provisioned -->
         <Switch android:id="@+id/volte_provisioned_switch"
                 android:textSize="14sp"
diff --git a/res/layout/satellite_config_viewer.xml b/res/layout/satellite_config_viewer.xml
new file mode 100644
index 0000000..240e697
--- /dev/null
+++ b/res/layout/satellite_config_viewer.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2025 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginTop="120dp"
+    android:layoutDirection="locale"
+    android:textDirection="locale">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="16dp">
+
+        <!-- VERSION -->
+        <LinearLayout style="@style/RadioInfo_entry_layout">
+            <TextView android:text="@string/satellite_config_version_label" style="@style/info_label" />
+            <TextView android:id="@+id/version" style="@style/info_value" />
+            <View
+                android:layout_width="fill_parent"
+                android:layout_height="1dip"
+                android:background="?android:attr/listDivider"/>
+        </LinearLayout>
+
+        <View
+            android:layout_width="fill_parent"
+            android:layout_height="2dip"
+            android:background="?android:attr/listDivider" />
+
+        <!-- cids, plmns, svcTypes -->
+        <LinearLayout style="@style/RadioInfo_entry_layout">
+            <TextView android:text="@string/satellite_config_service_type_label" style="@style/info_label" />
+            <TextView android:id="@+id/svc_type" style="@style/info_value" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="fill_parent"
+            android:layout_height="3dip"
+            android:background="?android:attr/listDivider"/>
+
+        <!-- allow access -->
+        <LinearLayout style="@style/RadioInfo_entry_layout">
+            <TextView android:text="@string/satellite_config_allow_access_label" style="@style/info_label" />
+            <TextView android:id="@+id/allow_access" style="@style/info_value" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="fill_parent"
+            android:layout_height="4dip"
+            android:background="?android:attr/listDivider"/>
+
+        <!-- country codes -->
+        <LinearLayout style="@style/RadioInfo_entry_layout">
+            <TextView android:text="@string/satellite_config_country_code_label" style="@style/info_label" />
+            <TextView android:id="@+id/country_codes" style="@style/info_value" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="fill_parent"
+            android:layout_height="5dip"
+            android:background="?android:attr/listDivider"/>
+
+        <!-- size of sats2dat file -->
+        <LinearLayout style="@style/RadioInfo_entry_layout">
+            <TextView android:text="@string/satellite_config_size_of_sats2_dat_label" style="@style/info_label" />
+            <TextView android:id="@+id/size_of_sats2" style="@style/info_value" />
+        </LinearLayout>
+
+        <View
+            android:layout_width="fill_parent"
+            android:layout_height="1dip"
+            android:background="?android:attr/listDivider"/>
+
+        <!-- satellite access config json -->
+        <LinearLayout style="@style/entry_layout">
+            <TextView android:text="@string/satellite_config_json_label" style="@style/info_label" />
+            <TextView android:id="@+id/config_json" style="@style/info_value" />
+        </LinearLayout>
+
+    </LinearLayout>
+</ScrollView>
+
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index ccf0aa6..8d32f3a 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -485,7 +485,7 @@
     <string name="simContacts_emptyLoading" msgid="4989040293858675483">"Leyendo la tarjeta SIM..."</string>
     <string name="simContacts_empty" msgid="1135632055473689521">"No hay contactos en tu tarjeta SIM."</string>
     <string name="simContacts_title" msgid="2714029230160136647">"Seleccionar contactos para importar"</string>
-    <string name="simContacts_airplaneMode" msgid="4654884030631503808">"Desactivar el modo de avión para importar contactos de la tarjeta SIM"</string>
+    <string name="simContacts_airplaneMode" msgid="4654884030631503808">"Desactivar el modo avión para importar contactos de la tarjeta SIM"</string>
     <string name="enable_pin" msgid="967674051730845376">"Activar/desactivar PIN de tarjeta SIM"</string>
     <string name="change_pin" msgid="3657869530942905790">"Cambiar PIN de tarjeta SIM"</string>
     <string name="enter_pin_text" msgid="3182311451978663356">"PIN de tarjeta SIM:"</string>
@@ -537,9 +537,9 @@
     <string name="notification_voicemail_no_vm_number" msgid="3423686009815186750">"Número de buzón de voz desconocido"</string>
     <string name="notification_network_selection_title" msgid="255595526707809121">"Sin servicio"</string>
     <string name="notification_network_selection_text" msgid="553288408722427659">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible"</string>
-    <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activa la red móvil y desactiva el modo de avión o el modo de ahorro de batería para realizar una llamada."</string>
-    <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desactivar modo de avión para hacer una llamada"</string>
-    <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desactivar el modo de avión o conectarse a una red inalámbrica para hacer una llamada"</string>
+    <string name="incall_error_power_off" product="watch" msgid="7191184639454113633">"Activa la red móvil y desactiva el modo avión o el modo de ahorro de batería para realizar una llamada."</string>
+    <string name="incall_error_power_off" product="default" msgid="8131672264311208673">"Desactivar modo avión para hacer una llamada"</string>
+    <string name="incall_error_power_off_wfc" msgid="9125661184694727052">"Desactivar el modo avión o conectarse a una red inalámbrica para hacer una llamada"</string>
     <string name="incall_error_power_off_thermal" product="default" msgid="8695809601655300168"><b>"Se sobrecalentó el teléfono"</b>\n\n"No se puede completar esta llamada. Vuelve a intentar cuando se enfríe el teléfono.\n\nDe todos modos, puedes hacer llamadas de emergencia."</string>
     <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>
@@ -572,7 +572,7 @@
     <string name="emergency_call_shortcut_hint" msgid="1290485125107779500">"Vuelve a presionar para llamar al <xliff:g id="EMERGENCY_NUMBER">%s</xliff:g>"</string>
     <string name="emergency_enable_radio_dialog_message" msgid="1695305158151408629">"Encendiendo radio..."</string>
     <string name="emergency_enable_radio_dialog_retry" msgid="4329131876852608587">"No hay servicio. Vuelve a intentarlo."</string>
-    <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"No se puede entrar en modo de avión durante una llamada de emergencia."</string>
+    <string name="radio_off_during_emergency_call" msgid="8011154134040481609">"No se puede entrar en modo avión durante una llamada de emergencia."</string>
     <string name="dial_emergency_error" msgid="825822413209026039">"No se puede realizar la llamada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no es un número de emergencia."</string>
     <string name="dial_emergency_empty_error" msgid="2785803395047793634">"No se puede realizar la llamada. Marca un número de emergencia."</string>
     <string name="dial_emergency_calling_not_available" msgid="6485846193794727823">"Las llamadas de emergencia no están disponibles"</string>
@@ -717,7 +717,7 @@
     <string name="mobile_data_activate_button" msgid="1139792516354374612">"AGREGAR DATOS"</string>
     <string name="mobile_data_activate_cancel_button" msgid="3530174817572005860">"CANCELAR"</string>
     <string name="clh_card_title_call_ended_txt" msgid="5977978317527299698">"Llamada finalizada"</string>
-    <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"El modo de avión está activado"</string>
+    <string name="clh_callFailed_powerOff_txt" msgid="8279934912560765361">"El modo avión está activado"</string>
     <string name="clh_callFailed_simError_txt" msgid="5128538525762326413">"No se puede acceder a la tarjeta SIM"</string>
     <string name="clh_incall_error_out_of_service_txt" msgid="2736010617446749869">"Red móvil no disponible"</string>
     <string name="clh_callFailed_satelliteEnabled_txt" msgid="1675517238240377396">"El modo satelital está activado"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 49485ae..7f11fd1 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -85,7 +85,7 @@
     <string name="smart_forwarding_settings_menu_summary" msgid="5096947726032885325">"Cuando no se puede contactar con un número, las llamadas se desvían siempre a otro número"</string>
     <string name="voicemail_notifications_preference_title" msgid="7829238858063382977">"Notificaciones"</string>
     <string name="cell_broadcast_settings" msgid="8135324242541809924">"Difusiones de emergencia"</string>
-    <string name="call_settings" msgid="3677282690157603818">"Ajustes de llamadas"</string>
+    <string name="call_settings" msgid="3677282690157603818">"Ajustes de llamada"</string>
     <string name="additional_gsm_call_settings" msgid="1561980168685658846">"Ajustes adicionales"</string>
     <string name="additional_gsm_call_settings_with_label" msgid="7973920539979524908">"Ajustes adicionales (<xliff:g id="SUBSCRIPTIONLABEL">%s</xliff:g>)"</string>
     <string name="sum_gsm_call_settings" msgid="7964692601608878138">"Ajustes adicionales de llamadas solo GSM"</string>
@@ -131,7 +131,7 @@
     <string name="disable_cdma_cw" msgid="7119290446496301734">"Cancelar"</string>
     <string name="cdma_call_waiting_in_ims_on" msgid="6390979414188659218">"Llamada en espera de CDMA en IMS activada"</string>
     <string name="cdma_call_waiting_in_ims_off" msgid="1099246114368636334">"Llamada en espera de CDMA en IMS desactivada"</string>
-    <string name="updating_title" msgid="6130548922615719689">"Ajustes de llamadas"</string>
+    <string name="updating_title" msgid="6130548922615719689">"Ajustes de llamada"</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>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3e45f96..c0beb0e 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -867,7 +867,7 @@
     <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS 등록: <xliff:g id="STATUS">%1$s</xliff:g>\nVoLTE: <xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nVoWi-Fi: <xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\n화상 통화: <xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT 인터페이스: <xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
     <string name="radioInfo_service_in" msgid="45753418231446400">"서비스 중"</string>
     <string name="radioInfo_service_out" msgid="287972405416142312">"서비스 지역 벗어남"</string>
-    <string name="radioInfo_service_emergency" msgid="4763879891415016848">"긴급 통화만 허용"</string>
+    <string name="radioInfo_service_emergency" msgid="4763879891415016848">"긴급 전화만 허용"</string>
     <string name="radioInfo_service_off" msgid="3456583511226783064">"무선 연결 끊김"</string>
     <string name="radioInfo_roaming_in" msgid="3156335577793145965">"로밍"</string>
     <string name="radioInfo_roaming_not" msgid="1904547918725478110">"로밍 안함"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 8df54cd..6b4e17c 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -867,7 +867,7 @@
     <string name="radio_info_ims_reg_status" msgid="25582845222446390">"IMS 注册:<xliff:g id="STATUS">%1$s</xliff:g>\nLTE 语音通话:<xliff:g id="AVAILABILITY_0">%2$s</xliff:g>\nWLAN 语音通话:<xliff:g id="AVAILABILITY_1">%3$s</xliff:g>\n视频通话:<xliff:g id="AVAILABILITY_2">%4$s</xliff:g>\nUT 接口:<xliff:g id="AVAILABILITY_3">%5$s</xliff:g>"</string>
     <string name="radioInfo_service_in" msgid="45753418231446400">"服务中"</string>
     <string name="radioInfo_service_out" msgid="287972405416142312">"不在服务区"</string>
-    <string name="radioInfo_service_emergency" msgid="4763879891415016848">"只能拨打紧急呼叫电话"</string>
+    <string name="radioInfo_service_emergency" msgid="4763879891415016848">"只能拨打紧急求助电话"</string>
     <string name="radioInfo_service_off" msgid="3456583511226783064">"关闭无线装置"</string>
     <string name="radioInfo_roaming_in" msgid="3156335577793145965">"漫游"</string>
     <string name="radioInfo_roaming_not" msgid="1904547918725478110">"未使用漫游服务"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index d20aa6d..8385490 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -303,7 +303,7 @@
     <string name="data_usage_template" msgid="6287906680674061783">"<xliff:g id="ID_2">%2$s</xliff:g>期間使用了 <xliff:g id="ID_1">%1$s</xliff:g> 的行動數據"</string>
     <string name="advanced_options_title" msgid="9208195294513520934">"進階"</string>
     <string name="carrier_settings_euicc" msgid="1190237227261337749">"電信業者"</string>
-    <string name="keywords_carrier_settings_euicc" msgid="8540160967922063745">"電信業者, eSIM 卡, SIM 卡, eUICC, 切換電信業者, 新增電信業者"</string>
+    <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>
@@ -843,7 +843,7 @@
     <string name="dsds_dialog_message" msgid="4047480385678538850">"你必須重新啟動裝置,才能變更這項設定。"</string>
     <string name="dsds_dialog_confirm" msgid="9032004888134129885">"重新啟動"</string>
     <string name="dsds_dialog_cancel" msgid="3245958947099586655">"取消"</string>
-    <string name="removable_esim_string" msgid="7931369811671787649">"將可移除的 eSIM 卡設為預設 eSIM 卡"</string>
+    <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="enforce_satellite_channel_string" msgid="295306734591329892">"強制執行 Camp 衛星 LTE 頻道 (僅限偵錯版本)"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 06e81b2..41c98e3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2249,4 +2249,21 @@
     <string name="send_from_work_profile_action_str">Switch to work profile</string>
     <string name="install_messages_on_work_profile_action_str">Install a work messages app</string>
 
+    <!-- The title of option menu from phoneInfo test screen, to show satellite config -->
+    <string name="radio_info_data_view_satellite_config">Show Satellite Config</string>
+    <!-- Title of SatelliteConfigViewer screen -->
+    <string name="satellite_config_viewer">Satellite Config Viewer</string>
+    <!-- Satellite config viewer screen. Label for the config data version -->
+    <string name="satellite_config_version_label">version: </string>
+    <!-- Satellite config viewer screen. Label for the subId/plmn/servicetype -->
+    <string name="satellite_config_service_type_label">subId/plmn/servicetype: </string>
+    <!-- Satellite config viewer screen. Label for the allow access -->
+    <string name="satellite_config_allow_access_label">allow_access: </string>
+    <!-- Satellite config viewer screen. Label for the country codes -->
+    <string name="satellite_config_country_code_label">country codes: </string>
+    <!-- Satellite config viewer screen. Label for size of the s2sat.dat file -->
+    <string name="satellite_config_size_of_sats2_dat_label">size of sats2.dat: </string>
+    <!-- Satellite config viewer screen. satellite access config json file -->
+    <string name="satellite_config_json_label">satellite access config json: </string>
+
 </resources>
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 5f3fc97..26ff9c7 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -141,6 +141,9 @@
     @NonNull private boolean[] mHasSentConfigChange;
     // Whether the broadcast was sent from EVENT_SYSTEM_UNLOCKED, to track rebroadcasts
     @NonNull private boolean[] mFromSystemUnlocked;
+    // Whether this carrier config loading needs to trigger
+    // TelephonyRegistryManager.notifyCarrierConfigChanged
+    @NonNull private boolean[] mNeedNotifyCallback;
     // CarrierService change monitoring
     @NonNull private CarrierServiceChangeCallback[] mCarrierServiceChangeCallbacks;
 
@@ -257,6 +260,7 @@
             }
             switch (msg.what) {
                 case EVENT_CLEAR_CONFIG: {
+                    mNeedNotifyCallback[phoneId] = true;
                     clearConfigForPhone(phoneId, true);
                     break;
                 }
@@ -268,8 +272,10 @@
                         // trying to load the carrier config when the SIM is still loading when the
                         // unlock happens.
                         if (mHasSentConfigChange[i]) {
-                            logdWithLocalLog("System unlocked");
+                            logl("System unlocked");
                             mFromSystemUnlocked[i] = true;
+                            // Do not add mNeedNotifyCallback[phoneId] = true here. We intentionally
+                            // do not want to notify callback when system unlock happens.
                             updateConfigForPhoneId(i);
                         }
                     }
@@ -281,8 +287,9 @@
                     // Always clear up the cache and re-load config from scratch since the carrier
                     // service change is reliable and specific to the phoneId now.
                     clearCachedConfigForPackage(carrierPackageName);
-                    logdWithLocalLog("Package changed: " + carrierPackageName
+                    logl("Package changed: " + carrierPackageName
                             + ", phone=" + phoneId);
+                    mNeedNotifyCallback[phoneId] = true;
                     updateConfigForPhoneId(phoneId);
                     break;
                 }
@@ -375,7 +382,7 @@
                         ICarrierService carrierService =
                                 ICarrierService.Stub.asInterface(conn.service);
                         carrierService.getCarrierConfig(phoneId, carrierId, resultReceiver);
-                        logdWithLocalLog("Fetch config for default app: "
+                        logl("Fetch config for default app: "
                                 + mPlatformCarrierConfigPackage
                                 + ", carrierId=" + carrierId.getSpecificCarrierId());
                     } catch (RemoteException e) {
@@ -494,7 +501,7 @@
                                     if (config != null) {
                                         mConfigFromCarrierApp[phoneId] = config;
                                     } else {
-                                        logdWithLocalLog("Config from carrier app is null "
+                                        logl("Config from carrier app is null "
                                                 + "for phoneId " + phoneId);
                                         // Put a stub bundle in place so that the rest of the logic
                                         // continues smoothly.
@@ -510,7 +517,7 @@
                         ICarrierService carrierService =
                                 ICarrierService.Stub.asInterface(conn.service);
                         carrierService.getCarrierConfig(phoneId, carrierId, resultReceiver);
-                        logdWithLocalLog("Fetch config for carrier app: "
+                        logl("Fetch config for carrier app: "
                                 + getCarrierPackageForPhoneId(phoneId)
                                 + ", carrierId=" + carrierId.getSpecificCarrierId());
                     } catch (RemoteException e) {
@@ -676,7 +683,7 @@
                         ICarrierService carrierService =
                                 ICarrierService.Stub.asInterface(conn.service);
                         carrierService.getCarrierConfig(phoneId, null, resultReceiver);
-                        logdWithLocalLog("Fetch no sim config from default app: "
+                        logl("Fetch no sim config from default app: "
                                 + mPlatformCarrierConfigPackage);
                     } catch (RemoteException e) {
                         loge("Failed to get no sim carrier config from default app: " +
@@ -728,6 +735,7 @@
         mServiceBound = new boolean[mNumPhones];
         mHasSentConfigChange = new boolean[mNumPhones];
         mFromSystemUnlocked = new boolean[mNumPhones];
+        mNeedNotifyCallback = new boolean[mNumPhones];
         mServiceConnectionForNoSimConfig = new CarrierServiceConnection[mNumPhones];
         mServiceBoundForNoSimConfig = new boolean[mNumPhones];
         mCarrierServiceChangeCallbacks = new CarrierServiceChangeCallback[mNumPhones];
@@ -866,16 +874,21 @@
         TelephonyRegistryManager trm = mContext.getSystemService(TelephonyRegistryManager.class);
         // Unlike broadcast, we wouldn't notify registrants on carrier config change when device is
         // unlocked. Only real carrier config change will send the notification to registrants.
-        if (trm != null && !mFromSystemUnlocked[phoneId]) {
+        if (trm != null && (mFeatureFlags.carrierConfigChangedCallbackFix()
+                ? mNeedNotifyCallback[phoneId] : !mFromSystemUnlocked[phoneId])) {
+            logl("Notify carrier config changed callback for phone " + phoneId);
             trm.notifyCarrierConfigChanged(phoneId, subId, carrierId, specificCarrierId);
+            mNeedNotifyCallback[phoneId] = false;
+        } else {
+            logl("Skipped notifying carrier config changed callback for phone " + phoneId);
         }
 
         mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
 
         if (SubscriptionManager.isValidSubscriptionId(subId)) {
-            logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId + ", subId=" + subId);
+            logl("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId + ", subId=" + subId);
         } else {
-            logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId);
+            logl("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId);
         }
         mHasSentConfigChange[phoneId] = true;
         mFromSystemUnlocked[phoneId] = false;
@@ -896,7 +909,7 @@
 
     /** Binds to the default or carrier config app. */
     private boolean bindToConfigPackage(@NonNull String pkgName, int phoneId, int eventId) {
-        logdWithLocalLog("Binding to " + pkgName + " for phone " + phoneId);
+        logl("Binding to " + pkgName + " for phone " + phoneId);
         Intent carrierService = new Intent(CarrierService.CARRIER_SERVICE_INTERFACE);
         carrierService.setPackage(pkgName);
         CarrierServiceConnection serviceConnection =  new CarrierServiceConnection(
@@ -1071,7 +1084,7 @@
             return;
         }
 
-        logdWithLocalLog("Save carrier config to cache. phoneId=" + phoneId
+        logl("Save carrier config to cache. phoneId=" + phoneId
                         + ", xml=" + getFilePathForLogging(fileName) + ", version=" + version);
 
         FileOutputStream outFile = null;
@@ -1175,7 +1188,7 @@
         }
 
         if (restoredBundle != null) {
-            logdWithLocalLog("Restored carrier config from cache. phoneId=" + phoneId + ", xml="
+            logl("Restored carrier config from cache. phoneId=" + phoneId + ", xml="
                     + getFilePathForLogging(fileName) + ", version=" + savedVersion
                     + ", modified time=" + getFileTime(filePath));
         }
@@ -1232,7 +1245,7 @@
         });
         if (packageFiles == null || packageFiles.length < 1) return false;
         for (File f : packageFiles) {
-            logdWithLocalLog("Deleting " + getFilePathForLogging(f.getName()));
+            logl("Deleting " + getFilePathForLogging(f.getName()));
             f.delete();
         }
         return true;
@@ -1299,7 +1312,7 @@
         if (mNumPhones == oldNumPhones) {
             return;
         }
-        logdWithLocalLog("mNumPhones change from " + oldNumPhones + " to " + mNumPhones);
+        logl("mNumPhones change from " + oldNumPhones + " to " + mNumPhones);
 
         // If DS -> SS switch, release the resources BEFORE truncating the arrays to avoid leaking
         for (int phoneId = mNumPhones; phoneId < oldNumPhones; phoneId++) {
@@ -1332,10 +1345,12 @@
         mServiceBoundForNoSimConfig = Arrays.copyOf(mServiceBoundForNoSimConfig, mNumPhones);
         mHasSentConfigChange = Arrays.copyOf(mHasSentConfigChange, mNumPhones);
         mFromSystemUnlocked = Arrays.copyOf(mFromSystemUnlocked, mNumPhones);
+        mNeedNotifyCallback = Arrays.copyOf(mNeedNotifyCallback, mNumPhones);
         mCarrierServiceChangeCallbacks = Arrays.copyOf(mCarrierServiceChangeCallbacks, mNumPhones);
 
         // Load the config for all the phones and re-register callback AFTER padding the arrays.
         for (int phoneId = 0; phoneId < mNumPhones; phoneId++) {
+            mNeedNotifyCallback[phoneId] = true;
             updateConfigForPhoneId(phoneId);
             mCarrierServiceChangeCallbacks[phoneId] = new CarrierServiceChangeCallback(phoneId);
             TelephonyManager.from(mContext).registerCarrierPrivilegesCallback(phoneId,
@@ -1464,6 +1479,7 @@
 
         // Post to run on handler thread on which all states should be confined.
         mHandler.post(() -> {
+            mNeedNotifyCallback[phoneId] = true;
             overrideConfig(mOverrideConfigs, phoneId, overrides);
 
             if (persistent) {
@@ -1483,7 +1499,7 @@
                     fileToDelete.delete();
                 }
             }
-            logdWithLocalLog("overrideConfig: subId=" + subscriptionId + ", persistent="
+            logl("overrideConfig: subId=" + subscriptionId + ", persistent="
                     + persistent + ", overrides=" + overrides);
             updateSubscriptionDatabase(phoneId);
         });
@@ -1520,7 +1536,7 @@
         enforceTelephonyFeatureWithException(getCurrentPackageName(),
                 "notifyConfigChangedForSubId");
 
-        logdWithLocalLog("Notified carrier config changed. phoneId=" + phoneId
+        logl("Notified carrier config changed. phoneId=" + phoneId
                 + ", subId=" + subscriptionId);
 
         // This method should block until deleting has completed, so that an error which prevents us
@@ -1529,6 +1545,7 @@
         String callingPackageName = mContext.getPackageManager().getNameForUid(
                 Binder.getCallingUid());
         clearCachedConfigForPackage(callingPackageName);
+        mNeedNotifyCallback[phoneId] = true;
         updateConfigForPhoneId(phoneId);
     }
 
@@ -1536,7 +1553,7 @@
     @Override
     public void updateConfigForPhoneId(int phoneId, @NonNull String simState) {
         updateConfigForPhoneId_enforcePermission();
-        logdWithLocalLog("Update config for phoneId=" + phoneId + " simState=" + simState);
+        logl("Update config for phoneId=" + phoneId + " simState=" + simState);
         if (!SubscriptionManager.isValidPhoneId(phoneId)) {
             throw new IllegalArgumentException("Invalid phoneId: " + phoneId);
         }
@@ -1554,6 +1571,7 @@
                 break;
             case IccCardConstants.INTENT_VALUE_ICC_LOADED:
             case IccCardConstants.INTENT_VALUE_ICC_LOCKED:
+                mNeedNotifyCallback[phoneId] = true;
                 updateConfigForPhoneId(phoneId);
                 break;
         }
@@ -1703,6 +1721,7 @@
                 + Arrays.toString(mServiceBoundForNoSimConfig));
         indentPW.println("mHasSentConfigChange=" + Arrays.toString(mHasSentConfigChange));
         indentPW.println("mFromSystemUnlocked=" + Arrays.toString(mFromSystemUnlocked));
+        indentPW.println("mNeedNotifyCallback=" + Arrays.toString(mNeedNotifyCallback));
         indentPW.println();
         indentPW.println("CarrierConfigLoader local log=");
         indentPW.increaseIndent();
@@ -1909,8 +1928,7 @@
             return;
         }
 
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
                 Binder.getCallingUserHandle())
                 || mVendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
             // Skip to check associated telephony feature,
@@ -2067,7 +2085,7 @@
         Log.d(LOG_TAG, msg, tr);
     }
 
-    private void logdWithLocalLog(@NonNull String msg) {
+    private void logl(@NonNull String msg) {
         Log.d(LOG_TAG, msg);
         mCarrierConfigLoadingLog.log(msg);
     }
diff --git a/src/com/android/phone/ImsRcsController.java b/src/com/android/phone/ImsRcsController.java
index e2ae343..65ca6f5 100644
--- a/src/com/android/phone/ImsRcsController.java
+++ b/src/com/android/phone/ImsRcsController.java
@@ -1009,8 +1009,7 @@
             return;
         }
 
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
                 Binder.getCallingUserHandle())
                 || mVendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
             // Skip to check associated telephony feature,
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 1139850..4fe2d24 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -843,11 +843,6 @@
      * @param subId The subscription ID
      */
     void updateNetworkSelection(int serviceState, int subId) {
-        if (!mFeatureFlags.dismissNetworkSelectionNotificationOnSimDisable()) {
-            updateNetworkSelectionForFeatureDisabled(serviceState, subId);
-            return;
-        }
-
         // for dismissNetworkSelectionNotificationOnSimDisable feature enabled.
         int phoneId = SubscriptionManager.getPhoneId(subId);
         Phone phone = SubscriptionManager.isValidPhoneId(phoneId) ?
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 17d3392..df6b766 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -17,7 +17,6 @@
 package com.android.phone;
 
 import android.annotation.IntDef;
-import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.KeyguardManager;
 import android.app.ProgressDialog;
@@ -443,19 +442,11 @@
                     //TODO: handle message here;
                     break;
                 case EVENT_DATA_ROAMING_SETTINGS_CHANGED:
-                    if (mFeatureFlags.reorganizeRoamingNotification()) {
-                        updateDataRoamingStatus(
-                                ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED);
-                    } else {
-                        updateDataRoamingStatusForFeatureDisabled(null);
-                    }
+                    updateDataRoamingStatus(
+                            ROAMING_NOTIFICATION_REASON_DATA_ROAMING_SETTING_CHANGED);
                     break;
                 case EVENT_MOBILE_DATA_SETTINGS_CHANGED:
-                    if (mFeatureFlags.reorganizeRoamingNotification()) {
-                        updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED);
-                    } else {
-                        updateDataRoamingStatusForFeatureDisabled(null);
-                    }
+                    updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_DATA_SETTING_CHANGED);
                     break;
                 case EVENT_CARRIER_CONFIG_CHANGED:
                     int subId = (Integer) msg.obj;
@@ -510,11 +501,7 @@
     public PhoneGlobals(Context context) {
         super(context);
         sMe = this;
-        if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()) {
-            if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
-                mSettingsObserver = new SettingsObserver(context, mHandler);
-            }
-        } else {
+        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
             mSettingsObserver = new SettingsObserver(context, mHandler);
         }
     }
@@ -524,9 +511,8 @@
 
         ContentResolver resolver = getContentResolver();
 
-        if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                && !getResources().getBoolean(
-                    com.android.internal.R.bool.config_force_phone_globals_creation)) {
+        if (!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;
@@ -896,11 +882,7 @@
     /** Clear fields on power off radio **/
     private void clearCacheOnRadioOff() {
         // Re-show is-roaming notifications after APM mode
-        if (mFeatureFlags.reorganizeRoamingNotification()) {
-            mShownNotificationReasons.clear();
-        } else {
-            mPrevRoamingOperatorNumerics.clear();
-        }
+        mShownNotificationReasons.clear();
     }
 
     private void setRadioPowerOn() {
@@ -997,11 +979,7 @@
             } else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
                 // Roaming status could be overridden by carrier config, so we need to update it.
                 if (VDBG) Log.v(LOG_TAG, "carrier config changed.");
-                if (mFeatureFlags.reorganizeRoamingNotification()) {
-                    updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED);
-                } else {
-                    updateDataRoamingStatusForFeatureDisabled(null);
-                }
+                updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_CARRIER_CONFIG_CHANGED);
                 updateLimitedSimFunctionForDualSim();
                 int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,
                         SubscriptionManager.INVALID_SUBSCRIPTION_ID);
@@ -1016,12 +994,8 @@
                 registerSettingsObserver();
                 Phone phone = getPhone(mDefaultDataSubId);
                 if (phone != null) {
-                    if (mFeatureFlags.reorganizeRoamingNotification()) {
-                        updateDataRoamingStatus(
-                                ROAMING_NOTIFICATION_REASON_DEFAULT_DATA_SUBS_CHANGED);
-                    } else {
-                        updateDataRoamingStatusForFeatureDisabled(null);
-                    }
+                    updateDataRoamingStatus(
+                            ROAMING_NOTIFICATION_REASON_DEFAULT_DATA_SUBS_CHANGED);
                 }
             }
         }
@@ -1037,11 +1011,7 @@
                     + mDefaultDataSubId + ", ss roaming=" + serviceState.getDataRoaming());
         }
         if (subId == mDefaultDataSubId) {
-            if (mFeatureFlags.reorganizeRoamingNotification()) {
-                updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED);
-            } else {
-                updateDataRoamingStatusForFeatureDisabled(serviceState.getOperatorNumeric());
-            }
+            updateDataRoamingStatus(ROAMING_NOTIFICATION_REASON_SERVICE_STATE_CHANGED);
         }
     }
 
@@ -1067,26 +1037,24 @@
         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");
-            }
+        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);
@@ -1229,88 +1197,6 @@
         return mCurrentRoamingNotification;
     }
 
-    // For reorganize_roaming_notification feature disabled.
-    /**
-     * 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 roamingOperatorNumeric The operator numeric for the current roaming. {@code null} if
-     *                               the current roaming operator numeric didn't change.
-     */
-    private void updateDataRoamingStatusForFeatureDisabled(
-            @Nullable String roamingOperatorNumeric) {
-        if (VDBG) Log.v(LOG_TAG, "updateDataRoamingStatusForFeatureDisabled");
-        Phone phone = getPhone(mDefaultDataSubId);
-        if (phone == null) {
-            Log.w(LOG_TAG, "Can't get phone with sub id = " + mDefaultDataSubId);
-            return;
-        }
-
-        boolean dataAllowed;
-        boolean notAllowedDueToRoamingOff;
-        List<DataDisallowedReason> reasons = phone.getDataNetworkController()
-                .getInternetDataDisallowedReasons();
-        dataAllowed = reasons.isEmpty();
-        notAllowedDueToRoamingOff = (reasons.size() == 1
-                && reasons.contains(DataDisallowedReason.ROAMING_DISABLED));
-        mDataRoamingNotifLog.log("dataAllowed=" + dataAllowed + ", reasons=" + reasons
-                + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
-        if (VDBG) {
-            Log.v(LOG_TAG, "dataAllowed=" + dataAllowed + ", reasons=" + reasons
-                    + ", roamingOperatorNumeric=" + roamingOperatorNumeric);
-        }
-
-        if (!dataAllowed && notAllowedDueToRoamingOff) {
-            // Don't show roaming notification if we've already shown for this MccMnc
-            if (roamingOperatorNumeric != null
-                    && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
-                Log.d(LOG_TAG, "Skip roaming disconnected notification since already shown in "
-                        + "MccMnc " + roamingOperatorNumeric);
-                return;
-            }
-            // No need to show it again if we never cancelled it explicitly.
-            if (mPrevRoamingNotification == ROAMING_NOTIFICATION_DISCONNECTED) return;
-            // If the only reason of no data is data roaming disabled, then we notify the user
-            // so the user can turn on data roaming.
-            mPrevRoamingNotification = ROAMING_NOTIFICATION_DISCONNECTED;
-            Log.d(LOG_TAG, "Show roaming disconnected notification");
-            mDataRoamingNotifLog.log("Show roaming off.");
-            Message msg = mHandler.obtainMessage(EVENT_DATA_ROAMING_DISCONNECTED);
-            msg.arg1 = mDefaultDataSubId;
-            msg.sendToTarget();
-        } else if (dataAllowed && dataIsNowRoaming(mDefaultDataSubId)) {
-            if (!shouldShowRoamingNotification(roamingOperatorNumeric != null
-                        ? roamingOperatorNumeric : phone.getServiceState().getOperatorNumeric())) {
-                Log.d(LOG_TAG, "Skip showing roaming connected notification.");
-                return;
-            }
-            // Don't show roaming notification if we've already shown for this MccMnc
-            if (roamingOperatorNumeric != null
-                    && !mPrevRoamingOperatorNumerics.add(roamingOperatorNumeric)) {
-                Log.d(LOG_TAG, "Skip roaming connected notification since already shown in "
-                        + "MccMnc " + roamingOperatorNumeric);
-                return;
-            }
-            // No need to show it again if we never cancelled it explicitly, or carrier config
-            // indicates this is not needed.
-            if (mPrevRoamingNotification == ROAMING_NOTIFICATION_CONNECTED) return;
-            mPrevRoamingNotification = ROAMING_NOTIFICATION_CONNECTED;
-            Log.d(LOG_TAG, "Show roaming connected notification");
-            mDataRoamingNotifLog.log("Show roaming on.");
-            Message msg = mHandler.obtainMessage(EVENT_DATA_ROAMING_CONNECTED);
-            msg.arg1 = mDefaultDataSubId;
-            msg.sendToTarget();
-        } else if (mPrevRoamingNotification != ROAMING_NOTIFICATION_NO_NOTIFICATION) {
-            // Otherwise we either 1) we are not roaming or 2) roaming is off but ROAMING_DISABLED
-            // is not the only data disable reason. In this case we dismiss the notification we
-            // showed earlier.
-            mPrevRoamingNotification = ROAMING_NOTIFICATION_NO_NOTIFICATION;
-            Log.d(LOG_TAG, "Dismiss roaming notification");
-            mDataRoamingNotifLog.log("Hide. data allowed=" + dataAllowed);
-            mHandler.sendEmptyMessage(EVENT_DATA_ROAMING_OK);
-        }
-    }
-
     /**
      *
      * @param subId to check roaming on
@@ -1448,16 +1334,8 @@
         pw.increaseIndent();
         pw.println("FeatureFlags:");
         pw.increaseIndent();
-        pw.println("reorganizeRoamingNotification="
-                + mFeatureFlags.reorganizeRoamingNotification());
-        pw.println("dismissNetworkSelectionNotificationOnSimDisable="
-                + mFeatureFlags.dismissNetworkSelectionNotificationOnSimDisable());
         pw.decreaseIndent();
-        if (mFeatureFlags.reorganizeRoamingNotification()) {
-            pw.println("mCurrentRoamingNotification=" + mCurrentRoamingNotification);
-        } else {
-            pw.println("mPrevRoamingNotification=" + mPrevRoamingNotification);
-        }
+        pw.println("mCurrentRoamingNotification=" + mCurrentRoamingNotification);
         pw.println("mDefaultDataSubId=" + mDefaultDataSubId);
         pw.println("isSmsCapable=" + TelephonyManager.from(this).isSmsCapable());
         pw.println("mDataRoamingNotifLog:");
@@ -1495,11 +1373,7 @@
         }
         pw.decreaseIndent();
         pw.decreaseIndent();
-        if (mFeatureFlags.reorganizeRoamingNotification()) {
-            pw.println("mShownNotificationReasons=" + mShownNotificationReasons);
-        } else {
-            pw.println("mPrevRoamingOperatorNumerics:" + mPrevRoamingOperatorNumerics);
-        }
+        pw.println("mShownNotificationReasons=" + mShownNotificationReasons);
         pw.println("------- End PhoneGlobals -------");
     }
 
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 0548aa5..f4b2545 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -8446,10 +8446,8 @@
     public boolean isRttEnabled(int subscriptionId) {
         final long identity = Binder.clearCallingIdentity();
         try {
-            if (mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()) {
-                if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS)) {
-                    return false;
-                }
+            if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_IMS)) {
+                return false;
             }
 
             boolean isRttSupported = isRttSupported(subscriptionId);
@@ -11265,8 +11263,7 @@
             throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
         }
 
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
                 Binder.getCallingUserHandle())) {
             if (!isImsAvailableOnDevice()) {
                 // ProvisioningManager can not handle ServiceSpecificException.
@@ -11870,8 +11867,7 @@
         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
             throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
         }
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
                 Binder.getCallingUserHandle())) {
             if (!isImsAvailableOnDevice()) {
                 throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
@@ -11909,8 +11905,7 @@
             throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
         }
 
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
                 Binder.getCallingUserHandle())) {
             if (!isImsAvailableOnDevice()) {
                 // operation failed silently
@@ -11943,8 +11938,7 @@
         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
             throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
         }
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
                 Binder.getCallingUserHandle())) {
             if (!isImsAvailableOnDevice()) {
                 // ProvisioningManager can not handle ServiceSpecificException.
@@ -11975,8 +11969,7 @@
         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
             throw new IllegalArgumentException("Invalid Subscription ID: " + subId);
         }
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, getCurrentPackageName(),
                 Binder.getCallingUserHandle())) {
             if (!isImsAvailableOnDevice()) {
                 throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
@@ -14750,8 +14743,7 @@
             return;
         }
 
-        if (!mFeatureFlags.enforceTelephonyFeatureMappingForPublicApis()
-                || !CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
+        if (!CompatChanges.isChangeEnabled(ENABLE_FEATURE_MAPPING, callingPackage,
                 Binder.getCallingUserHandle())
                 || mVendorApiLevel < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
             // Skip to check associated telephony feature,
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java
index ad0926b..b22fb64 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessConfigurationParser.java
@@ -26,8 +26,6 @@
 import android.telephony.satellite.SatellitePosition;
 import android.util.Log;
 
-import com.android.internal.annotations.VisibleForTesting;
-
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -302,7 +300,6 @@
      * @return json string type json contents
      */
     @Nullable
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
     public static String readJsonStringFromFile(@NonNull String jsonFilePath) {
         logd("jsonFilePath is " + jsonFilePath);
         String json = null;
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index c8a8475..aaba0f7 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -60,6 +60,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.CancellationSignal;
+import android.os.FileUtils;
 import android.os.Handler;
 import android.os.HandlerExecutor;
 import android.os.HandlerThread;
@@ -75,7 +76,6 @@
 import android.telecom.TelecomManager;
 import android.telephony.AnomalyReporter;
 import android.telephony.CarrierConfigManager;
-import android.telephony.DropBoxManagerLoggerBackend;
 import android.telephony.NetworkRegistrationInfo;
 import android.telephony.PersistentLogger;
 import android.telephony.Rlog;
@@ -106,6 +106,7 @@
 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.SatelliteServiceUtils;
 import com.android.internal.telephony.satellite.metrics.AccessControllerMetricsStats;
 import com.android.internal.telephony.satellite.metrics.ConfigUpdaterMetricsStats;
 import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
@@ -497,10 +498,7 @@
             @Nullable File s2CellFile) {
         super(looper);
         mContext = context;
-        if (isSatellitePersistentLoggingEnabled(context, featureFlags)) {
-            mPersistentLogger = new PersistentLogger(
-                    DropBoxManagerLoggerBackend.getInstance(context));
-        }
+        mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context);
         mFeatureFlags = featureFlags;
         mLocationManager = locationManager;
         mTelecomManager = telecomManager;
@@ -623,7 +621,6 @@
                         + satelliteSubscriberProvisionStatus);
             }
         };
-        initializeSatelliteSystemNotification(context);
         result = mSatelliteController.registerForSatelliteProvisionStateChanged(
                 mInternalSatelliteProvisionStateCallback);
         plogd("registerForSatelliteProvisionStateChanged result: " + result);
@@ -708,7 +705,9 @@
                 plogd("EVENT_LOCATION_SETTINGS_ENABLED");
             case EVENT_LOCATION_SETTINGS_DISABLED:
                 // Fall through
+                plogd("EVENT_LOCATION_SETTINGS_DISABLED");
             case EVENT_COUNTRY_CODE_CHANGED:
+                plogd("EVENT_COUNTRY_CODE_CHANGED");
                 handleSatelliteAllowedRegionPossiblyChanged(msg.what);
                 break;
             case CMD_UPDATE_SYSTEM_SELECTION_CHANNELS:
@@ -716,6 +715,7 @@
                 break;
             case EVENT_SATELLITE_SUBSCRIPTION_CHANGED:
                 plogd("Event: EVENT_SATELLITE_SUBSCRIPTION_CHANGED");
+                initializeSatelliteSystemNotification(mContext);
                 handleEventDisallowedReasonsChanged();
                 break;
             default:
@@ -828,6 +828,9 @@
             if (reset) {
                 mIsOverlayConfigOverridden = false;
                 cleanUpCtsResources();
+                cleanUpTelephonyConfigs();
+                cleanUpSatelliteAccessConfigOtaResources();
+                cleanupSatelliteConfigOtaResources();
             } else {
                 mIsOverlayConfigOverridden = true;
                 mOverriddenIsSatelliteAllowAccessControl = isAllowed;
@@ -839,7 +842,6 @@
                                 + " does not exist");
                         mOverriddenSatelliteS2CellFile = null;
                     }
-                    ///TODO :: need to check when thi will be reloaded this map
                     mCachedAccessRestrictionMap.clear();
                 } else {
                     mOverriddenSatelliteS2CellFile = null;
@@ -1049,6 +1051,39 @@
         }
     }
 
+    private void cleanUpTelephonyConfigs() {
+        mSatelliteController.cleanUpTelephonyConfigs();
+    }
+
+    private void cleanUpSatelliteAccessConfigOtaResources() {
+        PhoneGlobals phoneGlobals = PhoneGlobals.getInstance();
+        File satelliteAccessControlDir =
+                phoneGlobals.getDir(SATELLITE_ACCESS_CONTROL_DATA_DIR, Context.MODE_PRIVATE);
+        if (satelliteAccessControlDir == null || !satelliteAccessControlDir.exists()) {
+            plogd(
+                    "cleanUpSatelliteAccessConfigOtaResources: "
+                            + SATELLITE_ACCESS_CONTROL_DATA_DIR
+                            + " does not exist");
+            return;
+        }
+        plogd(
+                "cleanUpSatelliteAccessConfigOtaResources: Deleting contents under "
+                        + SATELLITE_ACCESS_CONTROL_DATA_DIR);
+        FileUtils.deleteContents(satelliteAccessControlDir);
+    }
+
+    private void cleanupSatelliteConfigOtaResources() {
+        SatelliteConfig satelliteConfig = mSatelliteController.getSatelliteConfig();
+        if (satelliteConfig == null) {
+            plogd(
+                    "cleanupSatelliteConfigOtaResources: satelliteConfig is null. Cannot or Not"
+                        + " needed to delete satellite config OTA files");
+            return;
+        }
+        plogd("cleanupSatelliteConfigOtaResources: Deleting satellite config OTA files");
+        satelliteConfig.cleanOtaResources(mContext);
+    }
+
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
     protected long getElapsedRealtimeNanos() {
         return SystemClock.elapsedRealtimeNanos();
@@ -1497,8 +1532,13 @@
         }
     }
 
+    /**
+     * Returns a list of satellite country codes.
+     *
+     * @return The list of satellite country codes.
+     */
     @NonNull
-    private List<String> getSatelliteCountryCodes() {
+    public List<String> getSatelliteCountryCodes() {
         synchronized (mLock) {
             if (mIsOverlayConfigOverridden) {
                 return mOverriddenSatelliteCountryCodes;
@@ -1507,8 +1547,13 @@
         }
     }
 
+    /**
+     * Returns a satellite s2 cell file
+     *
+     * @return The file of satellite s2 cell
+     */
     @Nullable
-    protected File getSatelliteS2CellFile() {
+    public File getSatelliteS2CellFile() {
         synchronized (mLock) {
             if (mIsOverlayConfigOverridden) {
                 return mOverriddenSatelliteS2CellFile;
@@ -1517,8 +1562,13 @@
         }
     }
 
+    /**
+     * Returns a satellite access config file
+     *
+     * @return The file of satellite access config
+     */
     @Nullable
-    protected File getSatelliteAccessConfigFile() {
+    public File getSatelliteAccessConfigFile() {
         synchronized (mLock) {
             if (mIsOverlayConfigOverridden) {
                 logd("mIsOverlayConfigOverridden: " + mIsOverlayConfigOverridden);
@@ -1532,8 +1582,12 @@
         }
     }
 
-
-    private boolean isSatelliteAllowAccessControl() {
+    /**
+     * Checks if satellite access control is allowed.
+     *
+     * @return {@code true} if satellite access control is allowed, {@code false} otherwise.
+     */
+    public boolean isSatelliteAllowAccessControl() {
         synchronized (mLock) {
             if (mIsOverlayConfigOverridden) {
                 return mOverriddenIsSatelliteAllowAccessControl;
@@ -1684,10 +1738,19 @@
     private void sendSatelliteAllowResultToReceivers(int resultCode, Bundle resultData,
             boolean allowed) {
         plogd("sendSatelliteAllowResultToReceivers : resultCode is " + resultCode);
-        if (resultCode == SATELLITE_RESULT_SUCCESS) {
-            updateCurrentSatelliteAllowedState(allowed);
-            mIsCurrentLocationEligibleForNotification = true;
+        switch(resultCode) {
+            case SATELLITE_RESULT_SUCCESS:
+                updateCurrentSatelliteAllowedState(allowed);
+                mIsCurrentLocationEligibleForNotification = true;
+                break;
+
+            case SATELLITE_RESULT_LOCATION_DISABLED:
+                updateCurrentSatelliteAllowedState(allowed);
+                break;
+            default:
+                break;
         }
+
         synchronized (mLock) {
             for (ResultReceiver resultReceiver : mSatelliteAllowResultReceivers) {
                 resultReceiver.send(resultCode, resultData);
@@ -1936,7 +1999,8 @@
                 .setAutoCancel(true)
                 .setColor(context.getColor(
                         com.android.internal.R.color.system_notification_accent_color))
-                .setVisibility(Notification.VISIBILITY_PUBLIC);
+                .setVisibility(Notification.VISIBILITY_PUBLIC)
+                .setLocalOnly(true);
 
         return notificationBuilder.build();
     }
@@ -2282,9 +2346,9 @@
                 plogd(
                         "checkSatelliteAccessRestrictionForLocation: "
                                 + "checking satellite access restriction for location: lat - "
-                                + location.getLatitude()
+                                + Rlog.pii(TAG, location.getLatitude())
                                 + ", long - "
-                                + location.getLongitude()
+                                + Rlog.pii(TAG, location.getLongitude())
                                 + ", mS2Level - "
                                 + mS2Level);
                 SatelliteOnDeviceAccessController.LocationToken locationToken =
@@ -2336,9 +2400,9 @@
                         "checkSatelliteAccessRestrictionForLocation: "
                                 + (satelliteAllowed ? "Satellite Allowed" : "Satellite NOT Allowed")
                                 + " for location: lat - "
-                                + location.getLatitude()
+                                + Rlog.pii(TAG, location.getLatitude())
                                 + ", long - "
-                                + location.getLongitude()
+                                + Rlog.pii(TAG, location.getLongitude())
                                 + ", mS2Level - "
                                 + mS2Level);
                 Bundle bundle = new Bundle();
@@ -2531,6 +2595,8 @@
      */
     private boolean initSatelliteOnDeviceAccessController()
             throws IllegalStateException {
+        plogd("initSatelliteOnDeviceAccessController");
+
         synchronized (mLock) {
             if (getSatelliteS2CellFile() == null) return false;
 
@@ -2544,6 +2610,10 @@
                 mSatelliteOnDeviceAccessController =
                         SatelliteOnDeviceAccessController.create(
                                 getSatelliteS2CellFile(), mFeatureFlags);
+
+                plogd(
+                        "initSatelliteOnDeviceAccessController: initialized"
+                            + " SatelliteOnDeviceAccessController");
                 restartKeepOnDeviceAccessControllerResourcesTimer();
                 mS2Level = mSatelliteOnDeviceAccessController.getS2Level();
                 plogd("mS2Level=" + mS2Level);
@@ -2699,7 +2769,6 @@
         return accessAllowed;
     }
 
-
     @Nullable
     protected String getSatelliteConfigurationFileNameFromOverlayConfig(
             @NonNull Context context) {
@@ -3194,19 +3263,6 @@
         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;
-        }
-    }
-
     /**
      * This API can be used only for test purpose to override the carrier roaming Ntn eligibility
      *
@@ -3345,6 +3401,17 @@
         return satelliteDisallowedReasons;
     }
 
+    /**
+     * Returns the satellite access configuration version.
+     *
+     * If the satellite config data hasn't been updated by configUpdater,
+     * it returns 0. If it has been updated, it returns the updated version information.
+     */
+    @NonNull
+    public int getSatelliteAccessConfigVersion() {
+        return mSatelliteAccessConfigVersion;
+    }
+
     private void plogv(@NonNull String log) {
         Rlog.v(TAG, log);
         if (mPersistentLogger != null) {
diff --git a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
index 1f46ff6..60b57c3 100644
--- a/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
+++ b/src/com/android/phone/satellite/entitlement/SatelliteEntitlementController.java
@@ -37,7 +37,6 @@
 import android.telephony.Rlog;
 import android.telephony.SubscriptionManager;
 
-
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.ExponentialBackoff;
@@ -118,10 +117,6 @@
      * @param featureFlags The feature flag.
      */
     public static void make(@NonNull Context context, @NonNull FeatureFlags featureFlags) {
-        if (!featureFlags.carrierEnabledSatelliteFlag()) {
-            logd("carrierEnabledSatelliteFlag is disabled. don't created this.");
-            return;
-        }
         if (sInstance == null) {
             HandlerThread handlerThread = new HandlerThread(TAG);
             handlerThread.start();
@@ -253,6 +248,51 @@
         sendEmptyMessage(CMD_START_QUERY_ENTITLEMENT);
     }
 
+    private int[] getServiceTypeForEntitlementMetrics(Map<String, List<Integer>> map) {
+        if (map == null || map.isEmpty()) {
+            return new int[]{};
+        }
+
+        return map.entrySet().stream()
+                .findFirst()
+                .map(entry -> {
+                    List<Integer> list = entry.getValue();
+                    if (list == null) {
+                        return new int[]{}; // Return empty array if the list is null
+                    }
+                    return list.stream().mapToInt(Integer::intValue).toArray();
+                })
+                .orElse(new int[]{}); // Return empty array if no entry is found
+    }
+
+    private int getDataPolicyForEntitlementMetrics(Map<String, Integer> dataPolicyMap) {
+        if (dataPolicyMap != null && !dataPolicyMap.isEmpty()) {
+            return dataPolicyMap.values().stream().findFirst()
+                    .orElse(-1);
+        }
+        return -1;
+    }
+
+    private void reportSuccessForEntitlement(int subId, SatelliteEntitlementResult
+            entitlementResult) {
+        // allowed service info entitlement status
+        boolean isAllowedServiceInfo = !entitlementResult
+                .getAvailableServiceTypeInfoForPlmnList().isEmpty();
+
+        int[] serviceType = new int[0];
+        int dataPolicy = 0;
+        if (isAllowedServiceInfo) {
+            serviceType = getServiceTypeForEntitlementMetrics(
+                    entitlementResult.getAvailableServiceTypeInfoForPlmnList());
+            dataPolicy = SatelliteController.getInstance().mapDataPolicyForMetrics(
+                    getDataPolicyForEntitlementMetrics(
+                    entitlementResult.getDataServicePolicyInfoForPlmnList()));
+        }
+        mEntitlementMetricsStats.reportSuccess(subId,
+                getEntitlementStatus(entitlementResult), true, isAllowedServiceInfo,
+                serviceType, dataPolicy);
+    }
+
     /**
      * 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
@@ -273,8 +313,7 @@
                     SatelliteEntitlementResult entitlementResult =  getSatelliteEntitlementApi(
                             subId).checkEntitlementStatus();
                     mSatelliteEntitlementResultPerSub.put(subId, entitlementResult);
-                    mEntitlementMetricsStats.reportSuccess(subId,
-                            getEntitlementStatus(entitlementResult), false);
+                    reportSuccessForEntitlement(subId, entitlementResult);
                 }
             } catch (ServiceEntitlementException e) {
                 loge(e.toString());
@@ -341,8 +380,8 @@
                 SatelliteEntitlementResult entitlementResult =  getSatelliteEntitlementApi(
                         subId).checkEntitlementStatus();
                 mSatelliteEntitlementResultPerSub.put(subId, entitlementResult);
-                mEntitlementMetricsStats.reportSuccess(subId,
-                        getEntitlementStatus(entitlementResult), true);
+                reportSuccessForEntitlement(subId, entitlementResult);
+
             }
         } catch (ServiceEntitlementException e) {
             loge(e.toString());
diff --git a/src/com/android/phone/security/SafetySourceReceiver.java b/src/com/android/phone/security/SafetySourceReceiver.java
index 99394c2..835c79b 100644
--- a/src/com/android/phone/security/SafetySourceReceiver.java
+++ b/src/com/android/phone/security/SafetySourceReceiver.java
@@ -26,7 +26,6 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.flags.Flags;
 import com.android.phone.PhoneGlobals;
 import com.android.telephony.Rlog;
 
@@ -45,11 +44,7 @@
             return;
         }
 
-        if (Flags.enforceTelephonyFeatureMappingForPublicApis()) {
-            if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
-                refreshSafetySources(refreshBroadcastId);
-            }
-        } else {
+        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
             refreshSafetySources(refreshBroadcastId);
         }
     }
diff --git a/src/com/android/phone/settings/RadioInfo.java b/src/com/android/phone/settings/RadioInfo.java
index 5f0b2c1..be4f2a4 100644
--- a/src/com/android/phone/settings/RadioInfo.java
+++ b/src/com/android/phone/settings/RadioInfo.java
@@ -335,6 +335,7 @@
     private Button mEsosButton;
     private Button mSatelliteEnableNonEmergencyModeButton;
     private Button mEsosDemoButton;
+    private Button mSatelliteConfigViewerButton;
     private Switch mImsVolteProvisionedSwitch;
     private Switch mImsVtProvisionedSwitch;
     private Switch mImsWfcProvisionedSwitch;
@@ -576,6 +577,7 @@
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
+        SettingsConstants.setupEdgeToEdge(this);
         mSystemUser = android.os.Process.myUserHandle().isSystem();
         log("onCreate: mSystemUser=" + mSystemUser);
         UserManager userManager = getSystemService(UserManager.class);
@@ -808,6 +810,7 @@
         mEsosDemoButton  = (Button) findViewById(R.id.demo_esos_questionnaire);
         mSatelliteEnableNonEmergencyModeButton = (Button) findViewById(
                 R.id.satellite_enable_non_emergency_mode);
+        mSatelliteConfigViewerButton = (Button) findViewById(R.id.satellite_config_viewer);
 
         if (shouldHideButton(mActionEsos)) {
             mEsosButton.setVisibility(View.GONE);
@@ -837,6 +840,14 @@
             });
         }
 
+        mSatelliteConfigViewerButton.setOnClickListener(v -> {
+            Intent intent = new Intent(Intent.ACTION_VIEW);
+            intent.putExtra("mSubId", mSubId);
+            intent.setClassName("com.android.phone",
+                    "com.android.phone.settings.SatelliteConfigViewer");
+            startActivityAsUser(intent, UserHandle.CURRENT);
+        });
+
         mOemInfoButton = (Button) findViewById(R.id.oem_info);
         mOemInfoButton.setOnClickListener(mOemInfoButtonHandler);
         PackageManager pm = getPackageManager();
diff --git a/src/com/android/phone/settings/SatelliteConfigViewer.java b/src/com/android/phone/settings/SatelliteConfigViewer.java
new file mode 100644
index 0000000..4d7309f
--- /dev/null
+++ b/src/com/android/phone/settings/SatelliteConfigViewer.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2025 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.settings;
+
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+import static android.telephony.SubscriptionManager.getDefaultSubscriptionId;
+
+import android.annotation.ArrayRes;
+import android.annotation.NonNull;
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.MenuItem;
+import android.widget.TextView;
+
+import com.android.internal.telephony.flags.FeatureFlagsImpl;
+import com.android.internal.telephony.satellite.SatelliteController;
+import com.android.phone.R;
+import com.android.phone.satellite.accesscontrol.SatelliteAccessConfigurationParser;
+import com.android.phone.satellite.accesscontrol.SatelliteAccessController;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+
+public class SatelliteConfigViewer extends Activity {
+    private static final String TAG = SatelliteConfigViewer.class.getSimpleName();
+
+    private TextView mVersion;
+    private TextView mServiceType;
+    private TextView mAllowAccess;
+    private TextView mCountryCodes;
+    private TextView mSizeOfSats2;
+    private TextView mConfigAccessJson;
+
+    private SatelliteController mSatelliteController;
+    private SatelliteAccessController mSatelliteAccessController;
+
+    private int mSubId = INVALID_SUBSCRIPTION_ID;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.satellite_config_viewer);
+        Log.d(TAG, "SatelliteConfigViewer: onCreate");
+
+        ActionBar actionBar = getActionBar();
+        if (actionBar != null) {
+            actionBar.setDisplayHomeAsUpEnabled(true);
+        }
+
+        Intent intentRadioInfo = getIntent();
+        mSubId = intentRadioInfo.getIntExtra("mSubId", getDefaultSubscriptionId());
+        Log.d(TAG, "SatelliteConfigViewer: mSubId: " + mSubId);
+
+        mVersion = (TextView) findViewById(R.id.version);
+        mServiceType = (TextView) findViewById(R.id.svc_type);
+        mAllowAccess = (TextView) findViewById(R.id.allow_access);
+        mCountryCodes = (TextView) findViewById(R.id.country_codes);
+        mSizeOfSats2 = (TextView) findViewById(R.id.size_of_sats2);
+        mConfigAccessJson = (TextView) findViewById(R.id.config_json);
+
+        mSatelliteController = SatelliteController.getInstance();
+        mSatelliteAccessController = SatelliteAccessController.getOrCreateInstance(
+                getApplicationContext(), new FeatureFlagsImpl());
+
+        mVersion.setText(getSatelliteConfigVersion());
+        mServiceType.setText(getSatelliteCarrierConfigUpdateData());
+        mAllowAccess.setText(getSatelliteAllowAccess());
+        mCountryCodes.setText(getSatelliteConfigCountryCodes());
+        mSizeOfSats2.setText(getSatelliteS2SatFileSize(getApplicationContext()));
+        mConfigAccessJson.setText(getSatelliteConfigJsonFile(getApplicationContext()));
+    }
+
+    private String getSatelliteConfigVersion() {
+        logd("getSatelliteConfigVersion");
+        return Integer.toString(mSatelliteAccessController.getSatelliteAccessConfigVersion());
+    }
+
+    private String getSatelliteCarrierConfigUpdateData() {
+        logd("getSatelliteCarrierConfigUpdateData");
+        HashMap<String, List<Integer>> mapPlmnServiceType = new HashMap<>();
+        List<String> plmnList = mSatelliteController.getSatellitePlmnsForCarrier(mSubId);
+        for (String plmn : plmnList) {
+            List<Integer> listServiceType =
+                    mSatelliteController.getSupportedSatelliteServicesForPlmn(mSubId, plmn);
+            mapPlmnServiceType.put(plmn, listServiceType);
+        }
+        logd("getSatelliteCarrierConfigUpdateData: " + "subId: " + mSubId + ": "
+                + mapPlmnServiceType);
+        return "subId: " + mSubId + ": " + mapPlmnServiceType;
+    }
+
+    private String getSatelliteAllowAccess() {
+        logd("getSatelliteAllowAccess");
+        return Boolean.toString(mSatelliteAccessController.isSatelliteAllowAccessControl());
+    }
+
+    private String getSatelliteConfigCountryCodes() {
+        logd("getSatelliteConfigCountryCodes");
+        return String.join(",", mSatelliteAccessController.getSatelliteCountryCodes());
+    }
+
+    private String getSatelliteConfigJsonFile(Context context) {
+        logd("getSatelliteConfigJsonFile");
+
+        File jsonFile = mSatelliteAccessController.getSatelliteAccessConfigFile();
+        if (jsonFile == null) {
+            loge("getSatelliteConfigJsonFile: satellite access config json file is null");
+            return "satellite access config json file is not ready";
+        }
+        return SatelliteAccessConfigurationParser
+                .readJsonStringFromFile(jsonFile.getAbsolutePath());
+    }
+
+    private String getSatelliteS2SatFileSize(Context context) {
+        logd("getSatelliteS2SatFileSize");
+        File s2CellFile = mSatelliteAccessController.getSatelliteS2CellFile();
+        if (s2CellFile == null) {
+            loge("getSatelliteS2SatFileSize: s2satFile is null");
+            return "s2satFile is null";
+        }
+        return Long.toString(s2CellFile.length());
+    }
+
+    @NonNull
+    private static String[] readStringArrayFromOverlayConfig(
+            @NonNull Context context, @ArrayRes int id) {
+        String[] strArray = null;
+        try {
+            strArray = context.getResources().getStringArray(id);
+        } catch (Resources.NotFoundException ex) {
+            loge("readStringArrayFromOverlayConfig: id= " + id + ", ex=" + ex);
+        }
+        if (strArray == null) {
+            strArray = new String[0];
+        }
+        return strArray;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(@androidx.annotation.NonNull MenuItem item) {
+        switch (item.getItemId()) {
+            case android.R.id.home:
+                finish();
+                return true;
+            default:
+                return super.onOptionsItemSelected(item);
+        }
+    }
+
+    private static void logd(@NonNull String log) {
+        Log.d(TAG, log);
+    }
+
+    private static void loge(@NonNull String log) {
+        Log.e(TAG, log);
+    }
+}
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index de4076d..2222fb8 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -1398,8 +1398,7 @@
                     Build.VERSION.DEVICE_INITIAL_SDK_INT);
             PackageManager pm = context.getPackageManager();
 
-            if (Flags.enforceTelephonyFeatureMappingForPublicApis()
-                    && vendorApiLevel >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
+            if (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);
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 6860b25..320e8be 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -220,6 +220,8 @@
     private final CdmaConferenceController mCdmaConferenceController =
             new CdmaConferenceController(this);
 
+    private com.android.server.telecom.flags.FeatureFlags mTelecomFlags =
+            new com.android.server.telecom.flags.FeatureFlagsImpl();
     private FeatureFlags mFeatureFlags = new FeatureFlagsImpl();
 
     private ImsConferenceController mImsConferenceController;
@@ -4512,6 +4514,8 @@
      */
     public void maybeIndicateAnsweringWillDisconnect(@NonNull TelephonyConnection connection,
             @NonNull PhoneAccountHandle phoneAccountHandle) {
+        // With sequencing, Telecom handles setting the extra.
+        if (mTelecomFlags.enableCallSequencing()) return;
         if (isCallPresentOnOtherSub(phoneAccountHandle)) {
             if (mTelephonyManagerProxy.isConcurrentCallsPossible()
                     && allCallsSupportHold(connection)) {
@@ -4922,8 +4926,10 @@
 
     /* Only for testing */
     @VisibleForTesting
-    public void setFeatureFlags(FeatureFlags featureFlags) {
+    public void setFeatureFlags(FeatureFlags featureFlags,
+            com.android.server.telecom.flags.FeatureFlags telecomFlags) {
         mFeatureFlags = featureFlags;
+        mTelecomFlags = telecomFlags;
     }
 
     private void loge(String s) {
diff --git a/tests/src/com/android/TelephonyTestBase.java b/tests/src/com/android/TelephonyTestBase.java
index 94e91d3..5e7cdda 100644
--- a/tests/src/com/android/TelephonyTestBase.java
+++ b/tests/src/com/android/TelephonyTestBase.java
@@ -37,6 +37,7 @@
 import com.android.internal.telephony.data.DataNetworkController;
 import com.android.internal.telephony.metrics.MetricsCollector;
 import com.android.internal.telephony.metrics.PersistAtomsStorage;
+import com.android.internal.telephony.satellite.SatelliteController;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.PhoneInterfaceManager;
 
@@ -80,6 +81,9 @@
 
         doCallRealMethod().when(mPhoneGlobals).getBaseContext();
         doCallRealMethod().when(mPhoneGlobals).getResources();
+        doCallRealMethod().when(mPhoneGlobals).getSystemService(Mockito.anyString());
+        doCallRealMethod().when(mPhoneGlobals).getSystemService(Mockito.any(Class.class));
+        doCallRealMethod().when(mPhoneGlobals).getSystemServiceName(Mockito.any(Class.class));
         doCallRealMethod().when(mPhone).getServiceState();
 
         mContext = spy(new TestContext());
@@ -96,6 +100,8 @@
         replaceInstance(PhoneFactory.class, "sPhones", null, new Phone[] {mPhone});
         replaceInstance(PhoneGlobals.class, "sMe", null, mPhoneGlobals);
         replaceInstance(PhoneFactory.class, "sMetricsCollector", null, mMetricsCollector);
+        replaceInstance(SatelliteController.class, "sInstance", null,
+                Mockito.mock(SatelliteController.class));
 
         doReturn(Mockito.mock(PersistAtomsStorage.class)).when(mMetricsCollector).getAtomsStorage();
 
diff --git a/tests/src/com/android/TestContext.java b/tests/src/com/android/TestContext.java
index bf7832a..54ee6e0 100644
--- a/tests/src/com/android/TestContext.java
+++ b/tests/src/com/android/TestContext.java
@@ -33,6 +33,7 @@
 import android.content.pm.PackageManager;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
+import android.net.ConnectivityManager;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.Looper;
@@ -72,6 +73,7 @@
     @Mock ImsManager mMockImsManager;
     @Mock UserManager mMockUserManager;
     @Mock PackageManager mPackageManager;
+    @Mock ConnectivityManager mMockConnectivityManager;
 
     private final SparseArray<PersistableBundle> mCarrierConfigs = new SparseArray<>();
 
@@ -192,6 +194,9 @@
             case Context.CARRIER_CONFIG_SERVICE: {
                 return mMockCarrierConfigManager;
             }
+            case Context.CONNECTIVITY_SERVICE: {
+                return mMockConnectivityManager;
+            }
             case Context.TELECOM_SERVICE: {
                 return mMockTelecomManager;
             }
@@ -216,6 +221,9 @@
         if (serviceClass == CarrierConfigManager.class) {
             return Context.CARRIER_CONFIG_SERVICE;
         }
+        if (serviceClass == ConnectivityManager.class) {
+            return Context.CONNECTIVITY_SERVICE;
+        }
         if (serviceClass == TelecomManager.class) {
             return Context.TELECOM_SERVICE;
         }
diff --git a/tests/src/com/android/phone/CarrierConfigLoaderTest.java b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
index 5190b21..324bcbc 100644
--- a/tests/src/com/android/phone/CarrierConfigLoaderTest.java
+++ b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
@@ -28,6 +28,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -69,6 +70,7 @@
 import org.junit.Test;
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 
@@ -115,6 +117,8 @@
     @Before
     public void setUp() throws Exception {
         super.setUp();
+        doReturn(true).when(mPackageManager).hasSystemFeature(
+                eq(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION));
         doReturn(Context.PERMISSION_ENFORCER_SERVICE).when(mContext).getSystemServiceName(
                 eq(PermissionEnforcer.class));
         doReturn(mFakePermissionEnforcer).when(mContext).getSystemService(
@@ -431,7 +435,6 @@
         replaceInstance(CarrierConfigLoader.class, "mVendorApiLevel", mCarrierConfigLoader,
                 vendorApiLevel);
 
-        doReturn(true).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
         doReturn(false).when(mPackageManager).hasSystemFeature(
                 eq(PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION));
 
@@ -482,4 +485,41 @@
         mCarrierConfigLoader.updateConfigForPhoneId(1, IccCardConstants.INTENT_VALUE_ICC_ABSENT);
         mTestableLooper.processAllMessages();
     }
+
+    @Test
+    public void testSystemUnlocked_noCallback() throws Exception {
+        replaceInstance(TelephonyManager.class, "sInstance", null, mTelephonyManager);
+        replaceInstance(CarrierConfigLoader.class, "mHasSentConfigChange",
+                mCarrierConfigLoader, new boolean[]{true});
+        doNothing().when(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
+
+        mFakePermissionEnforcer.grant(android.Manifest.permission.MODIFY_PHONE_STATE);
+        // Prepare to make sure we can save the config into the XML file which used as cache
+        doReturn(PLATFORM_CARRIER_CONFIG_PACKAGE).when(mTelephonyManager)
+                .getCarrierServicePackageNameForLogicalSlot(anyInt());
+
+        doReturn(true).when(mContext).bindService(
+                any(Intent.class), any(ServiceConnection.class), anyInt());
+        Mockito.clearInvocations(mTelephonyRegistryManager);
+        Mockito.clearInvocations(mContext);
+        mHandler.sendMessage(mHandler.obtainMessage(13 /* EVENT_SYSTEM_UNLOCKED */));
+        mTestableLooper.processAllMessages();
+        mHandler.sendMessage(mHandler.obtainMessage(5 /* EVENT_FETCH_DEFAULT_DONE */));
+        mTestableLooper.processAllMessages();
+        mHandler.sendMessage(mHandler.obtainMessage(6 /* EVENT_FETCH_CARRIER_DONE */));
+        mTestableLooper.processAllMessages();
+
+        ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);
+        verify(mSubscriptionManagerService).updateSubscriptionByCarrierConfig(eq(0), anyString(),
+                any(PersistableBundle.class), runnableCaptor.capture());
+
+        runnableCaptor.getValue().run();
+        mTestableLooper.processAllMessages();
+
+        // Broadcast should be sent for backwards compatibility.
+        verify(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
+        // But callback should not be sent.
+        verify(mTelephonyRegistryManager, never()).notifyCarrierConfigChanged(
+                anyInt(), anyInt(), anyInt(), anyInt());
+    }
 }
diff --git a/tests/src/com/android/phone/LocationAccessPolicyTest.java b/tests/src/com/android/phone/LocationAccessPolicyTest.java
index 551c2cb..7acdb77 100644
--- a/tests/src/com/android/phone/LocationAccessPolicyTest.java
+++ b/tests/src/com/android/phone/LocationAccessPolicyTest.java
@@ -148,7 +148,7 @@
         }
     }
 
-    private static final int TESTING_UID = 10001;
+    private static final int TESTING_UID = UserHandle.getUid(UserHandle.myUserId(), 10001);
     private static final int TESTING_PID = 8009;
     private static final String TESTING_CALLING_PACKAGE = "com.android.phone";
 
diff --git a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
index bbcb52b..88b84a7 100644
--- a/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
+++ b/tests/src/com/android/phone/PhoneInterfaceManagerTest.java
@@ -142,7 +142,6 @@
         // In order not to affect the existing implementation, define a telephony features
         // and disabled enforce_telephony_feature_mapping_for_public_apis feature flag
         mPhoneInterfaceManager.setFeatureFlags(mFeatureFlags);
-        doReturn(false).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
         doReturn(true).when(mFeatureFlags).hsumPackageManager();
         mPhoneInterfaceManager.setPackageManager(mPackageManager);
         doReturn(mPackageManager).when(mPhoneGlobals).getPackageManager();
@@ -508,7 +507,6 @@
     @Test
     @EnableCompatChanges({TelephonyManager.ENABLE_FEATURE_MAPPING})
     public void testWithTelephonyFeatureAndCompatChanges() throws Exception {
-        doReturn(true).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
         mPhoneInterfaceManager.setFeatureFlags(mFeatureFlags);
         doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
 
@@ -533,7 +531,6 @@
         doReturn(false).when(mPackageManager).hasSystemFeature(
                 PackageManager.FEATURE_TELEPHONY_RADIO_ACCESS);
         mPhoneInterfaceManager.setPackageManager(mPackageManager);
-        doReturn(true).when(mFeatureFlags).enforceTelephonyFeatureMappingForPublicApis();
         mPhoneInterfaceManager.setFeatureFlags(mFeatureFlags);
         doNothing().when(mPhoneInterfaceManager).enforceModifyPermission();
 
diff --git a/tests/src/com/android/phone/SimPhonebookProviderTest.java b/tests/src/com/android/phone/SimPhonebookProviderTest.java
index d8518f8..817c53e 100644
--- a/tests/src/com/android/phone/SimPhonebookProviderTest.java
+++ b/tests/src/com/android/phone/SimPhonebookProviderTest.java
@@ -29,11 +29,11 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 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.ContentResolver;
 import android.content.ContentValues;
@@ -169,8 +169,7 @@
 
     @Test
     public void query_entityFiles_noSim_returnsEmptyCursor() {
-        when(mMockSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
-                ImmutableList.of());
+        doReturn(ImmutableList.of()).when(mMockSubscriptionManager).getActiveSubscriptionInfoList();
 
         try (Cursor cursor = mResolver.query(ElementaryFiles.CONTENT_URI, null, null, null)) {
             assertThat(cursor).hasCount(0);
@@ -363,7 +362,7 @@
         // Use a mock so that a null list can be returned
         IIccPhoneBook mockIccPhoneBook = mock(
                 IIccPhoneBook.class, AdditionalAnswers.delegatesTo(mIccPhoneBook));
-        when(mockIccPhoneBook.getAdnRecordsInEfForSubscriber(anyInt(), anyInt())).thenReturn(null);
+        doReturn(null).when(mockIccPhoneBook).getAdnRecordsInEfForSubscriber(anyInt(), anyInt());
         TestableSimPhonebookProvider.setup(mResolver, mMockSubscriptionManager, mockIccPhoneBook);
 
         try (Cursor adnCursor = mResolver.query(SimRecords.getContentUri(1, EF_ADN), null, null,
@@ -1334,14 +1333,14 @@
     }
 
     private void setupSimsWithSubscriptionIds(int... subscriptionIds) {
-        when(mMockSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(subscriptionIds);
-        when(mMockSubscriptionManager.getActiveSubscriptionInfoCount())
-                .thenReturn(subscriptionIds.length);
+        doReturn(subscriptionIds).when(mMockSubscriptionManager).getActiveSubscriptionIdList();
+        doReturn(subscriptionIds.length).when(mMockSubscriptionManager)
+                .getActiveSubscriptionInfoCount();
         List<SubscriptionInfo> subscriptions = createSubscriptionsWithIds(subscriptionIds);
-        when(mMockSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(subscriptions);
+        doReturn(subscriptions).when(mMockSubscriptionManager).getActiveSubscriptionInfoList();
         for (SubscriptionInfo info : subscriptions) {
-            when(mMockSubscriptionManager.getActiveSubscriptionInfo(info.getSubscriptionId()))
-                    .thenReturn(info);
+            doReturn(info).when(mMockSubscriptionManager)
+                    .getActiveSubscriptionInfo(info.getSubscriptionId());
         }
     }
 
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index 12d848c..b4ae4b9 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -240,6 +240,10 @@
     @Mock
     private ConcurrentHashMap<IBinder, ISatelliteCommunicationAccessStateCallback>
             mSatelliteCommunicationAllowedStateCallbackMap;
+    @Mock
+    private ConcurrentHashMap<IBinder, ISatelliteCommunicationAccessStateCallback>
+            mMockSatelliteCommunicationAccessStateChangedListeners;
+
     private SatelliteInfo mSatelliteInfo;
 
     private TestableLooper mTestableLooper;
@@ -421,7 +425,6 @@
                 .putInt(anyString(), anyInt());
         doNothing().when(mMockSharedPreferencesEditor).apply();
 
-        when(mMockFeatureFlags.satellitePersistentLogging()).thenReturn(true);
         when(mMockFeatureFlags.geofenceEnhancementForBetterUx()).thenReturn(true);
         when(mMockFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
 
@@ -1758,7 +1761,6 @@
                 mSatelliteAccessControllerUT,
                 DEFAULT_S2_LEVEL);
         when(mMockFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
-        when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
         when(mMockContext.getResources()).thenReturn(mMockResources);
         when(mMockResources.getBoolean(
                         com.android.internal.R.bool.config_oem_enabled_satellite_access_allow))
@@ -1976,7 +1978,8 @@
 
     @Test
     public void testLocationModeChanged() throws Exception {
-        // setup for querying GPS not to reset mIsSatelliteAllowedRegionPossiblyChanged false.
+        logd("testLocationModeChanged: setup to query the current location");
+        when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
         when(mMockContext.getResources()).thenReturn(mMockResources);
         when(mMockResources.getBoolean(
                 com.android.internal.R.bool.config_oem_enabled_satellite_access_allow))
@@ -1991,13 +1994,13 @@
         doReturn(false).when(mMockCachedAccessRestrictionMap).containsKey(any());
         mSatelliteAccessControllerUT.elapsedRealtimeNanos = TEST_LOCATION_FRESH_DURATION_NANOS + 1;
 
-        // Captor and Verify if the mockReceiver and mocContext is registered well
-        verify(mMockContext, times(2))
-                .registerReceiver(mLocationBroadcastReceiverCaptor.capture(),
-                        mIntentFilterCaptor.capture());
+        logd("testLocationModeChanged: "
+                + "captor and verify if the mockReceiver and mockContext is registered well");
+        verify(mMockContext, times(2)).registerReceiver(
+                mLocationBroadcastReceiverCaptor.capture(), mIntentFilterCaptor.capture());
 
-        // When the intent action is not MODE_CHANGED_ACTION,
-        // verify if the location manager never invoke isLocationEnabled()
+        logd("testLocationModeChanged: verify if the location manager doesn't invoke "
+                + "isLocationEnabled(), when the intent action is not MODE_CHANGED_ACTION");
         doReturn("").when(mMockLocationIntent).getAction();
         mSatelliteAccessControllerUT.setIsSatelliteAllowedRegionPossiblyChanged(false);
         mSatelliteAccessControllerUT.getLocationBroadcastReceiver()
@@ -2006,6 +2009,8 @@
 
         // When the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is true,
         // verify if mIsSatelliteAllowedRegionPossiblyChanged is true
+        logd("testLocationModeChanged: verify if mIsSatelliteAllowedRegionPossiblyChanged is true, "
+                + "when the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is true");
         doReturn(MODE_CHANGED_ACTION).when(mMockLocationIntent).getAction();
         doReturn(true).when(mMockLocationManager).isLocationEnabled();
         clearInvocations(mMockLocationManager);
@@ -2016,8 +2021,15 @@
         mTestableLooper.processAllMessages();
         assertEquals(true, mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
 
-        // When the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is false,
-        // verify if mIsSatelliteAllowedRegionPossiblyChanged is false
+        logd("testLocationModeChanged: "
+                + "verify if mIsSatelliteAllowedRegionPossiblyChanged is false, "
+                + "when the intent action is MODE_CHANGED_ACTION and isLocationEnabled() is false");
+        mSatelliteAccessControllerUT
+                .setIsSatelliteCommunicationAllowedForCurrentLocationCache("cache_allowed");
+        replaceInstance(SatelliteAccessController.class,
+                "mSatelliteCommunicationAccessStateChangedListeners",
+                mSatelliteAccessControllerUT,
+                mMockSatelliteCommunicationAccessStateChangedListeners);
         doReturn(false).when(mMockLocationManager).isLocationEnabled();
         clearInvocations(mMockLocationManager);
         mSatelliteAccessControllerUT.setIsSatelliteAllowedRegionPossiblyChanged(false);
@@ -2025,7 +2037,9 @@
                 .onReceive(mMockContext, mMockLocationIntent);
         verify(mMockLocationManager, times(1)).isLocationEnabled();
         mTestableLooper.processAllMessages();
-        assertEquals(false, mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
+        assertEquals(false,
+                mSatelliteAccessControllerUT.isSatelliteAllowedRegionPossiblyChanged());
+        verify(mMockSatelliteCommunicationAccessStateChangedListeners, times(1)).values();
     }
 
     @Test
diff --git a/tests/src/com/android/phone/security/SafetySourceReceiverTest.java b/tests/src/com/android/phone/security/SafetySourceReceiverTest.java
index 584fb25..7268771 100644
--- a/tests/src/com/android/phone/security/SafetySourceReceiverTest.java
+++ b/tests/src/com/android/phone/security/SafetySourceReceiverTest.java
@@ -35,7 +35,6 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
 import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.flags.Flags;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -91,9 +90,6 @@
 
     @Test
     public void testOnReceive_noTelephonyFeature() {
-        mSetFlagsRule.enableFlags(
-                Flags.FLAG_ENFORCE_TELEPHONY_FEATURE_MAPPING_FOR_PUBLIC_APIS);
-
         when(mContext.getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_TELEPHONY)).thenReturn(false);
 
diff --git a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
index 12b34d0..3710d6a 100644
--- a/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
+++ b/tests/src/com/android/services/telephony/TelephonyConnectionServiceTest.java
@@ -258,6 +258,7 @@
     @Mock private EmergencyStateTracker mEmergencyStateTracker;
     @Mock private Resources mMockResources;
     @Mock private FeatureFlags mFeatureFlags;
+    @Mock private com.android.server.telecom.flags.FeatureFlags mTelecomFlags;
     private Phone mPhone0;
     private Phone mPhone1;
 
@@ -285,7 +286,7 @@
         super.setUp();
 
         mTestConnectionService = new TestTelephonyConnectionService(mContext);
-        mTestConnectionService.setFeatureFlags(mFeatureFlags);
+        mTestConnectionService.setFeatureFlags(mFeatureFlags, mTelecomFlags);
         mTestConnectionService.setPhoneFactoryProxy(mPhoneFactoryProxy);
         mTestConnectionService.setSubscriptionManagerProxy(mSubscriptionManagerProxy);
         // Set configurations statically
@@ -337,7 +338,6 @@
         mTestConnectionService.setTelephonyManagerProxy(mTelephonyManagerProxy);
 
         mBinderStub = (IConnectionService.Stub) mTestConnectionService.onBind(null);
-        mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
         mSetFlagsRule.enableFlags(Flags.FLAG_DO_NOT_OVERRIDE_PRECISE_LABEL);
         mSetFlagsRule.enableFlags(Flags.FLAG_CALL_EXTRA_FOR_NON_HOLD_SUPPORTED_CARRIERS);
     }
@@ -1862,6 +1862,7 @@
     @Test
     @SmallTest
     public void testSecondCallSameSubWontDisconnect() throws Exception {
+        doReturn(false).when(mTelecomFlags).enableCallSequencing();
         // Previous test gets us into a good enough state
         testIncomingDoesntRequestDisconnect();
 
@@ -3805,8 +3806,6 @@
 
     @Test
     public void testNormalCallUsingNonTerrestrialNetwork_enableFlag() throws Exception {
-        mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
         setupForCallTest();
         // Call is not supported while using satellite
         when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
@@ -3832,8 +3831,6 @@
 
     @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);
@@ -3859,25 +3856,7 @@
     }
 
     @Test
-    public void testNormalCallUsingNonTerrestrialNetwork_disableFlag() throws Exception {
-        mSetFlagsRule.disableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
-        setupForCallTest();
-        // Flag is disabled, so call is supported while using satellite
-        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
     public void testNormalCallUsingNonTerrestrialNetwork_canMakeWifiCall() throws Exception {
-        mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
-
         setupForCallTest();
         // Call is not supported while using satellite
         when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true);
@@ -3895,7 +3874,6 @@
 
     @Test
     public void testNormalCallWhenEligibilityIsTrue() throws Exception {
-        mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG);
         mSetFlagsRule.enableFlags(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN);
 
         setupForCallTest();
@@ -3938,8 +3916,6 @@
 
     @Test
     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()))
@@ -3960,33 +3936,7 @@
     }
 
     @Test
-    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);
-        ServiceState ss = new ServiceState();
-        ss.setEmergencyOnly(true);
-        ss.setState(ServiceState.STATE_EMERGENCY_ONLY);
-        when(mockPhone.getServiceState()).thenReturn(ss);
-
-        when(mPhoneFactoryProxy.getPhones()).thenReturn(new Phone[] {mockPhone});
-
-        assertTrue(mTestConnectionService.isAvailableForEmergencyCalls(mockPhone,
-                EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY));
-        assertFalse(mTestConnectionService.isAvailableForEmergencyCalls(mockPhone,
-                EmergencyNumber.EMERGENCY_CALL_ROUTING_NORMAL));
-        assertTrue(mTestConnectionService.isAvailableForEmergencyCalls(mockPhone,
-                EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN));
-    }
-
-    @Test
     public void testIsAvailableForEmergencyCallsUsingNTN_CellularAvailable() {
-        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()))
@@ -4018,8 +3968,6 @@
 
     @Test
     public void testIsAvailableForEmergencyCallsUsingNTN_CellularNotAvailable() {
-        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()))