Merge "[Feature][T8TSK-212][Modem]Update modem version to MT2735_V02.MP1_MR3_NLWG_T28_20240103" into MR3.0-Merge-v2.0-GSW
diff --git a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
index 209e2ed..cf95d6a 100755
--- a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
@@ -118,6 +118,7 @@
 #recover some files start
 echo "$TAG: Before recover radio_property" > /dev/kmsg
 rm -rf /etc/config/.*.uci*
+rm -rf /home/root/.config/pulse/*
 
 mkdir -p /data/atsvc
 cp /data_backup/lynq_atsvc_plugin.xml /data/atsvc/lynq_atsvc_plugin.xml
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/mipc_adapter.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/mipc_adapter.cpp
index df11fbd..76f822a 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/mipc_adapter.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/mipc_adapter.cpp
@@ -83,7 +83,7 @@
         *pState = newState;
     }
     pthread_mutex_unlock(&s_state_mutex[rid]);
-
+#if 0
     if((*pState != oldState) && (*pState == RADIO_STATE_ON)) {
         char prop_value[MTK_PROPERTY_VALUE_MAX] = { 0 };
         mtk_property_get(PROPERTY_VOLTE_ENABLE[rid], prop_value, "0");
@@ -95,6 +95,7 @@
         parcel->writeInt32(volte_enable); //1:VoLTE only, 2:VoNR only, 3: VoLTE+VoNR
         Rfx_issueLocalRequest(RIL_REQUEST_SET_IMS_ENABLE,parcel,rid);
     }
+#endif
 }
 
 RIL_RadioState getRadioState(RIL_SOCKET_ID rid)
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
index 2f39946..1d40a9e 100755
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
@@ -62,6 +62,7 @@
 #include "RfxRootController.h"
 #include "RilParcelUtils.h"
 #include "rfx_properties.h"
+#include "mipc_adapter.h"
 
 using namespace std;
 
@@ -120,6 +121,14 @@
 int mCurPreferedNetWorkType[RIL_SOCKET_NUM];
 int mPhoneMode[RIL_SOCKET_NUM];
 bool mHasSetRat[RIL_SOCKET_NUM];
+
+static const char PROPERTY_VOLTE_ENABLE[4][30] = {
+    "persist.mtk.volte.enable1",
+    "persist.mtk.volte.enable2",
+    "persist.mtk.volte.enable3",
+    "persist.mtk.volte.enable4"
+};
+
 /*****************************************************************************
  * Class RfxNwController
  * The class is created if the slot is single mode, LWG or C,
@@ -592,6 +601,7 @@
 
 void mipc_unsol_nw_ps_ind_cb(mipc_msg_t *msg_ptr, void *cb_priv_ptr) {
     mipc_sim_ps_id_enum sim_ps_id;
+    static uint8_t old_attach_state = MIPC_NW_PS_DETACH;
     uint8_t attach_state;
     mipc_nw_ps_reg_info_struct4 *reg_info;
 
@@ -615,10 +625,26 @@
         p->writeInt32(attach_state);
         p->writeInt32(atoi(value));
         p->writeInt32(reg_info->rat);
-        RFX_LOG_D(RFX_LOG_TAG,"mipc_unsol_nw_ps_ind_cb attach_state[%d],mccmnc[%d-%s],rat[%d]\n",
-            attach_state,atoi(value),value,reg_info->rat);
+        RFX_LOG_D(RFX_LOG_TAG,"mipc_unsol_nw_ps_ind_cb attach_state[%d], old_attach_state[%d],mccmnc[%d-%s],rat[%d]\n",
+            attach_state,old_attach_state,atoi(value),value,reg_info->rat);
         rfx_enqueue_urc_message(RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED,p,mipc_sim_id_to_slot_id(sim_ps_id),RIL_E_SUCCESS);
         isNeedNotifyStateChanged(mipc_sim_id_to_slot_id(sim_ps_id));
+
+        if ((attach_state == MIPC_NW_PS_ATTACH) && (old_attach_state != attach_state))
+        {
+            RFX_LOG_D(RFX_LOG_TAG,"%s try to SET_IMS_ENABLE\n", __FUNCTION__);
+            char prop_value[MTK_PROPERTY_VALUE_MAX] = { 0 };
+            mtk_property_get(PROPERTY_VOLTE_ENABLE[mipc_sim_id_to_slot_id(sim_ps_id)], prop_value, "0");
+            int volte_enable = atoi(prop_value);
+            RIL_SOCKET_ID rid = mipc_sim_id_to_slot_id(sim_ps_id);
+            Parcel *parcel = new Parcel();
+            parcel->writeInt32(RIL_REQUEST_SET_IMS_ENABLE);
+            parcel->writeInt32(0xffffffff);
+            parcel->writeInt32(1);//count
+            parcel->writeInt32(volte_enable); //1:VoLTE only, 2:VoNR only, 3: VoLTE+VoNR
+            Rfx_issueLocalRequest(RIL_REQUEST_SET_IMS_ENABLE,parcel, rid);
+        }
+        old_attach_state = attach_state;
     }
 }
 
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp
index 6e70ad6..9ea00c2 100644
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp
@@ -20,6 +20,7 @@
 #include "RpRadioController.h"
 #include "RfxRootController.h"
 #include "rfx_properties.h"
+#include "mipc_adapter.h"
 
 #define RIL_BOOTPROF 1
 
@@ -43,6 +44,13 @@
 
 static std::unordered_map<int, int> mPendingRequest;
 
+static const char PROPERTY_VOLTE_ENABLE[4][30] = {
+    "persist.mtk.volte.enable1",
+    "persist.mtk.volte.enable2",
+    "persist.mtk.volte.enable3",
+    "persist.mtk.volte.enable4"
+};
+
 extern void setRadioState(RIL_RadioState newState, RIL_SOCKET_ID rid);
 extern RIL_RadioState getRadioState(RIL_SOCKET_ID rid);
 
@@ -125,6 +133,7 @@
 static void mipc_nw_radio_state_ind_cb(mipc_sim_ps_id_enum sim_ps_id, mipc_nw_radio_state_struct *result_ptr, void *cb_priv_ptr) {
     RFX_LOG_D(getTag(sim_ps_id).c_str(),"%s RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, sw=%d, hw=%d", __FUNCTION__, result_ptr->sw_radio_state, result_ptr->hw_radio_state);
     RIL_Errno err = RIL_E_SUCCESS;
+
     RFX_OBJ_GET_INSTANCE(RfxRootController)->getStatusManager(mipc_sim_id_to_slot_id(sim_ps_id))->setBoolValue(RFX_STATUS_KEY_REQUEST_RADIO_POWER, (result_ptr->sw_radio_state == mipc_nw_radio_state_const_enum::MIPC_NW_RADIO_STATE_OFF) ? false : true);
     setRadioState(((result_ptr->sw_radio_state == mipc_nw_radio_state_const_enum::MIPC_NW_RADIO_STATE_OFF) ? RIL_RadioState::RADIO_STATE_OFF : RIL_RadioState::RADIO_STATE_ON), mipc_sim_id_to_slot_id(sim_ps_id));
     rfx_enqueue_urc_message(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,NULL,mipc_sim_id_to_slot_id(sim_ps_id),err);