12d43be4eSopenharmony_ci/* 22d43be4eSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 32d43be4eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 42d43be4eSopenharmony_ci * you may not use this file except in compliance with the License. 52d43be4eSopenharmony_ci * You may obtain a copy of the License at 62d43be4eSopenharmony_ci * 72d43be4eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 82d43be4eSopenharmony_ci * 92d43be4eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 102d43be4eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 112d43be4eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 122d43be4eSopenharmony_ci * See the License for the specific language governing permissions and 132d43be4eSopenharmony_ci * limitations under the License. 142d43be4eSopenharmony_ci */ 152d43be4eSopenharmony_ci 162d43be4eSopenharmony_ci#include "cellular_data_handler.h" 172d43be4eSopenharmony_ci 182d43be4eSopenharmony_ci#include "cellular_data_constant.h" 192d43be4eSopenharmony_ci#include "cellular_data_error.h" 202d43be4eSopenharmony_ci#include "cellular_data_hisysevent.h" 212d43be4eSopenharmony_ci#include "cellular_data_service.h" 222d43be4eSopenharmony_ci#include "cellular_data_settings_rdb_helper.h" 232d43be4eSopenharmony_ci#include "cellular_data_types.h" 242d43be4eSopenharmony_ci#include "cellular_data_utils.h" 252d43be4eSopenharmony_ci#include "common_event_manager.h" 262d43be4eSopenharmony_ci#include "common_event_support.h" 272d43be4eSopenharmony_ci#include "core_manager_inner.h" 282d43be4eSopenharmony_ci#include "hitrace_meter.h" 292d43be4eSopenharmony_ci#include "tel_ril_call_parcel.h" 302d43be4eSopenharmony_ci#include "net_specifier.h" 312d43be4eSopenharmony_ci#include "net_all_capabilities.h" 322d43be4eSopenharmony_ci#include "radio_event.h" 332d43be4eSopenharmony_ci#include "str_convert.h" 342d43be4eSopenharmony_ci#include "string_ex.h" 352d43be4eSopenharmony_ci#include "telephony_log_wrapper.h" 362d43be4eSopenharmony_ci#include "telephony_ext_wrapper.h" 372d43be4eSopenharmony_ci#include "telephony_permission.h" 382d43be4eSopenharmony_ci#include "ipc_skeleton.h" 392d43be4eSopenharmony_ci#include "connection_retry_policy.h" 402d43be4eSopenharmony_cinamespace OHOS { 412d43be4eSopenharmony_cinamespace Telephony { 422d43be4eSopenharmony_ciusing namespace AppExecFwk; 432d43be4eSopenharmony_ciusing namespace OHOS::EventFwk; 442d43be4eSopenharmony_ciusing namespace NetManagerStandard; 452d43be4eSopenharmony_cistatic const int32_t ESM_FLAG_INVALID = -1; 462d43be4eSopenharmony_ciconst std::string DEFAULT_DATA_ROAMING = "persist.telephony.defaultdataroaming"; 472d43be4eSopenharmony_ciCellularDataHandler::CellularDataHandler(const EventFwk::CommonEventSubscribeInfo &sp, int32_t slotId) 482d43be4eSopenharmony_ci : TelEventHandler("CellularDataHandler"), CommonEventSubscriber(sp), slotId_(slotId) 492d43be4eSopenharmony_ci{} 502d43be4eSopenharmony_ci 512d43be4eSopenharmony_civoid CellularDataHandler::Init() 522d43be4eSopenharmony_ci{ 532d43be4eSopenharmony_ci lastApnItem_ = new ApnItem(); 542d43be4eSopenharmony_ci apnManager_ = std::make_unique<ApnManager>().release(); 552d43be4eSopenharmony_ci dataSwitchSettings_ = std::make_unique<DataSwitchSettings>(slotId_); 562d43be4eSopenharmony_ci connectionManager_ = std::make_unique<DataConnectionManager>(slotId_).release(); 572d43be4eSopenharmony_ci settingObserver_ = new (std::nothrow) CellularDataSettingObserver( 582d43be4eSopenharmony_ci std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this()))); 592d43be4eSopenharmony_ci roamingObserver_ = new (std::nothrow) CellularDataRoamingObserver( 602d43be4eSopenharmony_ci std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())), slotId_); 612d43be4eSopenharmony_ci incallObserver_ = new (std::nothrow) CellularDataIncallObserver( 622d43be4eSopenharmony_ci std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this()))); 632d43be4eSopenharmony_ci cellularDataRdbObserver_ = new (std::nothrow) CellularDataRdbObserver( 642d43be4eSopenharmony_ci std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this()))); 652d43be4eSopenharmony_ci if ((apnManager_ == nullptr) || (dataSwitchSettings_ == nullptr) || (connectionManager_ == nullptr)) { 662d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ or dataSwitchSettings_ or connectionManager_ is null", slotId_); 672d43be4eSopenharmony_ci return; 682d43be4eSopenharmony_ci } 692d43be4eSopenharmony_ci connectionManager_->Init(); 702d43be4eSopenharmony_ci apnManager_->InitApnHolders(); 712d43be4eSopenharmony_ci dataSwitchSettings_->LoadSwitchValue(); 722d43be4eSopenharmony_ci GetConfigurationFor5G(); 732d43be4eSopenharmony_ci SetRilLinkBandwidths(); 742d43be4eSopenharmony_ci} 752d43be4eSopenharmony_ci 762d43be4eSopenharmony_ciCellularDataHandler::~CellularDataHandler() {} 772d43be4eSopenharmony_ci 782d43be4eSopenharmony_cibool CellularDataHandler::ReleaseNet(const NetRequest &request) 792d43be4eSopenharmony_ci{ 802d43be4eSopenharmony_ci std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>(); 812d43be4eSopenharmony_ci if (netRequest == nullptr) { 822d43be4eSopenharmony_ci TELEPHONY_LOGE("Netrequest is null"); 832d43be4eSopenharmony_ci return false; 842d43be4eSopenharmony_ci } 852d43be4eSopenharmony_ci netRequest->capability = ApnManager::FindBestCapability(request.capability); 862d43be4eSopenharmony_ci netRequest->ident = request.ident; 872d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Pointer event = 882d43be4eSopenharmony_ci InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_RELEASE_NET); 892d43be4eSopenharmony_ci if (event == nullptr) { 902d43be4eSopenharmony_ci TELEPHONY_LOGE("event is null"); 912d43be4eSopenharmony_ci return false; 922d43be4eSopenharmony_ci } 932d43be4eSopenharmony_ci return SendEvent(event); 942d43be4eSopenharmony_ci} 952d43be4eSopenharmony_ci 962d43be4eSopenharmony_cibool CellularDataHandler::RequestNet(const NetRequest &request) 972d43be4eSopenharmony_ci{ 982d43be4eSopenharmony_ci std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>(); 992d43be4eSopenharmony_ci if (netRequest == nullptr) { 1002d43be4eSopenharmony_ci TELEPHONY_LOGE("Netrequest is null"); 1012d43be4eSopenharmony_ci return false; 1022d43be4eSopenharmony_ci } 1032d43be4eSopenharmony_ci netRequest->capability = ApnManager::FindBestCapability(request.capability); 1042d43be4eSopenharmony_ci netRequest->ident = request.ident; 1052d43be4eSopenharmony_ci netRequest->registerType = request.registerType; 1062d43be4eSopenharmony_ci netRequest->bearTypes = request.bearTypes; 1072d43be4eSopenharmony_ci AppExecFwk::InnerEvent::Pointer event = 1082d43be4eSopenharmony_ci InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_REQUEST_NET); 1092d43be4eSopenharmony_ci return SendEvent(event); 1102d43be4eSopenharmony_ci} 1112d43be4eSopenharmony_ci 1122d43be4eSopenharmony_cibool CellularDataHandler::AddUid(const NetRequest &request) 1132d43be4eSopenharmony_ci{ 1142d43be4eSopenharmony_ci int32_t id = ApnManager::FindApnIdByCapability(ApnManager::FindBestCapability(request.capability)); 1152d43be4eSopenharmony_ci 1162d43be4eSopenharmony_ci if (!apnManager_) { 1172d43be4eSopenharmony_ci TELEPHONY_LOGE("apnManager_ is nullptr"); 1182d43be4eSopenharmony_ci return false; 1192d43be4eSopenharmony_ci } 1202d43be4eSopenharmony_ci 1212d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id); 1222d43be4eSopenharmony_ci apnHolder->AddUid(request.uid); 1232d43be4eSopenharmony_ci 1242d43be4eSopenharmony_ci return true; 1252d43be4eSopenharmony_ci} 1262d43be4eSopenharmony_ci 1272d43be4eSopenharmony_cibool CellularDataHandler::RemoveUid(const NetRequest &request) 1282d43be4eSopenharmony_ci{ 1292d43be4eSopenharmony_ci int32_t id = ApnManager::FindApnIdByCapability(ApnManager::FindBestCapability(request.capability)); 1302d43be4eSopenharmony_ci 1312d43be4eSopenharmony_ci if (!apnManager_) { 1322d43be4eSopenharmony_ci TELEPHONY_LOGE("apnManager_ is nullptr"); 1332d43be4eSopenharmony_ci return false; 1342d43be4eSopenharmony_ci } 1352d43be4eSopenharmony_ci 1362d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id); 1372d43be4eSopenharmony_ci apnHolder->RemoveUid(request.uid); 1382d43be4eSopenharmony_ci return true; 1392d43be4eSopenharmony_ci} 1402d43be4eSopenharmony_ci 1412d43be4eSopenharmony_ciint32_t CellularDataHandler::SetCellularDataEnable(bool userDataOn) 1422d43be4eSopenharmony_ci{ 1432d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 1442d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_); 1452d43be4eSopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 1462d43be4eSopenharmony_ci } 1472d43be4eSopenharmony_ci bool dataEnabled = true; 1482d43be4eSopenharmony_ci int32_t result = dataSwitchSettings_->QueryUserDataStatus(dataEnabled); 1492d43be4eSopenharmony_ci if (result != TELEPHONY_ERR_SUCCESS) { 1502d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result); 1512d43be4eSopenharmony_ci } 1522d43be4eSopenharmony_ci if (dataEnabled == userDataOn) { 1532d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_); 1542d43be4eSopenharmony_ci return TELEPHONY_ERR_SUCCESS; 1552d43be4eSopenharmony_ci } 1562d43be4eSopenharmony_ci 1572d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 1582d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.sendDataSwitchChangeInfo_) { 1592d43be4eSopenharmony_ci int32_t callingUid = IPCSkeleton::GetCallingUid(); 1602d43be4eSopenharmony_ci std::string bundleName = ""; 1612d43be4eSopenharmony_ci TelephonyPermission::GetBundleNameByUid(callingUid, bundleName); 1622d43be4eSopenharmony_ci TELEPHONY_EXT_WRAPPER.sendDataSwitchChangeInfo_(bundleName.c_str(), userDataOn); 1632d43be4eSopenharmony_ci } 1642d43be4eSopenharmony_ci#endif 1652d43be4eSopenharmony_ci return dataSwitchSettings_->SetUserDataOn(userDataOn); 1662d43be4eSopenharmony_ci} 1672d43be4eSopenharmony_ci 1682d43be4eSopenharmony_ciint32_t CellularDataHandler::SetIntelligenceSwitchEnable(bool userSwitchOn) 1692d43be4eSopenharmony_ci{ 1702d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 1712d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_); 1722d43be4eSopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 1732d43be4eSopenharmony_ci } 1742d43be4eSopenharmony_ci bool switchEnabled = false; 1752d43be4eSopenharmony_ci int32_t result = dataSwitchSettings_->QueryIntelligenceSwitchStatus(switchEnabled); 1762d43be4eSopenharmony_ci if (result != TELEPHONY_ERR_SUCCESS) { 1772d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result); 1782d43be4eSopenharmony_ci } 1792d43be4eSopenharmony_ci if (switchEnabled == userSwitchOn) { 1802d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_); 1812d43be4eSopenharmony_ci return TELEPHONY_ERR_SUCCESS; 1822d43be4eSopenharmony_ci } 1832d43be4eSopenharmony_ci return dataSwitchSettings_->SetIntelliSwitchOn(userSwitchOn); 1842d43be4eSopenharmony_ci} 1852d43be4eSopenharmony_ci 1862d43be4eSopenharmony_ciint32_t CellularDataHandler::IsCellularDataEnabled(bool &dataEnabled) const 1872d43be4eSopenharmony_ci{ 1882d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 1892d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_); 1902d43be4eSopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 1912d43be4eSopenharmony_ci } 1922d43be4eSopenharmony_ci return dataSwitchSettings_->QueryUserDataStatus(dataEnabled); 1932d43be4eSopenharmony_ci} 1942d43be4eSopenharmony_ci 1952d43be4eSopenharmony_ciint32_t CellularDataHandler::IsCellularDataRoamingEnabled(bool &dataRoamingEnabled) const 1962d43be4eSopenharmony_ci{ 1972d43be4eSopenharmony_ci if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID) { 1982d43be4eSopenharmony_ci int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_); 1992d43be4eSopenharmony_ci if (simId <= INVALID_SIM_ID) { 2002d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: invalid sim id %{public}d", slotId_, simId); 2012d43be4eSopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 2022d43be4eSopenharmony_ci } 2032d43be4eSopenharmony_ci } 2042d43be4eSopenharmony_ci dataRoamingEnabled = defaultDataRoamingEnable_; 2052d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 2062d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_); 2072d43be4eSopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 2082d43be4eSopenharmony_ci } 2092d43be4eSopenharmony_ci dataSwitchSettings_->QueryUserDataRoamingStatus(dataRoamingEnabled); 2102d43be4eSopenharmony_ci return TELEPHONY_ERR_SUCCESS; 2112d43be4eSopenharmony_ci} 2122d43be4eSopenharmony_ci 2132d43be4eSopenharmony_ciint32_t CellularDataHandler::GetIntelligenceSwitchState(bool &switchState) 2142d43be4eSopenharmony_ci{ 2152d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 2162d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_); 2172d43be4eSopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 2182d43be4eSopenharmony_ci } 2192d43be4eSopenharmony_ci bool switchEnabled = false; 2202d43be4eSopenharmony_ci int32_t result = dataSwitchSettings_->QueryIntelligenceSwitchStatus(switchEnabled); 2212d43be4eSopenharmony_ci if (result != TELEPHONY_ERR_SUCCESS) { 2222d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: Query result: %{public}d", slotId_, result); 2232d43be4eSopenharmony_ci } 2242d43be4eSopenharmony_ci TELEPHONY_LOGI("GetIntelligenceSwitchState: %{public}d -- %{public}d", switchState, switchEnabled); 2252d43be4eSopenharmony_ci switchState = switchEnabled; 2262d43be4eSopenharmony_ci return result; 2272d43be4eSopenharmony_ci} 2282d43be4eSopenharmony_ci 2292d43be4eSopenharmony_ciint32_t CellularDataHandler::SetCellularDataRoamingEnabled(bool dataRoamingEnabled) 2302d43be4eSopenharmony_ci{ 2312d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr || apnManager_ == nullptr) { 2322d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_); 2332d43be4eSopenharmony_ci return TELEPHONY_ERR_LOCAL_PTR_NULL; 2342d43be4eSopenharmony_ci } 2352d43be4eSopenharmony_ci bool currentDataEnabled = dataSwitchSettings_->IsUserDataRoamingOn(); 2362d43be4eSopenharmony_ci if (currentDataEnabled == dataRoamingEnabled) { 2372d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: The roaming switch status has not changed", slotId_); 2382d43be4eSopenharmony_ci return TELEPHONY_ERR_SUCCESS; 2392d43be4eSopenharmony_ci } 2402d43be4eSopenharmony_ci int32_t result = dataSwitchSettings_->SetUserDataRoamingOn(dataRoamingEnabled); 2412d43be4eSopenharmony_ci if (result != TELEPHONY_ERR_SUCCESS) { 2422d43be4eSopenharmony_ci return result; 2432d43be4eSopenharmony_ci } 2442d43be4eSopenharmony_ci bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0; 2452d43be4eSopenharmony_ci if (roamingState) { 2462d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallApnState(); 2472d43be4eSopenharmony_ci if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || 2482d43be4eSopenharmony_ci apnState == ApnProfileState::PROFILE_STATE_CONNECTED) { 2492d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION); 2502d43be4eSopenharmony_ci } 2512d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 2522d43be4eSopenharmony_ci } else { 2532d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Not roaming(%{public}d), not doing anything", slotId_, roamingState); 2542d43be4eSopenharmony_ci } 2552d43be4eSopenharmony_ci return TELEPHONY_ERR_SUCCESS; 2562d43be4eSopenharmony_ci} 2572d43be4eSopenharmony_ci 2582d43be4eSopenharmony_civoid CellularDataHandler::ClearAllConnections(DisConnectionReason reason) 2592d43be4eSopenharmony_ci{ 2602d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 2612d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_); 2622d43be4eSopenharmony_ci return; 2632d43be4eSopenharmony_ci } 2642d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apn : apnManager_->GetAllApnHolder()) { 2652d43be4eSopenharmony_ci ClearConnection(apn, reason); 2662d43be4eSopenharmony_ci } 2672d43be4eSopenharmony_ci 2682d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 2692d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_); 2702d43be4eSopenharmony_ci return; 2712d43be4eSopenharmony_ci } 2722d43be4eSopenharmony_ci connectionManager_->StopStallDetectionTimer(); 2732d43be4eSopenharmony_ci connectionManager_->EndNetStatistics(); 2742d43be4eSopenharmony_ci 2752d43be4eSopenharmony_ci ResetDataFlowType(); 2762d43be4eSopenharmony_ci} 2772d43be4eSopenharmony_ci 2782d43be4eSopenharmony_civoid CellularDataHandler::ClearConnectionsOnUpdateApns(DisConnectionReason reason) 2792d43be4eSopenharmony_ci{ 2802d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 2812d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_); 2822d43be4eSopenharmony_ci return; 2832d43be4eSopenharmony_ci } 2842d43be4eSopenharmony_ci bool isRoaming = false; 2852d43be4eSopenharmony_ci int32_t result = IsCellularDataRoamingEnabled(isRoaming); 2862d43be4eSopenharmony_ci if (result != TELEPHONY_ERR_SUCCESS) { 2872d43be4eSopenharmony_ci isRoaming = false; 2882d43be4eSopenharmony_ci } 2892d43be4eSopenharmony_ci auto apnItem = apnManager_->GetRilAttachApn(); 2902d43be4eSopenharmony_ci if (!ApnHolder::IsCompatibleApnItem(lastApnItem_, apnItem, isRoaming)) { 2912d43be4eSopenharmony_ci ClearAllConnections(reason); 2922d43be4eSopenharmony_ci if (lastApnItem_ == nullptr) { 2932d43be4eSopenharmony_ci lastApnItem_ = new ApnItem(); 2942d43be4eSopenharmony_ci } 2952d43be4eSopenharmony_ci if (apnItem == nullptr) { 2962d43be4eSopenharmony_ci return; 2972d43be4eSopenharmony_ci } 2982d43be4eSopenharmony_ci *lastApnItem_ = *apnItem; 2992d43be4eSopenharmony_ci } 3002d43be4eSopenharmony_ci} 3012d43be4eSopenharmony_ci 3022d43be4eSopenharmony_civoid CellularDataHandler::ResetDataFlowType() 3032d43be4eSopenharmony_ci{ 3042d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 3052d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: in ClearAllConnections dataSwitchSettings_ is null", slotId_); 3062d43be4eSopenharmony_ci return; 3072d43be4eSopenharmony_ci } 3082d43be4eSopenharmony_ci bool dataEnabled = dataSwitchSettings_->IsUserDataOn(); 3092d43be4eSopenharmony_ci if (!dataEnabled) { 3102d43be4eSopenharmony_ci connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_NONE); 3112d43be4eSopenharmony_ci } 3122d43be4eSopenharmony_ci} 3132d43be4eSopenharmony_ci 3142d43be4eSopenharmony_civoid CellularDataHandler::ClearConnection(const sptr<ApnHolder> &apn, DisConnectionReason reason) 3152d43be4eSopenharmony_ci{ 3162d43be4eSopenharmony_ci if (apn == nullptr) { 3172d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 3182d43be4eSopenharmony_ci return; 3192d43be4eSopenharmony_ci } 3202d43be4eSopenharmony_ci std::shared_ptr<CellularDataStateMachine> stateMachine = apn->GetCellularDataStateMachine(); 3212d43be4eSopenharmony_ci if (stateMachine == nullptr) { 3222d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: stateMachine is null", slotId_); 3232d43be4eSopenharmony_ci return; 3242d43be4eSopenharmony_ci } 3252d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: The APN holder is of type %{public}s", slotId_, apn->GetApnType().c_str()); 3262d43be4eSopenharmony_ci std::unique_ptr<DataDisconnectParams> object = std::make_unique<DataDisconnectParams>(apn->GetApnType(), reason); 3272d43be4eSopenharmony_ci if (object == nullptr) { 3282d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: ClearConnection fail, object is null", slotId_); 3292d43be4eSopenharmony_ci return; 3302d43be4eSopenharmony_ci } 3312d43be4eSopenharmony_ci ApnProfileState apnState = apn->GetApnState(); 3322d43be4eSopenharmony_ci if (apnState == ApnProfileState::PROFILE_STATE_IDLE || 3332d43be4eSopenharmony_ci apnState == ApnProfileState::PROFILE_STATE_DISCONNECTING || 3342d43be4eSopenharmony_ci apnState == ApnProfileState::PROFILE_STATE_RETRYING) { 3352d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apn state has been idle, disconnecting, or retrying", slotId_); 3362d43be4eSopenharmony_ci return; 3372d43be4eSopenharmony_ci } 3382d43be4eSopenharmony_ci apn->SetApnState(PROFILE_STATE_DISCONNECTING); 3392d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apn->GetApnType(), 3402d43be4eSopenharmony_ci apn->GetCapability(), static_cast<int32_t>(PROFILE_STATE_DISCONNECTING)); 3412d43be4eSopenharmony_ci InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_DISCONNECT, object); 3422d43be4eSopenharmony_ci stateMachine->SendEvent(event); 3432d43be4eSopenharmony_ci} 3442d43be4eSopenharmony_ci 3452d43be4eSopenharmony_ciApnProfileState CellularDataHandler::GetCellularDataState() const 3462d43be4eSopenharmony_ci{ 3472d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 3482d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_); 3492d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_IDLE; 3502d43be4eSopenharmony_ci } 3512d43be4eSopenharmony_ci return apnManager_->GetOverallApnState(); 3522d43be4eSopenharmony_ci} 3532d43be4eSopenharmony_ci 3542d43be4eSopenharmony_ciApnProfileState CellularDataHandler::GetCellularDataState(const std::string &apnType) const 3552d43be4eSopenharmony_ci{ 3562d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 3572d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_); 3582d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_IDLE; 3592d43be4eSopenharmony_ci } 3602d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnType); 3612d43be4eSopenharmony_ci if (apnHolder == nullptr) { 3622d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 3632d43be4eSopenharmony_ci return ApnProfileState::PROFILE_STATE_IDLE; 3642d43be4eSopenharmony_ci } 3652d43be4eSopenharmony_ci return apnHolder->GetApnState(); 3662d43be4eSopenharmony_ci} 3672d43be4eSopenharmony_ci 3682d43be4eSopenharmony_civoid CellularDataHandler::RadioPsConnectionAttached(const InnerEvent::Pointer &event) 3692d43be4eSopenharmony_ci{ 3702d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: ps attached", slotId_); 3712d43be4eSopenharmony_ci if (event == nullptr || apnManager_ == nullptr) { 3722d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event or apnManager_ is null", slotId_); 3732d43be4eSopenharmony_ci return; 3742d43be4eSopenharmony_ci } 3752d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 3762d43be4eSopenharmony_ci} 3772d43be4eSopenharmony_ci 3782d43be4eSopenharmony_civoid CellularDataHandler::RadioPsConnectionDetached(const InnerEvent::Pointer &event) 3792d43be4eSopenharmony_ci{ 3802d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: ps detached", slotId_); 3812d43be4eSopenharmony_ci if (event == nullptr) { 3822d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 3832d43be4eSopenharmony_ci return; 3842d43be4eSopenharmony_ci } 3852d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION); 3862d43be4eSopenharmony_ci} 3872d43be4eSopenharmony_ci 3882d43be4eSopenharmony_civoid CellularDataHandler::RoamingStateOn(const InnerEvent::Pointer &event) 3892d43be4eSopenharmony_ci{ 3902d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: roaming on", slotId_); 3912d43be4eSopenharmony_ci if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) { 3922d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_); 3932d43be4eSopenharmony_ci return; 3942d43be4eSopenharmony_ci } 3952d43be4eSopenharmony_ci bool roamingState = false; 3962d43be4eSopenharmony_ci if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) { 3972d43be4eSopenharmony_ci roamingState = true; 3982d43be4eSopenharmony_ci } 3992d43be4eSopenharmony_ci if (!roamingState) { 4002d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: device not currently roaming state", slotId_); 4012d43be4eSopenharmony_ci return; 4022d43be4eSopenharmony_ci } 4032d43be4eSopenharmony_ci bool dataRoamingEnabled = false; 4042d43be4eSopenharmony_ci int32_t res = IsCellularDataRoamingEnabled(dataRoamingEnabled); 4052d43be4eSopenharmony_ci if (res != TELEPHONY_ERR_SUCCESS) { 4062d43be4eSopenharmony_ci dataRoamingEnabled = false; 4072d43be4eSopenharmony_ci } 4082d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallApnState(); 4092d43be4eSopenharmony_ci if ((apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED) 4102d43be4eSopenharmony_ci && !dataRoamingEnabled) { 4112d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION); 4122d43be4eSopenharmony_ci } 4132d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 4142d43be4eSopenharmony_ci} 4152d43be4eSopenharmony_ci 4162d43be4eSopenharmony_civoid CellularDataHandler::RoamingStateOff(const InnerEvent::Pointer &event) 4172d43be4eSopenharmony_ci{ 4182d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: roaming off", slotId_); 4192d43be4eSopenharmony_ci if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) { 4202d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_); 4212d43be4eSopenharmony_ci return; 4222d43be4eSopenharmony_ci } 4232d43be4eSopenharmony_ci bool dataRoamingEnabled = false; 4242d43be4eSopenharmony_ci int32_t res = IsCellularDataRoamingEnabled(dataRoamingEnabled); 4252d43be4eSopenharmony_ci if (res != TELEPHONY_ERR_SUCCESS) { 4262d43be4eSopenharmony_ci dataRoamingEnabled = false; 4272d43be4eSopenharmony_ci } 4282d43be4eSopenharmony_ci if (!dataRoamingEnabled) { 4292d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallApnState(); 4302d43be4eSopenharmony_ci if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || 4312d43be4eSopenharmony_ci apnState == ApnProfileState::PROFILE_STATE_CONNECTED) { 4322d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION); 4332d43be4eSopenharmony_ci } 4342d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 4352d43be4eSopenharmony_ci } 4362d43be4eSopenharmony_ci} 4372d43be4eSopenharmony_ci 4382d43be4eSopenharmony_civoid CellularDataHandler::PsRadioEmergencyStateOpen(const InnerEvent::Pointer &event) 4392d43be4eSopenharmony_ci{ 4402d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: emergency on", slotId_); 4412d43be4eSopenharmony_ci ApnProfileState currentState = apnManager_->GetOverallApnState(); 4422d43be4eSopenharmony_ci if (currentState == ApnProfileState::PROFILE_STATE_CONNECTED || 4432d43be4eSopenharmony_ci currentState == ApnProfileState::PROFILE_STATE_CONNECTING) { 4442d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 4452d43be4eSopenharmony_ci } 4462d43be4eSopenharmony_ci} 4472d43be4eSopenharmony_ci 4482d43be4eSopenharmony_civoid CellularDataHandler::PsRadioEmergencyStateClose(const InnerEvent::Pointer &event) 4492d43be4eSopenharmony_ci{ 4502d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: emergency off", slotId_); 4512d43be4eSopenharmony_ci ApnProfileState currentState = apnManager_->GetOverallApnState(); 4522d43be4eSopenharmony_ci if (currentState == ApnProfileState::PROFILE_STATE_IDLE || 4532d43be4eSopenharmony_ci currentState == ApnProfileState::PROFILE_STATE_DISCONNECTING) { 4542d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 4552d43be4eSopenharmony_ci } 4562d43be4eSopenharmony_ci} 4572d43be4eSopenharmony_ci 4582d43be4eSopenharmony_civoid CellularDataHandler::EstablishAllApnsIfConnectable() 4592d43be4eSopenharmony_ci{ 4602d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 4612d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_); 4622d43be4eSopenharmony_ci return; 4632d43be4eSopenharmony_ci } 4642d43be4eSopenharmony_ci for (sptr<ApnHolder> apnHolder : apnManager_->GetSortApnHolder()) { 4652d43be4eSopenharmony_ci if (apnHolder == nullptr) { 4662d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apn is null", slotId_); 4672d43be4eSopenharmony_ci continue; 4682d43be4eSopenharmony_ci } 4692d43be4eSopenharmony_ci if (apnHolder->IsDataCallEnabled() || IsVSimSlotId(slotId_)) { 4702d43be4eSopenharmony_ci ApnProfileState apnState = apnHolder->GetApnState(); 4712d43be4eSopenharmony_ci if (apnState == PROFILE_STATE_FAILED || apnState == PROFILE_STATE_RETRYING) { 4722d43be4eSopenharmony_ci apnHolder->ReleaseDataConnection(); 4732d43be4eSopenharmony_ci } 4742d43be4eSopenharmony_ci AttemptEstablishDataConnection(apnHolder); 4752d43be4eSopenharmony_ci } 4762d43be4eSopenharmony_ci } 4772d43be4eSopenharmony_ci} 4782d43be4eSopenharmony_ci 4792d43be4eSopenharmony_cibool CellularDataHandler::SetDataPermittedForMms(bool dataPermittedForMms) 4802d43be4eSopenharmony_ci{ 4812d43be4eSopenharmony_ci if (incallDataStateMachine_ != nullptr) { 4822d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: incall data active", slotId_); 4832d43be4eSopenharmony_ci return false; 4842d43be4eSopenharmony_ci } 4852d43be4eSopenharmony_ci if (CheckDataPermittedByDsds()) { 4862d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: data permitted", slotId_); 4872d43be4eSopenharmony_ci return false; 4882d43be4eSopenharmony_ci } 4892d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 4902d43be4eSopenharmony_ci const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId(); 4912d43be4eSopenharmony_ci SetDataPermitted(defSlotId, !dataPermittedForMms); 4922d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 4932d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_()) { 4942d43be4eSopenharmony_ci SetDataPermitted(CELLULAR_DATA_VSIM_SLOT_ID, !dataPermittedForMms); 4952d43be4eSopenharmony_ci } 4962d43be4eSopenharmony_ci#endif 4972d43be4eSopenharmony_ci SetDataPermitted(slotId_, dataPermittedForMms); 4982d43be4eSopenharmony_ci DelayedRefSingleton<CellularDataService>::GetInstance().ChangeConnectionForDsds(defSlotId, !dataPermittedForMms); 4992d43be4eSopenharmony_ci return true; 5002d43be4eSopenharmony_ci} 5012d43be4eSopenharmony_ci 5022d43be4eSopenharmony_cibool CellularDataHandler::CheckDataPermittedByDsds() 5032d43be4eSopenharmony_ci{ 5042d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.getVSimSlotId_) { 5052d43be4eSopenharmony_ci int vSimSlotId = INVALID_SLOT_ID; 5062d43be4eSopenharmony_ci TELEPHONY_EXT_WRAPPER.getVSimSlotId_(vSimSlotId); 5072d43be4eSopenharmony_ci if (vSimSlotId == CELLULAR_DATA_VSIM_SLOT_ID) { 5082d43be4eSopenharmony_ci return slotId_ == CELLULAR_DATA_VSIM_SLOT_ID; 5092d43be4eSopenharmony_ci } 5102d43be4eSopenharmony_ci } 5112d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 5122d43be4eSopenharmony_ci const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId(); 5132d43be4eSopenharmony_ci int32_t dsdsMode = DSDS_MODE_V2; 5142d43be4eSopenharmony_ci coreInner.GetDsdsMode(dsdsMode); 5152d43be4eSopenharmony_ci if (defSlotId != slotId_ && dsdsMode == DSDS_MODE_V2) { 5162d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: default:%{public}d, current:%{public}d, dsdsMode:%{public}d", slotId_, 5172d43be4eSopenharmony_ci defSlotId, slotId_, dsdsMode); 5182d43be4eSopenharmony_ci return false; 5192d43be4eSopenharmony_ci } 5202d43be4eSopenharmony_ci return true; 5212d43be4eSopenharmony_ci} 5222d43be4eSopenharmony_ci 5232d43be4eSopenharmony_cibool CellularDataHandler::CheckCellularDataSlotId(sptr<ApnHolder> &apnHolder) 5242d43be4eSopenharmony_ci{ 5252d43be4eSopenharmony_ci if (apnHolder == nullptr) { 5262d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 5272d43be4eSopenharmony_ci return false; 5282d43be4eSopenharmony_ci } 5292d43be4eSopenharmony_ci if (IsVSimSlotId(slotId_)) { 5302d43be4eSopenharmony_ci return true; 5312d43be4eSopenharmony_ci } 5322d43be4eSopenharmony_ci 5332d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 5342d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.isDualCellularCardAllowed_) { 5352d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.isDualCellularCardAllowed_()) { 5362d43be4eSopenharmony_ci return true; 5372d43be4eSopenharmony_ci } 5382d43be4eSopenharmony_ci } 5392d43be4eSopenharmony_ci#endif 5402d43be4eSopenharmony_ci 5412d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 5422d43be4eSopenharmony_ci const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId(); 5432d43be4eSopenharmony_ci std::string apnType = apnHolder->GetApnType(); 5442d43be4eSopenharmony_ci if (defSlotId != slotId_ && !apnType.compare(DATA_CONTEXT_ROLE_DEFAULT)) { 5452d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: default:%{public}d, current:%{public}d", slotId_, defSlotId, slotId_); 5462d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON, 5472d43be4eSopenharmony_ci CellularDataErrorCode::DATA_ERROR_CELLULAR_DATA_SLOT_ID_MISMATCH, 5482d43be4eSopenharmony_ci "Default cellular data slot id is not current slot id"); 5492d43be4eSopenharmony_ci return false; 5502d43be4eSopenharmony_ci } 5512d43be4eSopenharmony_ci if (defSlotId != slotId_ && !apnType.compare(DATA_CONTEXT_ROLE_INTERNAL_DEFAULT)) { 5522d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: default:%{public}d, current:%{public}d", slotId_, defSlotId, slotId_); 5532d43be4eSopenharmony_ci return false; 5542d43be4eSopenharmony_ci } 5552d43be4eSopenharmony_ci return true; 5562d43be4eSopenharmony_ci} 5572d43be4eSopenharmony_ci 5582d43be4eSopenharmony_cibool CellularDataHandler::CheckAttachAndSimState(sptr<ApnHolder> &apnHolder) 5592d43be4eSopenharmony_ci{ 5602d43be4eSopenharmony_ci if (apnHolder == nullptr) { 5612d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 5622d43be4eSopenharmony_ci return false; 5632d43be4eSopenharmony_ci } 5642d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 5652d43be4eSopenharmony_ci bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE; 5662d43be4eSopenharmony_ci bool isSimStateReadyOrLoaded = IsSimStateReadyOrLoaded(); 5672d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: attached: %{public}d simState: %{public}d isSimAccountLoaded: %{public}d " 5682d43be4eSopenharmony_ci "isRilApnAttached: %{public}d", slotId_, attached, isSimStateReadyOrLoaded, isSimAccountLoaded_, 5692d43be4eSopenharmony_ci isRilApnAttached_); 5702d43be4eSopenharmony_ci bool isEmergencyApn = apnHolder->IsEmergencyType(); 5712d43be4eSopenharmony_ci if (!isEmergencyApn && !attached) { 5722d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON, 5732d43be4eSopenharmony_ci CellularDataErrorCode::DATA_ERROR_PS_NOT_ATTACH, "It is not emergencyApn and not attached"); 5742d43be4eSopenharmony_ci return false; 5752d43be4eSopenharmony_ci } 5762d43be4eSopenharmony_ci if (!isEmergencyApn && !isSimStateReadyOrLoaded) { 5772d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON, 5782d43be4eSopenharmony_ci CellularDataErrorCode::DATA_ERROR_SIM_NOT_READY, "It is not emergencyApn and sim not ready"); 5792d43be4eSopenharmony_ci return false; 5802d43be4eSopenharmony_ci } 5812d43be4eSopenharmony_ci return isEmergencyApn || isSimAccountLoaded_; 5822d43be4eSopenharmony_ci} 5832d43be4eSopenharmony_ci 5842d43be4eSopenharmony_cibool CellularDataHandler::CheckRoamingState(sptr<ApnHolder> &apnHolder) 5852d43be4eSopenharmony_ci{ 5862d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr || apnHolder == nullptr) { 5872d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_); 5882d43be4eSopenharmony_ci return false; 5892d43be4eSopenharmony_ci } 5902d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 5912d43be4eSopenharmony_ci bool isEmergencyApn = apnHolder->IsEmergencyType(); 5922d43be4eSopenharmony_ci bool isMmsApn = apnHolder->IsMmsType(); 5932d43be4eSopenharmony_ci bool isAllowActiveData = dataSwitchSettings_->IsAllowActiveData(); 5942d43be4eSopenharmony_ci bool roamingState = coreInner.GetPsRoamingState(slotId_) > 0; 5952d43be4eSopenharmony_ci bool dataRoamingEnabled = dataSwitchSettings_->IsUserDataRoamingOn(); 5962d43be4eSopenharmony_ci if (roamingState && !dataRoamingEnabled) { 5972d43be4eSopenharmony_ci isAllowActiveData = false; 5982d43be4eSopenharmony_ci } else if (isMmsApn) { 5992d43be4eSopenharmony_ci isAllowActiveData = true; 6002d43be4eSopenharmony_ci } 6012d43be4eSopenharmony_ci if (isEmergencyApn) { 6022d43be4eSopenharmony_ci isAllowActiveData = true; 6032d43be4eSopenharmony_ci } 6042d43be4eSopenharmony_ci 6052d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 6062d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.isApnAllowedActive_) { 6072d43be4eSopenharmony_ci std::string apnHolderType = apnHolder->GetApnType(); 6082d43be4eSopenharmony_ci isAllowActiveData = 6092d43be4eSopenharmony_ci TELEPHONY_EXT_WRAPPER.isApnAllowedActive_(slotId_, apnHolderType.c_str(), isAllowActiveData); 6102d43be4eSopenharmony_ci } 6112d43be4eSopenharmony_ci#endif 6122d43be4eSopenharmony_ci 6132d43be4eSopenharmony_ci if (!isAllowActiveData) { 6142d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON, 6152d43be4eSopenharmony_ci CellularDataErrorCode::DATA_ERROR_ROAMING_SWITCH_OFF_AND_ROAMING, "Data roaming is not on and is roaming"); 6162d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_, 6172d43be4eSopenharmony_ci isAllowActiveData, lastCallState_); 6182d43be4eSopenharmony_ci return false; 6192d43be4eSopenharmony_ci } 6202d43be4eSopenharmony_ci if (IsRestrictedMode()) { 6212d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON, 6222d43be4eSopenharmony_ci CellularDataErrorCode::DATA_ERROR_CALL_AND_DATA_NOT_CONCURRENCY, 6232d43be4eSopenharmony_ci "CS call and data are not allowed concurrency"); 6242d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_, 6252d43be4eSopenharmony_ci isAllowActiveData, lastCallState_); 6262d43be4eSopenharmony_ci return false; 6272d43be4eSopenharmony_ci } 6282d43be4eSopenharmony_ci return true; 6292d43be4eSopenharmony_ci} 6302d43be4eSopenharmony_ci 6312d43be4eSopenharmony_cibool CellularDataHandler::CheckApnState(sptr<ApnHolder> &apnHolder) 6322d43be4eSopenharmony_ci{ 6332d43be4eSopenharmony_ci if (apnManager_ == nullptr || apnHolder == nullptr) { 6342d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ or apnManager_ is null", slotId_); 6352d43be4eSopenharmony_ci return false; 6362d43be4eSopenharmony_ci } 6372d43be4eSopenharmony_ci if (apnHolder->GetApnState() == PROFILE_STATE_DISCONNECTING && 6382d43be4eSopenharmony_ci !HasInnerEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION)) { 6392d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: APN holder is disconnecting", slotId_); 6402d43be4eSopenharmony_ci int32_t id = apnManager_->FindApnIdByApnName(apnHolder->GetApnType()); 6412d43be4eSopenharmony_ci SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id, ESTABLISH_DATA_CONNECTION_DELAY); 6422d43be4eSopenharmony_ci return false; 6432d43be4eSopenharmony_ci } 6442d43be4eSopenharmony_ci if (apnHolder->GetApnState() == PROFILE_STATE_RETRYING) { 6452d43be4eSopenharmony_ci TELEPHONY_LOGI("during retry, check state fail"); 6462d43be4eSopenharmony_ci return false; 6472d43be4eSopenharmony_ci } 6482d43be4eSopenharmony_ci if (apnHolder->GetApnState() == PROFILE_STATE_FAILED) { 6492d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_IDLE); 6502d43be4eSopenharmony_ci } 6512d43be4eSopenharmony_ci if (apnHolder->GetApnState() != PROFILE_STATE_IDLE) { 6522d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: APN holder is not idle, apn state is %{public}d", 6532d43be4eSopenharmony_ci slotId_, apnHolder->GetApnState()); 6542d43be4eSopenharmony_ci return false; 6552d43be4eSopenharmony_ci } 6562d43be4eSopenharmony_ci std::vector<sptr<ApnItem>> matchedApns = apnManager_->FilterMatchedApns(apnHolder->GetApnType(), slotId_); 6572d43be4eSopenharmony_ci if (matchedApns.empty()) { 6582d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: AttemptEstablishDataConnection:matchedApns is empty", slotId_); 6592d43be4eSopenharmony_ci return false; 6602d43be4eSopenharmony_ci } 6612d43be4eSopenharmony_ci apnHolder->SetAllMatchedApns(matchedApns); 6622d43be4eSopenharmony_ci return true; 6632d43be4eSopenharmony_ci} 6642d43be4eSopenharmony_ci 6652d43be4eSopenharmony_civoid CellularDataHandler::AttemptEstablishDataConnection(sptr<ApnHolder> &apnHolder) 6662d43be4eSopenharmony_ci{ 6672d43be4eSopenharmony_ci if (!CheckCellularDataSlotId(apnHolder) || !CheckAttachAndSimState(apnHolder) || !CheckRoamingState(apnHolder)) { 6682d43be4eSopenharmony_ci return; 6692d43be4eSopenharmony_ci } 6702d43be4eSopenharmony_ci DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->SetCellularDataActivateStartTime(); 6712d43be4eSopenharmony_ci StartTrace(HITRACE_TAG_OHOS, "ActivateCellularData"); 6722d43be4eSopenharmony_ci if (!CheckApnState(apnHolder)) { 6732d43be4eSopenharmony_ci FinishTrace(HITRACE_TAG_OHOS); 6742d43be4eSopenharmony_ci return; 6752d43be4eSopenharmony_ci } 6762d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 6772d43be4eSopenharmony_ci int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID); 6782d43be4eSopenharmony_ci coreInner.GetPsRadioTech(slotId_, radioTech); 6792d43be4eSopenharmony_ci if (!EstablishDataConnection(apnHolder, radioTech)) { 6802d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: Establish data connection fail", slotId_); 6812d43be4eSopenharmony_ci } 6822d43be4eSopenharmony_ci FinishTrace(HITRACE_TAG_OHOS); 6832d43be4eSopenharmony_ci DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->JudgingDataActivateTimeOut(slotId_, SWITCH_ON); 6842d43be4eSopenharmony_ci} 6852d43be4eSopenharmony_ci 6862d43be4eSopenharmony_cistd::shared_ptr<CellularDataStateMachine> CellularDataHandler::FindIdleCellularDataConnection() const 6872d43be4eSopenharmony_ci{ 6882d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 6892d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_); 6902d43be4eSopenharmony_ci return nullptr; 6912d43be4eSopenharmony_ci } 6922d43be4eSopenharmony_ci std::vector<std::shared_ptr<CellularDataStateMachine>> allMachines = connectionManager_->GetAllConnectionMachine(); 6932d43be4eSopenharmony_ci for (const std::shared_ptr<CellularDataStateMachine> &connect : allMachines) { 6942d43be4eSopenharmony_ci if (connect == nullptr || apnManager_ == nullptr) { 6952d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: CellularDataHandler:stateMachine or apnManager_ is null", slotId_); 6962d43be4eSopenharmony_ci return nullptr; 6972d43be4eSopenharmony_ci } 6982d43be4eSopenharmony_ci if (connect->IsInactiveState() && apnManager_->IsDataConnectionNotUsed(connect)) { 6992d43be4eSopenharmony_ci return connect; 7002d43be4eSopenharmony_ci } 7012d43be4eSopenharmony_ci } 7022d43be4eSopenharmony_ci return nullptr; 7032d43be4eSopenharmony_ci} 7042d43be4eSopenharmony_ci 7052d43be4eSopenharmony_cistd::shared_ptr<CellularDataStateMachine> CellularDataHandler::CreateCellularDataConnect() 7062d43be4eSopenharmony_ci{ 7072d43be4eSopenharmony_ci std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = std::make_shared<CellularDataStateMachine>( 7082d43be4eSopenharmony_ci connectionManager_, std::static_pointer_cast<TelEventHandler>(shared_from_this())); 7092d43be4eSopenharmony_ci if (cellularDataStateMachine == nullptr) { 7102d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_); 7112d43be4eSopenharmony_ci return nullptr; 7122d43be4eSopenharmony_ci } 7132d43be4eSopenharmony_ci return cellularDataStateMachine; 7142d43be4eSopenharmony_ci} 7152d43be4eSopenharmony_ci 7162d43be4eSopenharmony_cibool CellularDataHandler::EstablishDataConnection(sptr<ApnHolder> &apnHolder, int32_t radioTech) 7172d43be4eSopenharmony_ci{ 7182d43be4eSopenharmony_ci sptr<ApnItem> apnItem = apnHolder->GetNextRetryApn(); 7192d43be4eSopenharmony_ci if (apnItem == nullptr) { 7202d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnItem is null", slotId_); 7212d43be4eSopenharmony_ci return false; 7222d43be4eSopenharmony_ci } 7232d43be4eSopenharmony_ci std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = nullptr; 7242d43be4eSopenharmony_ci if (apnHolder->GetApnType() != DATA_CONTEXT_ROLE_DUN) { 7252d43be4eSopenharmony_ci cellularDataStateMachine = CheckForCompatibleDataConnection(apnHolder); 7262d43be4eSopenharmony_ci if (cellularDataStateMachine != nullptr) { 7272d43be4eSopenharmony_ci sptr<ApnItem> dcApnItem = cellularDataStateMachine->GetApnItem(); 7282d43be4eSopenharmony_ci if (dcApnItem != nullptr) { 7292d43be4eSopenharmony_ci apnItem = dcApnItem; 7302d43be4eSopenharmony_ci } 7312d43be4eSopenharmony_ci } 7322d43be4eSopenharmony_ci } 7332d43be4eSopenharmony_ci if (cellularDataStateMachine == nullptr) { 7342d43be4eSopenharmony_ci if (IsSingleConnectionEnabled(radioTech)) { 7352d43be4eSopenharmony_ci if (HasAnyHigherPriorityConnection(apnHolder)) { 7362d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: has higher priority connection", slotId_); 7372d43be4eSopenharmony_ci return false; 7382d43be4eSopenharmony_ci } 7392d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallApnState(); 7402d43be4eSopenharmony_ci if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || 7412d43be4eSopenharmony_ci apnState == ApnProfileState::PROFILE_STATE_CONNECTED) { 7422d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CHANGE_CONNECTION); 7432d43be4eSopenharmony_ci return false; 7442d43be4eSopenharmony_ci } 7452d43be4eSopenharmony_ci } 7462d43be4eSopenharmony_ci cellularDataStateMachine = FindIdleCellularDataConnection(); 7472d43be4eSopenharmony_ci if (cellularDataStateMachine == nullptr) { 7482d43be4eSopenharmony_ci cellularDataStateMachine = CreateCellularDataConnect(); 7492d43be4eSopenharmony_ci if (cellularDataStateMachine == nullptr) { 7502d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_); 7512d43be4eSopenharmony_ci return false; 7522d43be4eSopenharmony_ci } 7532d43be4eSopenharmony_ci cellularDataStateMachine->Init(); 7542d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 7552d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_); 7562d43be4eSopenharmony_ci return false; 7572d43be4eSopenharmony_ci } 7582d43be4eSopenharmony_ci connectionManager_->AddConnectionStateMachine(cellularDataStateMachine); 7592d43be4eSopenharmony_ci } 7602d43be4eSopenharmony_ci } 7612d43be4eSopenharmony_ci cellularDataStateMachine->SetCapability(apnHolder->GetCapability()); 7622d43be4eSopenharmony_ci apnHolder->SetCurrentApn(apnItem); 7632d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_CONNECTING); 7642d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(), 7652d43be4eSopenharmony_ci apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_CONNECTING)); 7662d43be4eSopenharmony_ci apnHolder->SetCellularDataStateMachine(cellularDataStateMachine); 7672d43be4eSopenharmony_ci bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0; 7682d43be4eSopenharmony_ci bool userDataRoaming = dataSwitchSettings_->IsUserDataRoamingOn(); 7692d43be4eSopenharmony_ci UpdateCellularDataConnectState(apnHolder->GetApnType()); 7702d43be4eSopenharmony_ci std::unique_ptr<DataConnectionParams> object = std::make_unique<DataConnectionParams>( 7712d43be4eSopenharmony_ci apnHolder, apnItem->attr_.profileId_, radioTech, roamingState, userDataRoaming, true); 7722d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: MSG_SM_CONNECT profileId:%{public}d type:%{public}s networkType:%{public}d", 7732d43be4eSopenharmony_ci slotId_, apnItem->attr_.profileId_, apnHolder->GetApnType().c_str(), radioTech); 7742d43be4eSopenharmony_ci InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_CONNECT, object); 7752d43be4eSopenharmony_ci if (event == nullptr) { 7762d43be4eSopenharmony_ci TELEPHONY_LOGE("event is null"); 7772d43be4eSopenharmony_ci return false; 7782d43be4eSopenharmony_ci } 7792d43be4eSopenharmony_ci cellularDataStateMachine->SendEvent(event); 7802d43be4eSopenharmony_ci return true; 7812d43be4eSopenharmony_ci} 7822d43be4eSopenharmony_ci 7832d43be4eSopenharmony_civoid CellularDataHandler::EstablishDataConnectionComplete(const InnerEvent::Pointer &event) 7842d43be4eSopenharmony_ci{ 7852d43be4eSopenharmony_ci if (event == nullptr) { 7862d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 7872d43be4eSopenharmony_ci return; 7882d43be4eSopenharmony_ci } 7892d43be4eSopenharmony_ci std::shared_ptr<SetupDataCallResultInfo> resultInfo = event->GetSharedObject<SetupDataCallResultInfo>(); 7902d43be4eSopenharmony_ci if ((resultInfo != nullptr) && (apnManager_ != nullptr)) { 7912d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnManager_->FindApnNameByApnId(resultInfo->flag)); 7922d43be4eSopenharmony_ci if (apnHolder == nullptr) { 7932d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: flag:%{public}d complete apnHolder is null", slotId_, resultInfo->flag); 7942d43be4eSopenharmony_ci return; 7952d43be4eSopenharmony_ci } 7962d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_CONNECTED); 7972d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(), 7982d43be4eSopenharmony_ci apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_CONNECTED)); 7992d43be4eSopenharmony_ci apnHolder->InitialApnRetryCount(); 8002d43be4eSopenharmony_ci std::shared_ptr<CellularDataStateMachine> stateMachine = apnHolder->GetCellularDataStateMachine(); 8012d43be4eSopenharmony_ci if (stateMachine != nullptr) { 8022d43be4eSopenharmony_ci std::string proxyIpAddress = ""; 8032d43be4eSopenharmony_ci sptr<ApnItem> attachApn = apnManager_->GetRilAttachApn(); 8042d43be4eSopenharmony_ci if (attachApn != nullptr) { 8052d43be4eSopenharmony_ci proxyIpAddress = attachApn->attr_.proxyIpAddress_; 8062d43be4eSopenharmony_ci } 8072d43be4eSopenharmony_ci stateMachine->UpdateHttpProxy(proxyIpAddress); 8082d43be4eSopenharmony_ci stateMachine->UpdateNetworkInfo(*resultInfo); 8092d43be4eSopenharmony_ci } else { 8102d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_IDLE); 8112d43be4eSopenharmony_ci TELEPHONY_LOGE( 8122d43be4eSopenharmony_ci "Slot%{public}d:update network info stateMachine(%{public}d) is null", slotId_, resultInfo->flag); 8132d43be4eSopenharmony_ci } 8142d43be4eSopenharmony_ci if (connectionManager_ != nullptr) { 8152d43be4eSopenharmony_ci connectionManager_->StartStallDetectionTimer(); 8162d43be4eSopenharmony_ci connectionManager_->BeginNetStatistics(); 8172d43be4eSopenharmony_ci } 8182d43be4eSopenharmony_ci if (!physicalConnectionActiveState_) { 8192d43be4eSopenharmony_ci physicalConnectionActiveState_ = true; 8202d43be4eSopenharmony_ci CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_); 8212d43be4eSopenharmony_ci } 8222d43be4eSopenharmony_ci if (incallDataStateMachine_ != nullptr) { 8232d43be4eSopenharmony_ci InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_CONNECTED); 8242d43be4eSopenharmony_ci incallDataStateMachine_->SendEvent(incallEvent); 8252d43be4eSopenharmony_ci } 8262d43be4eSopenharmony_ci UpdateCellularDataConnectState(apnHolder->GetApnType()); 8272d43be4eSopenharmony_ci UpdateApnInfo(apnHolder->GetCurrentApn()->attr_.profileId_); 8282d43be4eSopenharmony_ci } 8292d43be4eSopenharmony_ci} 8302d43be4eSopenharmony_ci 8312d43be4eSopenharmony_cistd::shared_ptr<DataShare::DataShareHelper> CellularDataHandler::CreatorDataShareHelper() 8322d43be4eSopenharmony_ci{ 8332d43be4eSopenharmony_ci sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 8342d43be4eSopenharmony_ci if (saManager == nullptr) { 8352d43be4eSopenharmony_ci TELEPHONY_LOGE("saManager is nullptr."); 8362d43be4eSopenharmony_ci return nullptr; 8372d43be4eSopenharmony_ci } 8382d43be4eSopenharmony_ci sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(TELEPHONY_CELLULAR_DATA_SYS_ABILITY_ID); 8392d43be4eSopenharmony_ci if (remoteObj == nullptr) { 8402d43be4eSopenharmony_ci TELEPHONY_LOGE("remoteObj is nullptr."); 8412d43be4eSopenharmony_ci return nullptr; 8422d43be4eSopenharmony_ci } 8432d43be4eSopenharmony_ci return DataShare::DataShareHelper::Creator(remoteObj, CELLULAR_DATA_RDB_URI); 8442d43be4eSopenharmony_ci} 8452d43be4eSopenharmony_ci 8462d43be4eSopenharmony_cibool CellularDataHandler::GetCurrentDataShareApnInfo(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, 8472d43be4eSopenharmony_ci const int32_t simId, int32_t &profileIdValue) 8482d43be4eSopenharmony_ci{ 8492d43be4eSopenharmony_ci Uri preferApnUri(std::string(CELLULAR_DATA_RDB_PREFER) + "?Proxy=true&simId=" + std::to_string(simId)); 8502d43be4eSopenharmony_ci DataShare::DataSharePredicates predicates; 8512d43be4eSopenharmony_ci std::vector<std::string> columns; 8522d43be4eSopenharmony_ci std::shared_ptr<DataShare::DataShareResultSet> resultSet = 8532d43be4eSopenharmony_ci dataShareHelper->Query(preferApnUri, predicates, columns); 8542d43be4eSopenharmony_ci if (resultSet == nullptr) { 8552d43be4eSopenharmony_ci TELEPHONY_LOGI("Query CurrentDataShareApnInfo resultSet is nullptr."); 8562d43be4eSopenharmony_ci return false; 8572d43be4eSopenharmony_ci } 8582d43be4eSopenharmony_ci int count = 0; 8592d43be4eSopenharmony_ci resultSet->GetRowCount(count); 8602d43be4eSopenharmony_ci if (count <= 0) { 8612d43be4eSopenharmony_ci TELEPHONY_LOGI("GetRowCount is NULL."); 8622d43be4eSopenharmony_ci resultSet->Close(); 8632d43be4eSopenharmony_ci return false; 8642d43be4eSopenharmony_ci } 8652d43be4eSopenharmony_ci int columnIndex = 0; 8662d43be4eSopenharmony_ci resultSet->GoToFirstRow(); 8672d43be4eSopenharmony_ci resultSet->GetColumnIndex(PdpProfileData::PROFILE_ID, columnIndex); 8682d43be4eSopenharmony_ci resultSet->GetInt(columnIndex, profileIdValue); 8692d43be4eSopenharmony_ci resultSet->Close(); 8702d43be4eSopenharmony_ci return true; 8712d43be4eSopenharmony_ci} 8722d43be4eSopenharmony_ci 8732d43be4eSopenharmony_civoid CellularDataHandler::UpdateApnInfo(const int32_t profileId) 8742d43be4eSopenharmony_ci{ 8752d43be4eSopenharmony_ci int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_); 8762d43be4eSopenharmony_ci if (simId <= INVALID_SIM_ID) { 8772d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId); 8782d43be4eSopenharmony_ci return; 8792d43be4eSopenharmony_ci } 8802d43be4eSopenharmony_ci std::shared_ptr<DataShare::DataShareHelper> dataShareHelper = CreatorDataShareHelper(); 8812d43be4eSopenharmony_ci if (dataShareHelper == nullptr) { 8822d43be4eSopenharmony_ci TELEPHONY_LOGE("dataShareHelper is nullptr."); 8832d43be4eSopenharmony_ci return; 8842d43be4eSopenharmony_ci } 8852d43be4eSopenharmony_ci int32_t profileIdValue = 0; 8862d43be4eSopenharmony_ci if (!GetCurrentDataShareApnInfo(dataShareHelper, simId, profileIdValue)) { 8872d43be4eSopenharmony_ci TELEPHONY_LOGE("GetCurrentDataShareApnInfo fail."); 8882d43be4eSopenharmony_ci dataShareHelper->Release(); 8892d43be4eSopenharmony_ci return; 8902d43be4eSopenharmony_ci } 8912d43be4eSopenharmony_ci if (profileIdValue != profileId) { 8922d43be4eSopenharmony_ci DataShare::DataSharePredicates predicates; 8932d43be4eSopenharmony_ci DataShare::DataShareValuesBucket values; 8942d43be4eSopenharmony_ci double profileIdAsDouble = static_cast<double>(profileId); 8952d43be4eSopenharmony_ci double simIdAsDouble = static_cast<double>(simId); 8962d43be4eSopenharmony_ci values.Put(PdpProfileData::PROFILE_ID, profileIdAsDouble); 8972d43be4eSopenharmony_ci values.Put(PdpProfileData::SIM_ID, simIdAsDouble); 8982d43be4eSopenharmony_ci Uri uri(CELLULAR_DATA_RDB_PREFER); 8992d43be4eSopenharmony_ci int32_t result = dataShareHelper->Update(uri, predicates, values); 9002d43be4eSopenharmony_ci if (result < TELEPHONY_ERR_SUCCESS) { 9012d43be4eSopenharmony_ci TELEPHONY_LOGE("UpdateApnInfo fail! result:%{public}d", result); 9022d43be4eSopenharmony_ci } 9032d43be4eSopenharmony_ci } 9042d43be4eSopenharmony_ci dataShareHelper->Release(); 9052d43be4eSopenharmony_ci} 9062d43be4eSopenharmony_ci 9072d43be4eSopenharmony_ciint32_t CellularDataHandler::GetSlotId() const 9082d43be4eSopenharmony_ci{ 9092d43be4eSopenharmony_ci return slotId_; 9102d43be4eSopenharmony_ci} 9112d43be4eSopenharmony_ci 9122d43be4eSopenharmony_civoid CellularDataHandler::DisconnectDataComplete(const InnerEvent::Pointer &event) 9132d43be4eSopenharmony_ci{ 9142d43be4eSopenharmony_ci if (event == nullptr || apnManager_ == nullptr || connectionManager_ == nullptr) { 9152d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event or apnManager or connectionManager_ is null", slotId_); 9162d43be4eSopenharmony_ci return; 9172d43be4eSopenharmony_ci } 9182d43be4eSopenharmony_ci auto netInfo = event->GetSharedObject<SetupDataCallResultInfo>(); 9192d43be4eSopenharmony_ci if (netInfo == nullptr) { 9202d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: netInfo is null", slotId_); 9212d43be4eSopenharmony_ci return; 9222d43be4eSopenharmony_ci } 9232d43be4eSopenharmony_ci int32_t apnId = netInfo->flag; 9242d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(apnId); 9252d43be4eSopenharmony_ci if (apnHolder == nullptr) { 9262d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null, apnId is %{public}d", slotId_, apnId); 9272d43be4eSopenharmony_ci return; 9282d43be4eSopenharmony_ci } 9292d43be4eSopenharmony_ci DisConnectionReason reason = ConnectionRetryPolicy::ConvertPdpErrorToDisconnReason(netInfo->reason); 9302d43be4eSopenharmony_ci auto stateMachine = apnHolder->GetCellularDataStateMachine(); 9312d43be4eSopenharmony_ci if (stateMachine == nullptr) { 9322d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_IDLE); 9332d43be4eSopenharmony_ci TELEPHONY_LOGE("stateMachine is null"); 9342d43be4eSopenharmony_ci return; 9352d43be4eSopenharmony_ci } 9362d43be4eSopenharmony_ci stateMachine->UpdateNetworkInfo(*netInfo); 9372d43be4eSopenharmony_ci connectionManager_->RemoveActiveConnectionByCid(stateMachine->GetCid()); 9382d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_IDLE); 9392d43be4eSopenharmony_ci apnHolder->SetCellularDataStateMachine(nullptr); 9402d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataConnectStateBehaviorEvent(slotId_, apnHolder->GetApnType(), 9412d43be4eSopenharmony_ci apnHolder->GetCapability(), static_cast<int32_t>(PROFILE_STATE_IDLE)); 9422d43be4eSopenharmony_ci UpdateCellularDataConnectState(apnHolder->GetApnType()); 9432d43be4eSopenharmony_ci UpdatePhysicalConnectionState(connectionManager_->isNoActiveConnection()); 9442d43be4eSopenharmony_ci if (apnHolder->IsDataCallEnabled()) { 9452d43be4eSopenharmony_ci RetryOrClearConnection(apnHolder, reason, netInfo); 9462d43be4eSopenharmony_ci } 9472d43be4eSopenharmony_ci if (!apnManager_->HasAnyConnectedState()) { 9482d43be4eSopenharmony_ci connectionManager_->StopStallDetectionTimer(); 9492d43be4eSopenharmony_ci connectionManager_->EndNetStatistics(); 9502d43be4eSopenharmony_ci if (incallDataStateMachine_ != nullptr) { 9512d43be4eSopenharmony_ci auto incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_DISCONNECTED); 9522d43be4eSopenharmony_ci incallDataStateMachine_->SendEvent(incallEvent); 9532d43be4eSopenharmony_ci } 9542d43be4eSopenharmony_ci } 9552d43be4eSopenharmony_ci if (reason == DisConnectionReason::REASON_CHANGE_CONNECTION) { 9562d43be4eSopenharmony_ci HandleSortConnection(); 9572d43be4eSopenharmony_ci } 9582d43be4eSopenharmony_ci} 9592d43be4eSopenharmony_ci 9602d43be4eSopenharmony_civoid CellularDataHandler::RetryOrClearConnection(const sptr<ApnHolder> &apnHolder, DisConnectionReason reason, 9612d43be4eSopenharmony_ci const std::shared_ptr<SetupDataCallResultInfo> &netInfo) 9622d43be4eSopenharmony_ci{ 9632d43be4eSopenharmony_ci if (apnHolder == nullptr || netInfo == nullptr) { 9642d43be4eSopenharmony_ci return; 9652d43be4eSopenharmony_ci } 9662d43be4eSopenharmony_ci RetryScene scene = static_cast<RetryScene>(netInfo->retryScene); 9672d43be4eSopenharmony_ci int64_t delayTime = apnHolder->GetRetryDelay(netInfo->reason, netInfo->retryTime, scene, slotId_); 9682d43be4eSopenharmony_ci if (reason == DisConnectionReason::REASON_CLEAR_CONNECTION) { 9692d43be4eSopenharmony_ci TELEPHONY_LOGI("clear connection"); 9702d43be4eSopenharmony_ci ClearConnection(apnHolder, reason); 9712d43be4eSopenharmony_ci } else if ((reason == DisConnectionReason::REASON_PERMANENT_REJECT) || (delayTime == INVALID_DELAY_NO_RETRY)) { 9722d43be4eSopenharmony_ci TELEPHONY_LOGI("permannent reject, mark bad and clear connection"); 9732d43be4eSopenharmony_ci apnHolder->MarkCurrentApnBad(); 9742d43be4eSopenharmony_ci ClearConnection(apnHolder, DisConnectionReason::REASON_CLEAR_CONNECTION); 9752d43be4eSopenharmony_ci } else if (reason == DisConnectionReason::REASON_RETRY_CONNECTION) { 9762d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_RETRYING); 9772d43be4eSopenharmony_ci TELEPHONY_LOGI("cid=%{public}d, cause=%{public}d, suggest=%{public}d, delay=%{public}lld, scene=%{public}d", 9782d43be4eSopenharmony_ci netInfo->cid, netInfo->reason, netInfo->retryTime, static_cast<long long>(delayTime), netInfo->retryScene); 9792d43be4eSopenharmony_ci SendEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL, netInfo->flag, delayTime); 9802d43be4eSopenharmony_ci } 9812d43be4eSopenharmony_ci} 9822d43be4eSopenharmony_ci 9832d43be4eSopenharmony_civoid CellularDataHandler::RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer &event) 9842d43be4eSopenharmony_ci{ 9852d43be4eSopenharmony_ci int32_t apnId = event->GetParam(); 9862d43be4eSopenharmony_ci auto apnHolder = apnManager_->FindApnHolderById(apnId); 9872d43be4eSopenharmony_ci if (apnHolder == nullptr || apnHolder->GetApnState() != PROFILE_STATE_RETRYING) { 9882d43be4eSopenharmony_ci return; 9892d43be4eSopenharmony_ci } 9902d43be4eSopenharmony_ci TELEPHONY_LOGI("apnId=%{public}d, state=%{public}d", apnId, apnHolder->GetApnState()); 9912d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_IDLE); 9922d43be4eSopenharmony_ci SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, 0); 9932d43be4eSopenharmony_ci} 9942d43be4eSopenharmony_ci 9952d43be4eSopenharmony_civoid CellularDataHandler::UpdatePhysicalConnectionState(bool noActiveConnection) 9962d43be4eSopenharmony_ci{ 9972d43be4eSopenharmony_ci if (noActiveConnection && physicalConnectionActiveState_) { 9982d43be4eSopenharmony_ci physicalConnectionActiveState_ = false; 9992d43be4eSopenharmony_ci CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_); 10002d43be4eSopenharmony_ci } else if (!noActiveConnection && !physicalConnectionActiveState_) { 10012d43be4eSopenharmony_ci physicalConnectionActiveState_ = true; 10022d43be4eSopenharmony_ci CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_); 10032d43be4eSopenharmony_ci } 10042d43be4eSopenharmony_ci} 10052d43be4eSopenharmony_ci 10062d43be4eSopenharmony_civoid CellularDataHandler::HandleSortConnection() 10072d43be4eSopenharmony_ci{ 10082d43be4eSopenharmony_ci ApnProfileState state = apnManager_->GetOverallApnState(); 10092d43be4eSopenharmony_ci if (state == PROFILE_STATE_IDLE || state == PROFILE_STATE_FAILED) { 10102d43be4eSopenharmony_ci for (const sptr<ApnHolder> &sortApnHolder : apnManager_->GetSortApnHolder()) { 10112d43be4eSopenharmony_ci if (sortApnHolder->IsDataCallEnabled()) { 10122d43be4eSopenharmony_ci int32_t apnId = apnManager_->FindApnIdByApnName(sortApnHolder->GetApnType()); 10132d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: HandleSortConnection the apn type is %{public}s", slotId_, 10142d43be4eSopenharmony_ci sortApnHolder->GetApnType().c_str()); 10152d43be4eSopenharmony_ci SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, 0); 10162d43be4eSopenharmony_ci break; 10172d43be4eSopenharmony_ci } 10182d43be4eSopenharmony_ci } 10192d43be4eSopenharmony_ci } 10202d43be4eSopenharmony_ci} 10212d43be4eSopenharmony_ci 10222d43be4eSopenharmony_civoid CellularDataHandler::MsgEstablishDataConnection(const InnerEvent::Pointer &event) 10232d43be4eSopenharmony_ci{ 10242d43be4eSopenharmony_ci if (apnManager_ == nullptr || event == nullptr) { 10252d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_); 10262d43be4eSopenharmony_ci return; 10272d43be4eSopenharmony_ci } 10282d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(event->GetParam()); 10292d43be4eSopenharmony_ci if (apnHolder == nullptr) { 10302d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 10312d43be4eSopenharmony_ci return; 10322d43be4eSopenharmony_ci } 10332d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: APN holder type:%{public}s call:%{public}d", slotId_, 10342d43be4eSopenharmony_ci apnHolder->GetApnType().c_str(), apnHolder->IsDataCallEnabled()); 10352d43be4eSopenharmony_ci if (apnHolder->IsMmsType()) { 10362d43be4eSopenharmony_ci SetDataPermittedForMms(apnHolder->IsDataCallEnabled()); 10372d43be4eSopenharmony_ci } 10382d43be4eSopenharmony_ci if (apnHolder->IsDataCallEnabled()) { 10392d43be4eSopenharmony_ci AttemptEstablishDataConnection(apnHolder); 10402d43be4eSopenharmony_ci } else { 10412d43be4eSopenharmony_ci DisConnectionReason reason = DisConnectionReason::REASON_CHANGE_CONNECTION; 10422d43be4eSopenharmony_ci int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID); 10432d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, radioTech); 10442d43be4eSopenharmony_ci if (!IsSingleConnectionEnabled(radioTech)) { 10452d43be4eSopenharmony_ci reason = DisConnectionReason::REASON_CLEAR_CONNECTION; 10462d43be4eSopenharmony_ci } 10472d43be4eSopenharmony_ci ClearConnection(apnHolder, reason); 10482d43be4eSopenharmony_ci } 10492d43be4eSopenharmony_ci} 10502d43be4eSopenharmony_ci 10512d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 10522d43be4eSopenharmony_cibool CellularDataHandler::IsSimRequestNetOnVSimEnabled(int32_t reqType, bool isMmsType) const 10532d43be4eSopenharmony_ci{ 10542d43be4eSopenharmony_ci if (reqType == TYPE_REQUEST_NET) { 10552d43be4eSopenharmony_ci if (slotId_ != CELLULAR_DATA_VSIM_SLOT_ID && 10562d43be4eSopenharmony_ci TELEPHONY_EXT_WRAPPER.isVSimEnabled_ && TELEPHONY_EXT_WRAPPER.isVSimEnabled_() && !isMmsType) { 10572d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d, VSimEnabled & not mms type", slotId_); 10582d43be4eSopenharmony_ci return true; 10592d43be4eSopenharmony_ci } 10602d43be4eSopenharmony_ci } 10612d43be4eSopenharmony_ci return false; 10622d43be4eSopenharmony_ci} 10632d43be4eSopenharmony_ci#endif 10642d43be4eSopenharmony_ci 10652d43be4eSopenharmony_civoid CellularDataHandler::SetNetRequest(NetRequest &request, const std::unique_ptr<NetRequest> &netRequest) 10662d43be4eSopenharmony_ci{ 10672d43be4eSopenharmony_ci request.ident = netRequest->ident; 10682d43be4eSopenharmony_ci request.capability = netRequest->capability; 10692d43be4eSopenharmony_ci request.registerType = netRequest->registerType; 10702d43be4eSopenharmony_ci request.bearTypes = netRequest->bearTypes; 10712d43be4eSopenharmony_ci request.uid = netRequest->uid; 10722d43be4eSopenharmony_ci} 10732d43be4eSopenharmony_ci 10742d43be4eSopenharmony_civoid CellularDataHandler::SendEstablishDataConnectionEvent(int32_t id) 10752d43be4eSopenharmony_ci{ 10762d43be4eSopenharmony_ci InnerEvent::Pointer innerEvent = InnerEvent::Get(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id); 10772d43be4eSopenharmony_ci if (!SendEvent(innerEvent)) { 10782d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: send data connection event failed", slotId_); 10792d43be4eSopenharmony_ci } 10802d43be4eSopenharmony_ci} 10812d43be4eSopenharmony_ci 10822d43be4eSopenharmony_civoid CellularDataHandler::MsgRequestNetwork(const InnerEvent::Pointer &event) 10832d43be4eSopenharmony_ci{ 10842d43be4eSopenharmony_ci if (apnManager_ == nullptr || event == nullptr) { 10852d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_); 10862d43be4eSopenharmony_ci return; 10872d43be4eSopenharmony_ci } 10882d43be4eSopenharmony_ci std::unique_ptr<NetRequest> netRequest = event->GetUniqueObject<NetRequest>(); 10892d43be4eSopenharmony_ci if (netRequest == nullptr) { 10902d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: netRequest is null", slotId_); 10912d43be4eSopenharmony_ci return; 10922d43be4eSopenharmony_ci } 10932d43be4eSopenharmony_ci NetRequest request; 10942d43be4eSopenharmony_ci SetNetRequest(request, netRequest); 10952d43be4eSopenharmony_ci int32_t id = ApnManager::FindApnIdByCapability(request.capability); 10962d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id); 10972d43be4eSopenharmony_ci if (apnHolder == nullptr) { 10982d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null.", slotId_); 10992d43be4eSopenharmony_ci return; 11002d43be4eSopenharmony_ci } 11012d43be4eSopenharmony_ci 11022d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 11032d43be4eSopenharmony_ci if (IsSimRequestNetOnVSimEnabled(event->GetParam(), apnHolder->IsMmsType())) { 11042d43be4eSopenharmony_ci return; 11052d43be4eSopenharmony_ci } 11062d43be4eSopenharmony_ci#endif 11072d43be4eSopenharmony_ci 11082d43be4eSopenharmony_ci bool isAllCellularDataAllowed = true; 11092d43be4eSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT 11102d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.isAllCellularDataAllowed_) { 11112d43be4eSopenharmony_ci isAllCellularDataAllowed = 11122d43be4eSopenharmony_ci TELEPHONY_EXT_WRAPPER.isAllCellularDataAllowed_(request, apnHolder->GetUidStatus()); 11132d43be4eSopenharmony_ci } 11142d43be4eSopenharmony_ci#endif 11152d43be4eSopenharmony_ci WriteEventCellularRequest(request, event->GetParam()); 11162d43be4eSopenharmony_ci if (isAllCellularDataAllowed) { 11172d43be4eSopenharmony_ci TELEPHONY_LOGD("allow cellular data"); 11182d43be4eSopenharmony_ci if (event->GetParam() == TYPE_REQUEST_NET) { 11192d43be4eSopenharmony_ci apnHolder->RequestCellularData(request); 11202d43be4eSopenharmony_ci } else { 11212d43be4eSopenharmony_ci if (!apnHolder->ReleaseCellularData(request)) { 11222d43be4eSopenharmony_ci return; 11232d43be4eSopenharmony_ci } 11242d43be4eSopenharmony_ci } 11252d43be4eSopenharmony_ci } else { 11262d43be4eSopenharmony_ci if (event->GetParam() == TYPE_REQUEST_NET) { 11272d43be4eSopenharmony_ci TELEPHONY_LOGD("not allow reqeust cellular data because of in controled"); 11282d43be4eSopenharmony_ci return; 11292d43be4eSopenharmony_ci } else { 11302d43be4eSopenharmony_ci TELEPHONY_LOGI("release all cellular data"); 11312d43be4eSopenharmony_ci apnHolder->ReleaseAllCellularData(); 11322d43be4eSopenharmony_ci } 11332d43be4eSopenharmony_ci } 11342d43be4eSopenharmony_ci SendEstablishDataConnectionEvent(id); 11352d43be4eSopenharmony_ci} 11362d43be4eSopenharmony_ci 11372d43be4eSopenharmony_cibool CellularDataHandler::WriteEventCellularRequest(NetRequest request, int32_t state) 11382d43be4eSopenharmony_ci{ 11392d43be4eSopenharmony_ci if (request.capability == NetCap::NET_CAPABILITY_INTERNET && 11402d43be4eSopenharmony_ci (request.bearTypes & (1ULL << NetBearType::BEARER_CELLULAR)) != 0) { 11412d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteCellularRequestBehaviorEvent( 11422d43be4eSopenharmony_ci request.uid, request.ident, request.registerType, state); 11432d43be4eSopenharmony_ci return true; 11442d43be4eSopenharmony_ci } 11452d43be4eSopenharmony_ci return false; 11462d43be4eSopenharmony_ci} 11472d43be4eSopenharmony_ci 11482d43be4eSopenharmony_civoid CellularDataHandler::ProcessEvent(const InnerEvent::Pointer &event) 11492d43be4eSopenharmony_ci{ 11502d43be4eSopenharmony_ci if (event == nullptr) { 11512d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null!", slotId_); 11522d43be4eSopenharmony_ci return; 11532d43be4eSopenharmony_ci } 11542d43be4eSopenharmony_ci uint32_t eventCode = event->GetInnerEventId(); 11552d43be4eSopenharmony_ci std::map<uint32_t, Fun>::iterator it = eventIdMap_.find(eventCode); 11562d43be4eSopenharmony_ci if (it != eventIdMap_.end()) { 11572d43be4eSopenharmony_ci it->second(event); 11582d43be4eSopenharmony_ci } 11592d43be4eSopenharmony_ci} 11602d43be4eSopenharmony_ci 11612d43be4eSopenharmony_civoid CellularDataHandler::OnReceiveEvent(const EventFwk::CommonEventData &data) 11622d43be4eSopenharmony_ci{ 11632d43be4eSopenharmony_ci const AAFwk::Want &want = data.GetWant(); 11642d43be4eSopenharmony_ci std::string action = want.GetAction(); 11652d43be4eSopenharmony_ci int32_t slotId = want.GetIntParam("slotId", 0); 11662d43be4eSopenharmony_ci TELEPHONY_LOGI("[slot%{public}d] action=%{public}s code=%{public}d", slotId_, action.c_str(), data.GetCode()); 11672d43be4eSopenharmony_ci if (EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED == action) { 11682d43be4eSopenharmony_ci if (slotId_ != slotId) { 11692d43be4eSopenharmony_ci return; 11702d43be4eSopenharmony_ci } 11712d43be4eSopenharmony_ci int32_t state = want.GetIntParam("state", CALL_STATUS_UNKNOWN); 11722d43be4eSopenharmony_ci if (state == CALL_STATUS_UNKNOWN) { 11732d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: unknown call state=%{public}d", slotId, state); 11742d43be4eSopenharmony_ci return; 11752d43be4eSopenharmony_ci } 11762d43be4eSopenharmony_ci HandleCallChanged(state); 11772d43be4eSopenharmony_ci } else if (action == CommonEventSupport::COMMON_EVENT_SIM_CARD_DEFAULT_DATA_SUBSCRIPTION_CHANGED) { 11782d43be4eSopenharmony_ci HandleDefaultDataSubscriptionChanged(); 11792d43be4eSopenharmony_ci } else if (action == CommonEventSupport::COMMON_EVENT_OPERATOR_CONFIG_CHANGED) { 11802d43be4eSopenharmony_ci if (slotId_ != slotId) { 11812d43be4eSopenharmony_ci return; 11822d43be4eSopenharmony_ci } 11832d43be4eSopenharmony_ci GetConfigurationFor5G(); 11842d43be4eSopenharmony_ci } else if (action == CommonEventSupport::COMMON_EVENT_SCREEN_ON) { 11852d43be4eSopenharmony_ci if (slotId_ != slotId) { 11862d43be4eSopenharmony_ci return; 11872d43be4eSopenharmony_ci } 11882d43be4eSopenharmony_ci HandleScreenStateChanged(true); 11892d43be4eSopenharmony_ci } else if (action == CommonEventSupport::COMMON_EVENT_SCREEN_OFF) { 11902d43be4eSopenharmony_ci if (slotId_ != slotId) { 11912d43be4eSopenharmony_ci return; 11922d43be4eSopenharmony_ci } 11932d43be4eSopenharmony_ci HandleScreenStateChanged(false); 11942d43be4eSopenharmony_ci } else if (action == CommonEventSupport::COMMON_EVENT_DATA_SHARE_READY) { 11952d43be4eSopenharmony_ci RegisterDataSettingObserver(); 11962d43be4eSopenharmony_ci } else { 11972d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: action=%{public}s code=%{public}d", slotId_, action.c_str(), data.GetCode()); 11982d43be4eSopenharmony_ci } 11992d43be4eSopenharmony_ci} 12002d43be4eSopenharmony_ci 12012d43be4eSopenharmony_civoid CellularDataHandler::HandleScreenStateChanged(bool isScreenOn) const 12022d43be4eSopenharmony_ci{ 12032d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 12042d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null!", slotId_); 12052d43be4eSopenharmony_ci return; 12062d43be4eSopenharmony_ci } 12072d43be4eSopenharmony_ci connectionManager_->HandleScreenStateChanged(isScreenOn); 12082d43be4eSopenharmony_ci} 12092d43be4eSopenharmony_ci 12102d43be4eSopenharmony_cibool CellularDataHandler::IsSimStateReadyOrLoaded() 12112d43be4eSopenharmony_ci{ 12122d43be4eSopenharmony_ci SimState simState = SimState::SIM_STATE_UNKNOWN; 12132d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 12142d43be4eSopenharmony_ci coreInner.GetSimState(slotId_, simState); 12152d43be4eSopenharmony_ci return (simState == SimState::SIM_STATE_READY || simState == SimState::SIM_STATE_LOADED); 12162d43be4eSopenharmony_ci} 12172d43be4eSopenharmony_ci 12182d43be4eSopenharmony_civoid CellularDataHandler::UpdateCellularDataConnectState(const std::string &apnType) 12192d43be4eSopenharmony_ci{ 12202d43be4eSopenharmony_ci int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID); 12212d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType); 12222d43be4eSopenharmony_ci if (apnType == DATA_CONTEXT_ROLE_DEFAULT || apnType == DATA_CONTEXT_ROLE_INTERNAL_DEFAULT) { 12232d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallDefaultApnState(); 12242d43be4eSopenharmony_ci StateNotification::GetInstance().UpdateCellularDataConnectState(slotId_, apnState, networkType); 12252d43be4eSopenharmony_ci } 12262d43be4eSopenharmony_ci} 12272d43be4eSopenharmony_ci 12282d43be4eSopenharmony_civoid CellularDataHandler::HandleSettingSwitchChanged(const InnerEvent::Pointer &event) 12292d43be4eSopenharmony_ci{ 12302d43be4eSopenharmony_ci if (event == nullptr) { 12312d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 12322d43be4eSopenharmony_ci return; 12332d43be4eSopenharmony_ci } 12342d43be4eSopenharmony_ci bool setting_switch = event->GetParam(); 12352d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: setting switch = %{public}d", slotId_, setting_switch); 12362d43be4eSopenharmony_ci} 12372d43be4eSopenharmony_ci 12382d43be4eSopenharmony_civoid CellularDataHandler::HandleDBSettingIncallChanged(const AppExecFwk::InnerEvent::Pointer &event) 12392d43be4eSopenharmony_ci{ 12402d43be4eSopenharmony_ci if (event == nullptr) { 12412d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 12422d43be4eSopenharmony_ci return; 12432d43be4eSopenharmony_ci } 12442d43be4eSopenharmony_ci if (incallDataStateMachine_ == nullptr) { 12452d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine_ is null", slotId_); 12462d43be4eSopenharmony_ci return; 12472d43be4eSopenharmony_ci } 12482d43be4eSopenharmony_ci int64_t value = event->GetParam(); 12492d43be4eSopenharmony_ci if (value == static_cast<int64_t>(DataSwitchCode::CELLULAR_DATA_ENABLED)) { 12502d43be4eSopenharmony_ci InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON); 12512d43be4eSopenharmony_ci incallDataStateMachine_->SendEvent(incallEvent); 12522d43be4eSopenharmony_ci } else { 12532d43be4eSopenharmony_ci InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_OFF); 12542d43be4eSopenharmony_ci incallDataStateMachine_->SendEvent(incallEvent); 12552d43be4eSopenharmony_ci } 12562d43be4eSopenharmony_ci} 12572d43be4eSopenharmony_ci 12582d43be4eSopenharmony_cistd::shared_ptr<IncallDataStateMachine> CellularDataHandler::CreateIncallDataStateMachine(int32_t callState) 12592d43be4eSopenharmony_ci{ 12602d43be4eSopenharmony_ci std::shared_ptr<IncallDataStateMachine> incallDataStateMachine = std::make_shared<IncallDataStateMachine>(slotId_, 12612d43be4eSopenharmony_ci std::weak_ptr<TelEventHandler>(std::static_pointer_cast<TelEventHandler>(shared_from_this())), apnManager_); 12622d43be4eSopenharmony_ci if (incallDataStateMachine == nullptr) { 12632d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine is null", slotId_); 12642d43be4eSopenharmony_ci return nullptr; 12652d43be4eSopenharmony_ci } 12662d43be4eSopenharmony_ci incallDataStateMachine->Init(callState); 12672d43be4eSopenharmony_ci return incallDataStateMachine; 12682d43be4eSopenharmony_ci} 12692d43be4eSopenharmony_ci 12702d43be4eSopenharmony_civoid CellularDataHandler::IncallDataComplete(const InnerEvent::Pointer &event) 12712d43be4eSopenharmony_ci{ 12722d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: MSG_INCALL_DATA_COMPLETE", slotId_); 12732d43be4eSopenharmony_ci if (incallDataStateMachine_ != nullptr) { 12742d43be4eSopenharmony_ci incallDataStateMachine_ = nullptr; 12752d43be4eSopenharmony_ci } 12762d43be4eSopenharmony_ci} 12772d43be4eSopenharmony_ci 12782d43be4eSopenharmony_civoid CellularDataHandler::HandleCallChanged(int32_t state) 12792d43be4eSopenharmony_ci{ 12802d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: lastState:%{public}d, state:%{public}d", slotId_, lastCallState_, state); 12812d43be4eSopenharmony_ci if (lastCallState_ == state) { 12822d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: call state=%{public}d, not changed", slotId_, state); 12832d43be4eSopenharmony_ci return; 12842d43be4eSopenharmony_ci } 12852d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 12862d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null!", slotId_); 12872d43be4eSopenharmony_ci return; 12882d43be4eSopenharmony_ci } 12892d43be4eSopenharmony_ci lastCallState_ = state; 12902d43be4eSopenharmony_ci connectionManager_->UpdateCallState(state); 12912d43be4eSopenharmony_ci ImsRegInfo voiceInfo; 12922d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VOICE, voiceInfo); 12932d43be4eSopenharmony_ci ImsRegInfo videoInfo; 12942d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VIDEO, videoInfo); 12952d43be4eSopenharmony_ci if (voiceInfo.imsRegState == ImsRegState::IMS_REGISTERED || videoInfo.imsRegState == ImsRegState::IMS_REGISTERED) { 12962d43be4eSopenharmony_ci HandleImsCallChanged(state); 12972d43be4eSopenharmony_ci } else { 12982d43be4eSopenharmony_ci HandleVoiceCallChanged(state); 12992d43be4eSopenharmony_ci } 13002d43be4eSopenharmony_ci} 13012d43be4eSopenharmony_ci 13022d43be4eSopenharmony_civoid CellularDataHandler::HandleImsCallChanged(int32_t state) 13032d43be4eSopenharmony_ci{ 13042d43be4eSopenharmony_ci if (state == TelCallStatus::CALL_STATUS_DIALING || state == TelCallStatus::CALL_STATUS_INCOMING) { 13052d43be4eSopenharmony_ci if (incallDataStateMachine_ == nullptr) { 13062d43be4eSopenharmony_ci incallDataStateMachine_ = CreateIncallDataStateMachine(state); 13072d43be4eSopenharmony_ci } 13082d43be4eSopenharmony_ci } 13092d43be4eSopenharmony_ci if (incallDataStateMachine_ == nullptr) { 13102d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: incallDataStateMachine_ is null!", slotId_); 13112d43be4eSopenharmony_ci return; 13122d43be4eSopenharmony_ci } 13132d43be4eSopenharmony_ci incallDataStateMachine_->UpdateCallState(state); 13142d43be4eSopenharmony_ci if (state == TelCallStatus::CALL_STATUS_DIALING || state == TelCallStatus::CALL_STATUS_INCOMING) { 13152d43be4eSopenharmony_ci InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_STARTED); 13162d43be4eSopenharmony_ci incallDataStateMachine_->SendEvent(incallEvent); 13172d43be4eSopenharmony_ci } 13182d43be4eSopenharmony_ci if (state == TelCallStatus::CALL_STATUS_DISCONNECTED || state == TelCallStatus::CALL_STATUS_IDLE) { 13192d43be4eSopenharmony_ci InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_ENDED); 13202d43be4eSopenharmony_ci incallDataStateMachine_->SendEvent(incallEvent); 13212d43be4eSopenharmony_ci } 13222d43be4eSopenharmony_ci} 13232d43be4eSopenharmony_ci 13242d43be4eSopenharmony_civoid CellularDataHandler::HandleVoiceCallChanged(int32_t state) 13252d43be4eSopenharmony_ci{ 13262d43be4eSopenharmony_ci if (apnManager_ == nullptr || connectionManager_ == nullptr) { 13272d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager or connectionManager is null!", slotId_); 13282d43be4eSopenharmony_ci return; 13292d43be4eSopenharmony_ci } 13302d43be4eSopenharmony_ci // next to check if radio technology support voice and data at same time. 13312d43be4eSopenharmony_ci int32_t psRadioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID); 13322d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, psRadioTech); 13332d43be4eSopenharmony_ci bool support = (psRadioTech == static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_GSM)); 13342d43be4eSopenharmony_ci if (state != TelCallStatus::CALL_STATUS_IDLE && state != TelCallStatus::CALL_STATUS_DISCONNECTED) { 13352d43be4eSopenharmony_ci if (apnManager_->HasAnyConnectedState() && support) { 13362d43be4eSopenharmony_ci connectionManager_->EndNetStatistics(); 13372d43be4eSopenharmony_ci connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_DORMANT); 13382d43be4eSopenharmony_ci connectionManager_->StopStallDetectionTimer(); 13392d43be4eSopenharmony_ci disconnectionReason_ = DisConnectionReason::REASON_GSM_AND_CALLING_ONLY; 13402d43be4eSopenharmony_ci } 13412d43be4eSopenharmony_ci } else { 13422d43be4eSopenharmony_ci if (apnManager_->HasAnyConnectedState() && support) { 13432d43be4eSopenharmony_ci connectionManager_->StartStallDetectionTimer(); 13442d43be4eSopenharmony_ci connectionManager_->BeginNetStatistics(); 13452d43be4eSopenharmony_ci } 13462d43be4eSopenharmony_ci disconnectionReason_ = DisConnectionReason::REASON_NORMAL; 13472d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: HandleVoiceCallChanged EstablishAllApnsIfConnectable", slotId_); 13482d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 13492d43be4eSopenharmony_ci } 13502d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: disconnectionReason_=%{public}d", slotId_, disconnectionReason_); 13512d43be4eSopenharmony_ci} 13522d43be4eSopenharmony_ci 13532d43be4eSopenharmony_civoid CellularDataHandler::HandleDefaultDataSubscriptionChanged() 13542d43be4eSopenharmony_ci{ 13552d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d", slotId_); 13562d43be4eSopenharmony_ci if (CheckDataPermittedByDsds()) { 13572d43be4eSopenharmony_ci SetDataPermitted(slotId_, true); 13582d43be4eSopenharmony_ci } else { 13592d43be4eSopenharmony_ci SetDataPermitted(slotId_, false); 13602d43be4eSopenharmony_ci } 13612d43be4eSopenharmony_ci if (dataSwitchSettings_ != nullptr) { 13622d43be4eSopenharmony_ci dataSwitchSettings_->LoadSwitchValue(); 13632d43be4eSopenharmony_ci } 13642d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 13652d43be4eSopenharmony_ci const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId(); 13662d43be4eSopenharmony_ci if (defSlotId == slotId_) { 13672d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 13682d43be4eSopenharmony_ci } else { 13692d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 13702d43be4eSopenharmony_ci } 13712d43be4eSopenharmony_ci} 13722d43be4eSopenharmony_ci 13732d43be4eSopenharmony_civoid CellularDataHandler::ReleaseAllNetworkRequest() 13742d43be4eSopenharmony_ci{ 13752d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 13762d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_); 13772d43be4eSopenharmony_ci return; 13782d43be4eSopenharmony_ci } 13792d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) { 13802d43be4eSopenharmony_ci if (apnHolder == nullptr) { 13812d43be4eSopenharmony_ci continue; 13822d43be4eSopenharmony_ci } 13832d43be4eSopenharmony_ci apnHolder->ReleaseAllCellularData(); 13842d43be4eSopenharmony_ci } 13852d43be4eSopenharmony_ci} 13862d43be4eSopenharmony_ci 13872d43be4eSopenharmony_civoid CellularDataHandler::HandleSimStateChanged() 13882d43be4eSopenharmony_ci{ 13892d43be4eSopenharmony_ci SimState simState = SimState::SIM_STATE_UNKNOWN; 13902d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimState(slotId_, simState); 13912d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: sim state is :%{public}d", slotId_, simState); 13922d43be4eSopenharmony_ci if (simState == SimState::SIM_STATE_READY) { 13932d43be4eSopenharmony_ci std::u16string iccId; 13942d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId); 13952d43be4eSopenharmony_ci if (lastIccId_ != u"" && lastIccId_ == iccId) { 13962d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 13972d43be4eSopenharmony_ci } 13982d43be4eSopenharmony_ci } else if (simState != SimState::SIM_STATE_LOADED) { 13992d43be4eSopenharmony_ci isRilApnAttached_ = false; 14002d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 14012d43be4eSopenharmony_ci if (simState == SimState::SIM_STATE_NOT_PRESENT) { 14022d43be4eSopenharmony_ci CellularDataNetAgent::GetInstance().UnregisterNetSupplierForSimUpdate(slotId_); 14032d43be4eSopenharmony_ci ReleaseAllNetworkRequest(); 14042d43be4eSopenharmony_ci UnRegisterDataSettingObserver(); 14052d43be4eSopenharmony_ci } 14062d43be4eSopenharmony_ci } 14072d43be4eSopenharmony_ci} 14082d43be4eSopenharmony_ci 14092d43be4eSopenharmony_civoid CellularDataHandler::HandleRecordsChanged() 14102d43be4eSopenharmony_ci{ 14112d43be4eSopenharmony_ci std::u16string iccId; 14122d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId); 14132d43be4eSopenharmony_ci if (iccId == u"") { 14142d43be4eSopenharmony_ci TELEPHONY_LOGI("iccId nullptr"); 14152d43be4eSopenharmony_ci return; 14162d43be4eSopenharmony_ci } 14172d43be4eSopenharmony_ci if (iccId != lastIccId_) { 14182d43be4eSopenharmony_ci if (dataSwitchSettings_ != nullptr) { 14192d43be4eSopenharmony_ci dataSwitchSettings_->SetPolicyDataOn(true); 14202d43be4eSopenharmony_ci } 14212d43be4eSopenharmony_ci lastIccId_ = iccId; 14222d43be4eSopenharmony_ci } 14232d43be4eSopenharmony_ci GetConfigurationFor5G(); 14242d43be4eSopenharmony_ci CreateApnItem(); 14252d43be4eSopenharmony_ci SetRilAttachApn(); 14262d43be4eSopenharmony_ci ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_CHANGE_CONNECTION); 14272d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 14282d43be4eSopenharmony_ci} 14292d43be4eSopenharmony_ci 14302d43be4eSopenharmony_civoid CellularDataHandler::HandleSimEvent(const AppExecFwk::InnerEvent::Pointer &event) 14312d43be4eSopenharmony_ci{ 14322d43be4eSopenharmony_ci if (event == nullptr) { 14332d43be4eSopenharmony_ci return; 14342d43be4eSopenharmony_ci } 14352d43be4eSopenharmony_ci auto slotId = event->GetParam(); 14362d43be4eSopenharmony_ci if (slotId != slotId_) { 14372d43be4eSopenharmony_ci return; 14382d43be4eSopenharmony_ci } 14392d43be4eSopenharmony_ci if (dataSwitchSettings_ != nullptr) { 14402d43be4eSopenharmony_ci dataSwitchSettings_->LoadSwitchValue(); 14412d43be4eSopenharmony_ci } 14422d43be4eSopenharmony_ci auto eventId = event->GetInnerEventId(); 14432d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d, event:%{public}d", slotId_, eventId); 14442d43be4eSopenharmony_ci switch (eventId) { 14452d43be4eSopenharmony_ci case RadioEvent::RADIO_SIM_STATE_CHANGE: 14462d43be4eSopenharmony_ci HandleSimStateChanged(); 14472d43be4eSopenharmony_ci break; 14482d43be4eSopenharmony_ci case RadioEvent::RADIO_SIM_RECORDS_LOADED: 14492d43be4eSopenharmony_ci HandleRecordsChanged(); 14502d43be4eSopenharmony_ci break; 14512d43be4eSopenharmony_ci case RadioEvent::RADIO_NV_REFRESH_FINISHED: { 14522d43be4eSopenharmony_ci SetRilAttachApn(); 14532d43be4eSopenharmony_ci break; 14542d43be4eSopenharmony_ci } 14552d43be4eSopenharmony_ci case RadioEvent::RADIO_SIM_ACCOUNT_LOADED: 14562d43be4eSopenharmony_ci HandleSimAccountLoaded(); 14572d43be4eSopenharmony_ci break; 14582d43be4eSopenharmony_ci default: 14592d43be4eSopenharmony_ci break; 14602d43be4eSopenharmony_ci } 14612d43be4eSopenharmony_ci} 14622d43be4eSopenharmony_ci 14632d43be4eSopenharmony_civoid CellularDataHandler::HandleSimAccountLoaded() 14642d43be4eSopenharmony_ci{ 14652d43be4eSopenharmony_ci isSimAccountLoaded_ = true; 14662d43be4eSopenharmony_ci CellularDataNetAgent::GetInstance().UnregisterNetSupplierForSimUpdate(slotId_); 14672d43be4eSopenharmony_ci if (!CellularDataNetAgent::GetInstance().RegisterNetSupplier(slotId_)) { 14682d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d register supplierid fail", slotId_); 14692d43be4eSopenharmony_ci isSimAccountLoaded_ = false; 14702d43be4eSopenharmony_ci } 14712d43be4eSopenharmony_ci if (slotId_ == 0) { 14722d43be4eSopenharmony_ci CellularDataNetAgent::GetInstance().UnregisterPolicyCallback(); 14732d43be4eSopenharmony_ci CellularDataNetAgent::GetInstance().RegisterPolicyCallback(); 14742d43be4eSopenharmony_ci } 14752d43be4eSopenharmony_ci RegisterDataSettingObserver(); 14762d43be4eSopenharmony_ci if (dataSwitchSettings_ != nullptr) { 14772d43be4eSopenharmony_ci dataSwitchSettings_->LoadSwitchValue(); 14782d43be4eSopenharmony_ci } 14792d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 14802d43be4eSopenharmony_ci const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId(); 14812d43be4eSopenharmony_ci CreateApnItem(); 14822d43be4eSopenharmony_ci if (defSlotId == slotId_) { 14832d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 14842d43be4eSopenharmony_ci } else { 14852d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 14862d43be4eSopenharmony_ci } 14872d43be4eSopenharmony_ci} 14882d43be4eSopenharmony_ci 14892d43be4eSopenharmony_civoid CellularDataHandler::CreateApnItem() 14902d43be4eSopenharmony_ci{ 14912d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 14922d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_); 14932d43be4eSopenharmony_ci return; 14942d43be4eSopenharmony_ci } 14952d43be4eSopenharmony_ci int32_t result = 0; 14962d43be4eSopenharmony_ci for (int32_t i = 0; i < DEFAULT_READ_APN_TIME; ++i) { 14972d43be4eSopenharmony_ci result = apnManager_->CreateAllApnItemByDatabase(slotId_); 14982d43be4eSopenharmony_ci if (result != 0) { 14992d43be4eSopenharmony_ci break; 15002d43be4eSopenharmony_ci } 15012d43be4eSopenharmony_ci } 15022d43be4eSopenharmony_ci} 15032d43be4eSopenharmony_ci 15042d43be4eSopenharmony_cibool CellularDataHandler::HandleApnChanged() 15052d43be4eSopenharmony_ci{ 15062d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 15072d43be4eSopenharmony_ci TELEPHONY_LOGE("apnManager is null"); 15082d43be4eSopenharmony_ci return false; 15092d43be4eSopenharmony_ci } 15102d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) { 15112d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: apn type:%{public}s state:%{public}d", slotId_, apnHolder->GetApnType().c_str(), 15122d43be4eSopenharmony_ci apnHolder->GetApnState()); 15132d43be4eSopenharmony_ci } 15142d43be4eSopenharmony_ci InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_APN_CHANGED); 15152d43be4eSopenharmony_ci if (event == nullptr) { 15162d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: get apn changed event is null", slotId_); 15172d43be4eSopenharmony_ci return false; 15182d43be4eSopenharmony_ci } 15192d43be4eSopenharmony_ci return SendEvent(event); 15202d43be4eSopenharmony_ci} 15212d43be4eSopenharmony_ci 15222d43be4eSopenharmony_civoid CellularDataHandler::HandleApnChanged(const InnerEvent::Pointer &event) 15232d43be4eSopenharmony_ci{ 15242d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 15252d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_); 15262d43be4eSopenharmony_ci return; 15272d43be4eSopenharmony_ci } 15282d43be4eSopenharmony_ci CreateApnItem(); 15292d43be4eSopenharmony_ci SetRilAttachApn(); 15302d43be4eSopenharmony_ci ClearConnectionsOnUpdateApns(DisConnectionReason::REASON_RETRY_CONNECTION); 15312d43be4eSopenharmony_ci apnManager_->ClearAllApnBad(); 15322d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) { 15332d43be4eSopenharmony_ci if (apnHolder == nullptr) { 15342d43be4eSopenharmony_ci continue; 15352d43be4eSopenharmony_ci } 15362d43be4eSopenharmony_ci int32_t id = apnManager_->FindApnIdByApnName(apnHolder->GetApnType()); 15372d43be4eSopenharmony_ci if (apnHolder->GetApnState() == PROFILE_STATE_RETRYING) { 15382d43be4eSopenharmony_ci apnHolder->InitialApnRetryCount(); 15392d43be4eSopenharmony_ci apnHolder->SetApnState(PROFILE_STATE_IDLE); 15402d43be4eSopenharmony_ci RemoveEvent(CellularDataEventCode::MSG_RETRY_TO_SETUP_DATACALL); 15412d43be4eSopenharmony_ci } 15422d43be4eSopenharmony_ci SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id, ESTABLISH_DATA_CONNECTION_DELAY); 15432d43be4eSopenharmony_ci } 15442d43be4eSopenharmony_ci} 15452d43be4eSopenharmony_ci 15462d43be4eSopenharmony_ciint32_t CellularDataHandler::GetCellularDataFlowType() 15472d43be4eSopenharmony_ci{ 15482d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 15492d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connection manager is null", slotId_); 15502d43be4eSopenharmony_ci return 0; 15512d43be4eSopenharmony_ci } 15522d43be4eSopenharmony_ci return connectionManager_->GetDataFlowType(); 15532d43be4eSopenharmony_ci} 15542d43be4eSopenharmony_ci 15552d43be4eSopenharmony_civoid CellularDataHandler::HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event) 15562d43be4eSopenharmony_ci{ 15572d43be4eSopenharmony_ci if (apnManager_ == nullptr || event == nullptr) { 15582d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: radio off or not available apnManager or event is null!", slotId_); 15592d43be4eSopenharmony_ci return; 15602d43be4eSopenharmony_ci } 15612d43be4eSopenharmony_ci std::shared_ptr<Int32Parcel> object = event->GetSharedObject<Int32Parcel>(); 15622d43be4eSopenharmony_ci if (object == nullptr) { 15632d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: object is nullptr!", slotId_); 15642d43be4eSopenharmony_ci return; 15652d43be4eSopenharmony_ci } 15662d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Radio changed with state: %{public}d", slotId_, object->data); 15672d43be4eSopenharmony_ci switch (object->data) { 15682d43be4eSopenharmony_ci case CORE_SERVICE_POWER_OFF: 15692d43be4eSopenharmony_ci case CORE_SERVICE_POWER_NOT_AVAILABLE: { 15702d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallApnState(); 15712d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: apn state is %{public}d", slotId_, apnState); 15722d43be4eSopenharmony_ci if (apnState != ApnProfileState::PROFILE_STATE_IDLE) { 15732d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 15742d43be4eSopenharmony_ci } 15752d43be4eSopenharmony_ci break; 15762d43be4eSopenharmony_ci } 15772d43be4eSopenharmony_ci case CORE_SERVICE_POWER_ON: 15782d43be4eSopenharmony_ci apnManager_->ClearAllApnBad(); 15792d43be4eSopenharmony_ci SetRilLinkBandwidths(); 15802d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 15812d43be4eSopenharmony_ci break; 15822d43be4eSopenharmony_ci default: 15832d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: un-handle state:%{public}d", slotId_, object->data); 15842d43be4eSopenharmony_ci break; 15852d43be4eSopenharmony_ci } 15862d43be4eSopenharmony_ci} 15872d43be4eSopenharmony_ci 15882d43be4eSopenharmony_civoid CellularDataHandler::HandleDsdsModeChanged(const AppExecFwk::InnerEvent::Pointer &event) 15892d43be4eSopenharmony_ci{ 15902d43be4eSopenharmony_ci if (event == nullptr) { 15912d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null!", slotId_); 15922d43be4eSopenharmony_ci return; 15932d43be4eSopenharmony_ci } 15942d43be4eSopenharmony_ci std::shared_ptr<Int32Parcel> object = event->GetSharedObject<Int32Parcel>(); 15952d43be4eSopenharmony_ci if (object == nullptr) { 15962d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: object is null!", slotId_); 15972d43be4eSopenharmony_ci return; 15982d43be4eSopenharmony_ci } 15992d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: DSDS changed with mode: %{public}d", slotId_, object->data); 16002d43be4eSopenharmony_ci int32_t dsdsMode = DSDS_MODE_V2; 16012d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetDsdsMode(dsdsMode); 16022d43be4eSopenharmony_ci if (object->data == dsdsMode) { 16032d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: DSDS mode is the same!", slotId_); 16042d43be4eSopenharmony_ci return; 16052d43be4eSopenharmony_ci } 16062d43be4eSopenharmony_ci if (object->data < DSDS_MODE_V2) { 16072d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: DSDS mode is illegal!", slotId_); 16082d43be4eSopenharmony_ci return; 16092d43be4eSopenharmony_ci } 16102d43be4eSopenharmony_ci CoreManagerInner::GetInstance().SetDsdsMode(object->data); 16112d43be4eSopenharmony_ci int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId(); 16122d43be4eSopenharmony_ci int32_t simNum = CoreManagerInner::GetInstance().GetMaxSimCount(); 16132d43be4eSopenharmony_ci bool dataEnableStatus = true; 16142d43be4eSopenharmony_ci IsCellularDataEnabled(dataEnableStatus); 16152d43be4eSopenharmony_ci for (int32_t i = 0; i < simNum; ++i) { 16162d43be4eSopenharmony_ci if (defaultSlotId != i && object->data == DSDS_MODE_V2) { 16172d43be4eSopenharmony_ci SetDataPermitted(i, false); 16182d43be4eSopenharmony_ci } else { 16192d43be4eSopenharmony_ci if (dataEnableStatus) { 16202d43be4eSopenharmony_ci SetDataPermitted(i, true); 16212d43be4eSopenharmony_ci } 16222d43be4eSopenharmony_ci DelayedRefSingleton<CellularDataService>::GetInstance().ChangeConnectionForDsds(i, true); 16232d43be4eSopenharmony_ci } 16242d43be4eSopenharmony_ci } 16252d43be4eSopenharmony_ci if (incallDataStateMachine_ != nullptr) { 16262d43be4eSopenharmony_ci InnerEvent::Pointer incallEvent = InnerEvent::Get(CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED); 16272d43be4eSopenharmony_ci incallDataStateMachine_->SendEvent(incallEvent); 16282d43be4eSopenharmony_ci } 16292d43be4eSopenharmony_ci} 16302d43be4eSopenharmony_ci 16312d43be4eSopenharmony_civoid CellularDataHandler::ClearConnectionIfRequired() 16322d43be4eSopenharmony_ci{ 16332d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 16342d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_); 16352d43be4eSopenharmony_ci return; 16362d43be4eSopenharmony_ci } 16372d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) { 16382d43be4eSopenharmony_ci if (apnHolder == nullptr) { 16392d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 16402d43be4eSopenharmony_ci continue; 16412d43be4eSopenharmony_ci } 16422d43be4eSopenharmony_ci ApnProfileState apnState = apnHolder->GetApnState(); 16432d43be4eSopenharmony_ci std::string apnType = apnHolder->GetApnType(); 16442d43be4eSopenharmony_ci std::vector<sptr<ApnItem>> matchedApns = apnManager_->FilterMatchedApns(apnType, slotId_); 16452d43be4eSopenharmony_ci if (matchedApns.empty()) { 16462d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: matchedApns is empty", slotId_); 16472d43be4eSopenharmony_ci continue; 16482d43be4eSopenharmony_ci } 16492d43be4eSopenharmony_ci bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0; 16502d43be4eSopenharmony_ci if (!apnHolder->IsSameMatchedApns(matchedApns, roamingState)) { 16512d43be4eSopenharmony_ci apnHolder->SetAllMatchedApns(matchedApns); 16522d43be4eSopenharmony_ci if (apnState != ApnProfileState::PROFILE_STATE_IDLE && 16532d43be4eSopenharmony_ci apnState != ApnProfileState::PROFILE_STATE_FAILED) { 16542d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: the connection of APN type:%{public}s will be cleared.", 16552d43be4eSopenharmony_ci slotId_, apnType.c_str()); 16562d43be4eSopenharmony_ci ClearConnection(apnHolder, DisConnectionReason::REASON_RETRY_CONNECTION); 16572d43be4eSopenharmony_ci } 16582d43be4eSopenharmony_ci } 16592d43be4eSopenharmony_ci } 16602d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 16612d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_); 16622d43be4eSopenharmony_ci return; 16632d43be4eSopenharmony_ci } 16642d43be4eSopenharmony_ci if (!apnManager_->HasAnyConnectedState()) { 16652d43be4eSopenharmony_ci connectionManager_->StopStallDetectionTimer(); 16662d43be4eSopenharmony_ci connectionManager_->EndNetStatistics(); 16672d43be4eSopenharmony_ci ResetDataFlowType(); 16682d43be4eSopenharmony_ci } 16692d43be4eSopenharmony_ci} 16702d43be4eSopenharmony_ci 16712d43be4eSopenharmony_civoid CellularDataHandler::PsDataRatChanged(const InnerEvent::Pointer &event) 16722d43be4eSopenharmony_ci{ 16732d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 16742d43be4eSopenharmony_ci int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID); 16752d43be4eSopenharmony_ci coreInner.GetPsRadioTech(slotId_, radioTech); 16762d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: radioTech is %{public}d", slotId_, radioTech); 16772d43be4eSopenharmony_ci if (event == nullptr) { 16782d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 16792d43be4eSopenharmony_ci return; 16802d43be4eSopenharmony_ci } 16812d43be4eSopenharmony_ci bool dataEnabled = dataSwitchSettings_->IsUserDataOn(); 16822d43be4eSopenharmony_ci if (!dataEnabled) { 16832d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: data enable is close", slotId_); 16842d43be4eSopenharmony_ci return; 16852d43be4eSopenharmony_ci } 16862d43be4eSopenharmony_ci bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE; 16872d43be4eSopenharmony_ci if (!attached) { 16882d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: attached is false", slotId_); 16892d43be4eSopenharmony_ci return; 16902d43be4eSopenharmony_ci } 16912d43be4eSopenharmony_ci if (apnManager_ != nullptr) { 16922d43be4eSopenharmony_ci apnManager_->ClearAllApnBad(); 16932d43be4eSopenharmony_ci } 16942d43be4eSopenharmony_ci ClearConnectionIfRequired(); 16952d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 16962d43be4eSopenharmony_ci} 16972d43be4eSopenharmony_ci 16982d43be4eSopenharmony_civoid CellularDataHandler::SetPolicyDataOn(bool enable) 16992d43be4eSopenharmony_ci{ 17002d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 17012d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings is null", slotId_); 17022d43be4eSopenharmony_ci return; 17032d43be4eSopenharmony_ci } 17042d43be4eSopenharmony_ci bool policyDataOn = dataSwitchSettings_->IsPolicyDataOn(); 17052d43be4eSopenharmony_ci if (policyDataOn != enable) { 17062d43be4eSopenharmony_ci dataSwitchSettings_->SetPolicyDataOn(enable); 17072d43be4eSopenharmony_ci if (enable) { 17082d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 17092d43be4eSopenharmony_ci } else { 17102d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 17112d43be4eSopenharmony_ci } 17122d43be4eSopenharmony_ci } 17132d43be4eSopenharmony_ci} 17142d43be4eSopenharmony_ci 17152d43be4eSopenharmony_cibool CellularDataHandler::IsRestrictedMode() const 17162d43be4eSopenharmony_ci{ 17172d43be4eSopenharmony_ci int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID); 17182d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType); 17192d43be4eSopenharmony_ci bool support = (networkType == (int32_t)RadioTech::RADIO_TECHNOLOGY_GSM); 17202d43be4eSopenharmony_ci bool inCall = (lastCallState_ != TelCallStatus::CALL_STATUS_IDLE && 17212d43be4eSopenharmony_ci lastCallState_ != TelCallStatus::CALL_STATUS_DISCONNECTED); 17222d43be4eSopenharmony_ci TELEPHONY_LOGD("Slot%{public}d: radio technology is gsm only:%{public}d and call is busy:%{public}d", slotId_, 17232d43be4eSopenharmony_ci support, inCall); 17242d43be4eSopenharmony_ci return inCall && support; 17252d43be4eSopenharmony_ci} 17262d43be4eSopenharmony_ci 17272d43be4eSopenharmony_ciDisConnectionReason CellularDataHandler::GetDisConnectionReason() 17282d43be4eSopenharmony_ci{ 17292d43be4eSopenharmony_ci return disconnectionReason_; 17302d43be4eSopenharmony_ci} 17312d43be4eSopenharmony_ci 17322d43be4eSopenharmony_civoid CellularDataHandler::SetDataPermitted(int32_t slotId, bool dataPermitted) 17332d43be4eSopenharmony_ci{ 17342d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: dataPermitted is %{public}d.", slotId, dataPermitted); 17352d43be4eSopenharmony_ci int32_t maxSimCount = CoreManagerInner::GetInstance().GetMaxSimCount(); 17362d43be4eSopenharmony_ci if (maxSimCount <= 1) { 17372d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: maxSimCount is: %{public}d", slotId_, maxSimCount); 17382d43be4eSopenharmony_ci return; 17392d43be4eSopenharmony_ci } 17402d43be4eSopenharmony_ci bool hasSimCard = false; 17412d43be4eSopenharmony_ci CoreManagerInner::GetInstance().HasSimCard(slotId, hasSimCard); 17422d43be4eSopenharmony_ci if (!hasSimCard && !IsVSimSlotId(slotId)) { 17432d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: no sim :%{public}d", slotId_, slotId); 17442d43be4eSopenharmony_ci return; 17452d43be4eSopenharmony_ci } 17462d43be4eSopenharmony_ci CoreManagerInner::GetInstance().SetDataPermitted( 17472d43be4eSopenharmony_ci slotId, CellularDataEventCode::MSG_SET_DATA_PERMITTED, dataPermitted, shared_from_this()); 17482d43be4eSopenharmony_ci} 17492d43be4eSopenharmony_ci 17502d43be4eSopenharmony_civoid CellularDataHandler::SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer &event) 17512d43be4eSopenharmony_ci{ 17522d43be4eSopenharmony_ci if (event == nullptr) { 17532d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 17542d43be4eSopenharmony_ci return; 17552d43be4eSopenharmony_ci } 17562d43be4eSopenharmony_ci std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>(); 17572d43be4eSopenharmony_ci if (rilInfo == nullptr) { 17582d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: RadioResponseInfo is null", slotId_); 17592d43be4eSopenharmony_ci return; 17602d43be4eSopenharmony_ci } 17612d43be4eSopenharmony_ci if (rilInfo->errorNo != 0) { 17622d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: SetDataPermitted error", slotId_); 17632d43be4eSopenharmony_ci } 17642d43be4eSopenharmony_ci} 17652d43be4eSopenharmony_ci 17662d43be4eSopenharmony_cibool CellularDataHandler::GetEsmFlagFromOpCfg() 17672d43be4eSopenharmony_ci{ 17682d43be4eSopenharmony_ci int32_t esmFlagFromOpCfg = ESM_FLAG_INVALID; 17692d43be4eSopenharmony_ci OperatorConfig configsForEsmFlag; 17702d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForEsmFlag); 17712d43be4eSopenharmony_ci if (configsForEsmFlag.intValue.find(KEY_PLMN_ESM_FLAG_INT) != configsForEsmFlag.intValue.end()) { 17722d43be4eSopenharmony_ci esmFlagFromOpCfg = configsForEsmFlag.intValue[KEY_PLMN_ESM_FLAG_INT]; 17732d43be4eSopenharmony_ci } 17742d43be4eSopenharmony_ci if (esmFlagFromOpCfg < 0 || esmFlagFromOpCfg > 1) { 17752d43be4eSopenharmony_ci TELEPHONY_LOGE("esmFlag value is invalid"); 17762d43be4eSopenharmony_ci } 17772d43be4eSopenharmony_ci return (esmFlagFromOpCfg != 0); 17782d43be4eSopenharmony_ci} 17792d43be4eSopenharmony_ci 17802d43be4eSopenharmony_civoid CellularDataHandler::SetRilAttachApn() 17812d43be4eSopenharmony_ci{ 17822d43be4eSopenharmony_ci DataProfile dataProfile; 17832d43be4eSopenharmony_ci if (!GetEsmFlagFromOpCfg()) { 17842d43be4eSopenharmony_ci dataProfile.profileId = 0; 17852d43be4eSopenharmony_ci dataProfile.apn = ""; 17862d43be4eSopenharmony_ci dataProfile.protocol = ""; 17872d43be4eSopenharmony_ci dataProfile.verType = 0; 17882d43be4eSopenharmony_ci dataProfile.userName = ""; 17892d43be4eSopenharmony_ci dataProfile.password = ""; 17902d43be4eSopenharmony_ci dataProfile.roamingProtocol = ""; 17912d43be4eSopenharmony_ci } else { 17922d43be4eSopenharmony_ci sptr<ApnItem> attachApn = apnManager_->GetRilAttachApn(); 17932d43be4eSopenharmony_ci if (attachApn == nullptr) { 17942d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: attachApn is null", slotId_); 17952d43be4eSopenharmony_ci return; 17962d43be4eSopenharmony_ci } 17972d43be4eSopenharmony_ci dataProfile.profileId = attachApn->attr_.profileId_; 17982d43be4eSopenharmony_ci dataProfile.apn = attachApn->attr_.apn_; 17992d43be4eSopenharmony_ci dataProfile.protocol = attachApn->attr_.protocol_; 18002d43be4eSopenharmony_ci dataProfile.verType = attachApn->attr_.authType_; 18012d43be4eSopenharmony_ci dataProfile.userName = attachApn->attr_.user_; 18022d43be4eSopenharmony_ci dataProfile.password = attachApn->attr_.password_; 18032d43be4eSopenharmony_ci dataProfile.roamingProtocol = attachApn->attr_.roamingProtocol_; 18042d43be4eSopenharmony_ci } 18052d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: DataProfile profileId = %{public}d", slotId_, dataProfile.profileId); 18062d43be4eSopenharmony_ci CoreManagerInner::GetInstance().SetInitApnInfo( 18072d43be4eSopenharmony_ci slotId_, CellularDataEventCode::MSG_SET_RIL_ATTACH_APN, dataProfile, shared_from_this()); 18082d43be4eSopenharmony_ci} 18092d43be4eSopenharmony_ci 18102d43be4eSopenharmony_civoid CellularDataHandler::SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer &event) 18112d43be4eSopenharmony_ci{ 18122d43be4eSopenharmony_ci if (event == nullptr) { 18132d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_); 18142d43be4eSopenharmony_ci return; 18152d43be4eSopenharmony_ci } 18162d43be4eSopenharmony_ci std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>(); 18172d43be4eSopenharmony_ci if (rilInfo == nullptr) { 18182d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: RadioResponseInfo is null", slotId_); 18192d43be4eSopenharmony_ci return; 18202d43be4eSopenharmony_ci } 18212d43be4eSopenharmony_ci if (rilInfo->errorNo != 0) { 18222d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: SetRilAttachApn error", slotId_); 18232d43be4eSopenharmony_ci } 18242d43be4eSopenharmony_ci isRilApnAttached_ = (rilInfo->errorNo == 0); 18252d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: isRilApnAttached_ = %{public}d", slotId_, isRilApnAttached_); 18262d43be4eSopenharmony_ci} 18272d43be4eSopenharmony_ci 18282d43be4eSopenharmony_cibool CellularDataHandler::HasAnyHigherPriorityConnection(const sptr<ApnHolder> &apnHolder) 18292d43be4eSopenharmony_ci{ 18302d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 18312d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_); 18322d43be4eSopenharmony_ci return false; 18332d43be4eSopenharmony_ci } 18342d43be4eSopenharmony_ci std::vector<sptr<ApnHolder>> sortApnHolders = apnManager_->GetSortApnHolder(); 18352d43be4eSopenharmony_ci if (sortApnHolders.empty()) { 18362d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: SortApnHolder is null", slotId_); 18372d43be4eSopenharmony_ci return false; 18382d43be4eSopenharmony_ci } 18392d43be4eSopenharmony_ci for (const sptr<ApnHolder> &sortApnHolder : sortApnHolders) { 18402d43be4eSopenharmony_ci if (sortApnHolder->GetPriority() > apnHolder->GetPriority()) { 18412d43be4eSopenharmony_ci if (sortApnHolder->IsDataCallEnabled() && 18422d43be4eSopenharmony_ci (sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTED || 18432d43be4eSopenharmony_ci sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTING || 18442d43be4eSopenharmony_ci sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_DISCONNECTING)) { 18452d43be4eSopenharmony_ci CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON, 18462d43be4eSopenharmony_ci CellularDataErrorCode::DATA_ERROR_HAS_HIGHER_PRIORITY_CONNECTION, 18472d43be4eSopenharmony_ci "There is higher priority connection"); 18482d43be4eSopenharmony_ci return true; 18492d43be4eSopenharmony_ci } 18502d43be4eSopenharmony_ci } 18512d43be4eSopenharmony_ci } 18522d43be4eSopenharmony_ci return false; 18532d43be4eSopenharmony_ci} 18542d43be4eSopenharmony_ci 18552d43be4eSopenharmony_cibool CellularDataHandler::HasInternetCapability(const int32_t cid) const 18562d43be4eSopenharmony_ci{ 18572d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 18582d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_); 18592d43be4eSopenharmony_ci return false; 18602d43be4eSopenharmony_ci } 18612d43be4eSopenharmony_ci std::shared_ptr<CellularDataStateMachine> activeStateMachine = connectionManager_->GetActiveConnectionByCid(cid); 18622d43be4eSopenharmony_ci if (activeStateMachine == nullptr) { 18632d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: get activeStateMachine by cid fail", slotId_); 18642d43be4eSopenharmony_ci return false; 18652d43be4eSopenharmony_ci } 18662d43be4eSopenharmony_ci uint64_t netCapability = activeStateMachine->GetCapability(); 18672d43be4eSopenharmony_ci if (netCapability == NetCap::NET_CAPABILITY_INTERNET) { 18682d43be4eSopenharmony_ci return true; 18692d43be4eSopenharmony_ci } 18702d43be4eSopenharmony_ci return false; 18712d43be4eSopenharmony_ci} 18722d43be4eSopenharmony_ci 18732d43be4eSopenharmony_cibool CellularDataHandler::ChangeConnectionForDsds(bool enable) 18742d43be4eSopenharmony_ci{ 18752d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 18762d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_); 18772d43be4eSopenharmony_ci return false; 18782d43be4eSopenharmony_ci } 18792d43be4eSopenharmony_ci if (enable) { 18802d43be4eSopenharmony_ci dataSwitchSettings_->SetInternalDataOn(true); 18812d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 18822d43be4eSopenharmony_ci } else { 18832d43be4eSopenharmony_ci dataSwitchSettings_->SetInternalDataOn(false); 18842d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 18852d43be4eSopenharmony_ci } 18862d43be4eSopenharmony_ci return true; 18872d43be4eSopenharmony_ci} 18882d43be4eSopenharmony_ci 18892d43be4eSopenharmony_civoid CellularDataHandler::GetConfigurationFor5G() 18902d43be4eSopenharmony_ci{ 18912d43be4eSopenharmony_ci // get 5G configurations 18922d43be4eSopenharmony_ci unMeteredAllNsaConfig_ = ParseOperatorConfig(u"allmeterednas"); 18932d43be4eSopenharmony_ci unMeteredNrNsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrnsammware"); 18942d43be4eSopenharmony_ci unMeteredNrNsaSub6Config_ = ParseOperatorConfig(u"meteredNrnsasub6"); 18952d43be4eSopenharmony_ci unMeteredAllNrsaConfig_ = ParseOperatorConfig(u"meteredallnrsa"); 18962d43be4eSopenharmony_ci unMeteredNrsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrsammware"); 18972d43be4eSopenharmony_ci unMeteredNrsaSub6Config_ = ParseOperatorConfig(u"meterednrsasub6"); 18982d43be4eSopenharmony_ci unMeteredRoamingConfig_ = ParseOperatorConfig(u"meteredroaming"); 18992d43be4eSopenharmony_ci GetDefaultConfiguration(); 19002d43be4eSopenharmony_ci} 19012d43be4eSopenharmony_ci 19022d43be4eSopenharmony_cibool CellularDataHandler::ParseOperatorConfig(const std::u16string &configName) 19032d43be4eSopenharmony_ci{ 19042d43be4eSopenharmony_ci OperatorConfig configsFor5G; 19052d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsFor5G); 19062d43be4eSopenharmony_ci if (configsFor5G.configValue.count(configName) > 0) { 19072d43be4eSopenharmony_ci std::string flag = Str16ToStr8(configsFor5G.configValue[configName]); 19082d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: parse operator 5G config: %{public}s", slotId_, flag.c_str()); 19092d43be4eSopenharmony_ci if (flag == "true") { 19102d43be4eSopenharmony_ci return true; 19112d43be4eSopenharmony_ci } 19122d43be4eSopenharmony_ci } 19132d43be4eSopenharmony_ci return false; 19142d43be4eSopenharmony_ci} 19152d43be4eSopenharmony_ci 19162d43be4eSopenharmony_civoid CellularDataHandler::GetSinglePdpEnabledFromOpCfg() 19172d43be4eSopenharmony_ci{ 19182d43be4eSopenharmony_ci OperatorConfig configsForSinglePdp; 19192d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForSinglePdp); 19202d43be4eSopenharmony_ci if (configsForSinglePdp.boolValue.find(KEY_SINGLE_PDP_ENABLED_BOOL) != configsForSinglePdp.boolValue.end()) { 19212d43be4eSopenharmony_ci multipleConnectionsEnabled_ = !configsForSinglePdp.boolValue[KEY_SINGLE_PDP_ENABLED_BOOL]; 19222d43be4eSopenharmony_ci } 19232d43be4eSopenharmony_ci return; 19242d43be4eSopenharmony_ci} 19252d43be4eSopenharmony_ci 19262d43be4eSopenharmony_cibool CellularDataHandler::IsSingleConnectionEnabled(int32_t radioTech) 19272d43be4eSopenharmony_ci{ 19282d43be4eSopenharmony_ci std::vector<int32_t> singlePdpRadio; 19292d43be4eSopenharmony_ci OperatorConfig configsForSinglePdpRadioType; 19302d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForSinglePdpRadioType); 19312d43be4eSopenharmony_ci if (configsForSinglePdpRadioType.intArrayValue.count(KEY_SINGLE_PDP_RADIO_TYPE_INT_ARRAY) >0) { 19322d43be4eSopenharmony_ci singlePdpRadio = configsForSinglePdpRadioType.intArrayValue[KEY_SINGLE_PDP_RADIO_TYPE_INT_ARRAY]; 19332d43be4eSopenharmony_ci } 19342d43be4eSopenharmony_ci if (singlePdpRadio.empty()) { 19352d43be4eSopenharmony_ci TELEPHONY_LOGI("single pdp radio type array is empty"); 19362d43be4eSopenharmony_ci } 19372d43be4eSopenharmony_ci if (std::find(singlePdpRadio.begin(), singlePdpRadio.end(), radioTech) != singlePdpRadio.end()) { 19382d43be4eSopenharmony_ci TELEPHONY_LOGI("radio type array is matched single pdp type"); 19392d43be4eSopenharmony_ci multipleConnectionsEnabled_ = false; 19402d43be4eSopenharmony_ci return !multipleConnectionsEnabled_; 19412d43be4eSopenharmony_ci } 19422d43be4eSopenharmony_ci GetSinglePdpEnabledFromOpCfg(); 19432d43be4eSopenharmony_ci return !multipleConnectionsEnabled_; 19442d43be4eSopenharmony_ci} 19452d43be4eSopenharmony_ci 19462d43be4eSopenharmony_civoid CellularDataHandler::GetDefaultDataRoamingConfig() 19472d43be4eSopenharmony_ci{ 19482d43be4eSopenharmony_ci defaultDataRoamingEnable_ = false; 19492d43be4eSopenharmony_ci OperatorConfig configsForDataRoaming; 19502d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsForDataRoaming); 19512d43be4eSopenharmony_ci if (configsForDataRoaming.boolValue.find(KEY_DEFAULT_DATA_ROAMING_BOOL) != configsForDataRoaming.boolValue.end()) { 19522d43be4eSopenharmony_ci defaultDataRoamingEnable_ = configsForDataRoaming.boolValue[KEY_DEFAULT_DATA_ROAMING_BOOL]; 19532d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: OperatorConfig defaultDataRoamingEnable_ = %{public}d", slotId_, 19542d43be4eSopenharmony_ci defaultDataRoamingEnable_); 19552d43be4eSopenharmony_ci } else { 19562d43be4eSopenharmony_ci std::string defaultDataRoaming = DEFAULT_DATA_ROAMING + std::to_string(slotId_); 19572d43be4eSopenharmony_ci int32_t dataRoaming = static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_DISABLED); 19582d43be4eSopenharmony_ci dataRoaming = GetIntParameter(defaultDataRoaming.c_str(), dataRoaming); 19592d43be4eSopenharmony_ci defaultDataRoamingEnable_ = 19602d43be4eSopenharmony_ci (dataRoaming == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED)); 19612d43be4eSopenharmony_ci TELEPHONY_LOGI( 19622d43be4eSopenharmony_ci "Slot%{public}d: defaultDataRoamingEnable_ from prop is %{public}d", slotId_, defaultDataRoamingEnable_); 19632d43be4eSopenharmony_ci } 19642d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 19652d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null", slotId_); 19662d43be4eSopenharmony_ci return; 19672d43be4eSopenharmony_ci } 19682d43be4eSopenharmony_ci bool dataRoamingEnabled = false; 19692d43be4eSopenharmony_ci int32_t ret = dataSwitchSettings_->QueryUserDataRoamingStatus(dataRoamingEnabled); 19702d43be4eSopenharmony_ci if (ret != TELEPHONY_ERR_SUCCESS && defaultDataRoamingEnable_ != dataSwitchSettings_->IsUserDataRoamingOn()) { 19712d43be4eSopenharmony_ci dataSwitchSettings_->UpdateUserDataRoamingOn(defaultDataRoamingEnable_); 19722d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 19732d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_); 19742d43be4eSopenharmony_ci return; 19752d43be4eSopenharmony_ci } 19762d43be4eSopenharmony_ci bool roamingState = false; 19772d43be4eSopenharmony_ci if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) { 19782d43be4eSopenharmony_ci roamingState = true; 19792d43be4eSopenharmony_ci } 19802d43be4eSopenharmony_ci if (roamingState) { 19812d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallApnState(); 19822d43be4eSopenharmony_ci if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || 19832d43be4eSopenharmony_ci apnState == ApnProfileState::PROFILE_STATE_CONNECTED) { 19842d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION); 19852d43be4eSopenharmony_ci } 19862d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 19872d43be4eSopenharmony_ci } else { 19882d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Not roaming(%{public}d), not doing anything", slotId_, roamingState); 19892d43be4eSopenharmony_ci } 19902d43be4eSopenharmony_ci } 19912d43be4eSopenharmony_ci} 19922d43be4eSopenharmony_ci 19932d43be4eSopenharmony_civoid CellularDataHandler::GetDefaultConfiguration() 19942d43be4eSopenharmony_ci{ 19952d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 19962d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_); 19972d43be4eSopenharmony_ci return; 19982d43be4eSopenharmony_ci } 19992d43be4eSopenharmony_ci connectionManager_->GetDefaultBandWidthsConfig(); 20002d43be4eSopenharmony_ci connectionManager_->GetDefaultTcpBufferConfig(); 20012d43be4eSopenharmony_ci GetDefaultUpLinkThresholdsConfig(); 20022d43be4eSopenharmony_ci GetDefaultDownLinkThresholdsConfig(); 20032d43be4eSopenharmony_ci defaultMobileMtuConfig_ = CellularDataUtils::GetDefaultMobileMtuConfig(); 20042d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: defaultMobileMtuConfig_ = %{public}d", slotId_, defaultMobileMtuConfig_); 20052d43be4eSopenharmony_ci defaultPreferApn_ = CellularDataUtils::GetDefaultPreferApnConfig(); 20062d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: defaultPreferApn_ is %{public}d", slotId_, defaultPreferApn_); 20072d43be4eSopenharmony_ci multipleConnectionsEnabled_ = CellularDataUtils::GetDefaultMultipleConnectionsConfig(); 20082d43be4eSopenharmony_ci GetSinglePdpEnabledFromOpCfg(); 20092d43be4eSopenharmony_ci GetDefaultDataRoamingConfig(); 20102d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: multipleConnectionsEnabled_ = %{public}d, defaultDataRoamingEnable_ = %{public}d", 20112d43be4eSopenharmony_ci slotId_, multipleConnectionsEnabled_, defaultDataRoamingEnable_); 20122d43be4eSopenharmony_ci} 20132d43be4eSopenharmony_ci 20142d43be4eSopenharmony_civoid CellularDataHandler::HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer &event) 20152d43be4eSopenharmony_ci{ 20162d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 20172d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_); 20182d43be4eSopenharmony_ci return; 20192d43be4eSopenharmony_ci } 20202d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_); 20212d43be4eSopenharmony_ci std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines = 20222d43be4eSopenharmony_ci connectionManager_->GetAllConnectionMachine(); 20232d43be4eSopenharmony_ci for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) { 20242d43be4eSopenharmony_ci InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_STATE_CHANGED); 20252d43be4eSopenharmony_ci cellularDataStateMachine->SendEvent(eventCode); 20262d43be4eSopenharmony_ci } 20272d43be4eSopenharmony_ci} 20282d43be4eSopenharmony_ci 20292d43be4eSopenharmony_civoid CellularDataHandler::HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer &event) 20302d43be4eSopenharmony_ci{ 20312d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 20322d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_); 20332d43be4eSopenharmony_ci return; 20342d43be4eSopenharmony_ci } 20352d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_); 20362d43be4eSopenharmony_ci std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines = 20372d43be4eSopenharmony_ci connectionManager_->GetAllConnectionMachine(); 20382d43be4eSopenharmony_ci for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) { 20392d43be4eSopenharmony_ci InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_FREQUENCY_CHANGED); 20402d43be4eSopenharmony_ci cellularDataStateMachine->SendEvent(eventCode); 20412d43be4eSopenharmony_ci } 20422d43be4eSopenharmony_ci} 20432d43be4eSopenharmony_ci 20442d43be4eSopenharmony_civoid CellularDataHandler::GetDefaultUpLinkThresholdsConfig() 20452d43be4eSopenharmony_ci{ 20462d43be4eSopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 20472d43be4eSopenharmony_ci upLinkThresholds_.clear(); 20482d43be4eSopenharmony_ci char upLinkConfig[UP_DOWN_LINK_SIZE] = { 0 }; 20492d43be4eSopenharmony_ci GetParameter(CONFIG_UPLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_UPLINK, upLinkConfig, UP_DOWN_LINK_SIZE); 20502d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: upLinkThresholds = %{public}s", slotId_, upLinkConfig); 20512d43be4eSopenharmony_ci upLinkThresholds_ = CellularDataUtils::Split(upLinkConfig, ","); 20522d43be4eSopenharmony_ci} 20532d43be4eSopenharmony_ci 20542d43be4eSopenharmony_civoid CellularDataHandler::GetDefaultDownLinkThresholdsConfig() 20552d43be4eSopenharmony_ci{ 20562d43be4eSopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 20572d43be4eSopenharmony_ci downLinkThresholds_.clear(); 20582d43be4eSopenharmony_ci char downLinkConfig[UP_DOWN_LINK_SIZE] = { 0 }; 20592d43be4eSopenharmony_ci GetParameter(CONFIG_DOWNLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_DOWNLINK, downLinkConfig, UP_DOWN_LINK_SIZE); 20602d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: downLinkThresholds_ = %{public}s", slotId_, downLinkConfig); 20612d43be4eSopenharmony_ci downLinkThresholds_ = CellularDataUtils::Split(downLinkConfig, ","); 20622d43be4eSopenharmony_ci} 20632d43be4eSopenharmony_ci 20642d43be4eSopenharmony_civoid CellularDataHandler::SetRilLinkBandwidths() 20652d43be4eSopenharmony_ci{ 20662d43be4eSopenharmony_ci std::lock_guard<std::mutex> guard(mtx_); 20672d43be4eSopenharmony_ci LinkBandwidthRule linkBandwidth; 20682d43be4eSopenharmony_ci CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, linkBandwidth.rat); 20692d43be4eSopenharmony_ci linkBandwidth.delayMs = DELAY_SET_RIL_BANDWIDTH_MS; 20702d43be4eSopenharmony_ci linkBandwidth.delayUplinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS; 20712d43be4eSopenharmony_ci linkBandwidth.delayDownlinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS; 20722d43be4eSopenharmony_ci for (std::string upLinkThreshold : upLinkThresholds_) { 20732d43be4eSopenharmony_ci linkBandwidth.maximumUplinkKbps.push_back(atoi(upLinkThreshold.c_str())); 20742d43be4eSopenharmony_ci } 20752d43be4eSopenharmony_ci for (std::string downLinkThreshold : downLinkThresholds_) { 20762d43be4eSopenharmony_ci linkBandwidth.maximumDownlinkKbps.push_back(atoi(downLinkThreshold.c_str())); 20772d43be4eSopenharmony_ci } 20782d43be4eSopenharmony_ci CoreManagerInner::GetInstance().SetLinkBandwidthReportingRule( 20792d43be4eSopenharmony_ci slotId_, CellularDataEventCode::MSG_SET_RIL_BANDWIDTH, linkBandwidth, shared_from_this()); 20802d43be4eSopenharmony_ci} 20812d43be4eSopenharmony_ci 20822d43be4eSopenharmony_civoid CellularDataHandler::HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer &event) 20832d43be4eSopenharmony_ci{ 20842d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr) { 20852d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ is null.", slotId_); 20862d43be4eSopenharmony_ci return; 20872d43be4eSopenharmony_ci } 20882d43be4eSopenharmony_ci bool dataEnabled = true; 20892d43be4eSopenharmony_ci dataSwitchSettings_->QueryUserDataStatus(dataEnabled); 20902d43be4eSopenharmony_ci CoreManagerInner &coreInner = CoreManagerInner::GetInstance(); 20912d43be4eSopenharmony_ci const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId(); 20922d43be4eSopenharmony_ci if (dataEnabled && defSlotId == slotId_) { 20932d43be4eSopenharmony_ci if (apnManager_ != nullptr) { 20942d43be4eSopenharmony_ci apnManager_->ClearAllApnBad(); 20952d43be4eSopenharmony_ci } 20962d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 20972d43be4eSopenharmony_ci } else { 20982d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION); 20992d43be4eSopenharmony_ci } 21002d43be4eSopenharmony_ci} 21012d43be4eSopenharmony_ci 21022d43be4eSopenharmony_civoid CellularDataHandler::HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer &event) 21032d43be4eSopenharmony_ci{ 21042d43be4eSopenharmony_ci if (event == nullptr) { 21052d43be4eSopenharmony_ci return; 21062d43be4eSopenharmony_ci } 21072d43be4eSopenharmony_ci if (dataSwitchSettings_ == nullptr || apnManager_ == nullptr) { 21082d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_); 21092d43be4eSopenharmony_ci return; 21102d43be4eSopenharmony_ci } 21112d43be4eSopenharmony_ci int32_t value = event->GetParam(); 21122d43be4eSopenharmony_ci bool isDataRoamingEnabled = (value == static_cast<int32_t>(RoamingSwitchCode::CELLULAR_DATA_ROAMING_ENABLED)); 21132d43be4eSopenharmony_ci bool dataRoamingEnabled = false; 21142d43be4eSopenharmony_ci dataSwitchSettings_->QueryUserDataRoamingStatus(dataRoamingEnabled); 21152d43be4eSopenharmony_ci if (dataRoamingEnabled != isDataRoamingEnabled) { 21162d43be4eSopenharmony_ci dataSwitchSettings_->SetUserDataRoamingOn(value); 21172d43be4eSopenharmony_ci bool roamingState = false; 21182d43be4eSopenharmony_ci if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) { 21192d43be4eSopenharmony_ci roamingState = true; 21202d43be4eSopenharmony_ci } 21212d43be4eSopenharmony_ci if (roamingState) { 21222d43be4eSopenharmony_ci ApnProfileState apnState = apnManager_->GetOverallApnState(); 21232d43be4eSopenharmony_ci if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || 21242d43be4eSopenharmony_ci apnState == ApnProfileState::PROFILE_STATE_CONNECTED) { 21252d43be4eSopenharmony_ci ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION); 21262d43be4eSopenharmony_ci } 21272d43be4eSopenharmony_ci EstablishAllApnsIfConnectable(); 21282d43be4eSopenharmony_ci } else { 21292d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: Not roaming(%{public}d), not doing anything", slotId_, roamingState); 21302d43be4eSopenharmony_ci } 21312d43be4eSopenharmony_ci } else { 21322d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: The roaming switch status has not changed", slotId_); 21332d43be4eSopenharmony_ci } 21342d43be4eSopenharmony_ci} 21352d43be4eSopenharmony_ci 21362d43be4eSopenharmony_civoid CellularDataHandler::UnRegisterDataSettingObserver() 21372d43be4eSopenharmony_ci{ 21382d43be4eSopenharmony_ci if (settingObserver_ == nullptr || roamingObserver_ == nullptr || incallObserver_ == nullptr || 21392d43be4eSopenharmony_ci cellularDataRdbObserver_ == nullptr) { 21402d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: settingObserver_ or roamingObserver_ or incallObserver_ or " 21412d43be4eSopenharmony_ci "cellularDataRdbObserver_ is null", slotId_); 21422d43be4eSopenharmony_ci return; 21432d43be4eSopenharmony_ci } 21442d43be4eSopenharmony_ci std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance(); 21452d43be4eSopenharmony_ci if (settingHelper == nullptr) { 21462d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: settingHelper is null", slotId_); 21472d43be4eSopenharmony_ci return; 21482d43be4eSopenharmony_ci } 21492d43be4eSopenharmony_ci Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI); 21502d43be4eSopenharmony_ci settingHelper->UnRegisterSettingsObserver(dataEnableUri, settingObserver_); 21512d43be4eSopenharmony_ci 21522d43be4eSopenharmony_ci int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_); 21532d43be4eSopenharmony_ci if (simId <= INVALID_SIM_ID) { 21542d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId); 21552d43be4eSopenharmony_ci return; 21562d43be4eSopenharmony_ci } 21572d43be4eSopenharmony_ci Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId)); 21582d43be4eSopenharmony_ci settingHelper->UnRegisterSettingsObserver(dataRoamingUri, roamingObserver_); 21592d43be4eSopenharmony_ci Uri dataIncallUri(CELLULAR_DATA_SETTING_DATA_INCALL_URI); 21602d43be4eSopenharmony_ci settingHelper->UnRegisterSettingsObserver(dataIncallUri, incallObserver_); 21612d43be4eSopenharmony_ci 21622d43be4eSopenharmony_ci std::shared_ptr<CellularDataRdbHelper> cellularDataRdbHelper = CellularDataRdbHelper::GetInstance(); 21632d43be4eSopenharmony_ci if (cellularDataRdbHelper == nullptr) { 21642d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: cellularDataRdbHelper is null", slotId_); 21652d43be4eSopenharmony_ci return; 21662d43be4eSopenharmony_ci } 21672d43be4eSopenharmony_ci cellularDataRdbHelper->UnRegisterObserver(cellularDataRdbObserver_); 21682d43be4eSopenharmony_ci} 21692d43be4eSopenharmony_ci 21702d43be4eSopenharmony_civoid CellularDataHandler::RegisterDataSettingObserver() 21712d43be4eSopenharmony_ci{ 21722d43be4eSopenharmony_ci if (settingObserver_ == nullptr || roamingObserver_ == nullptr || incallObserver_ == nullptr || 21732d43be4eSopenharmony_ci cellularDataRdbObserver_ == nullptr) { 21742d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: settingObserver_ or roamingObserver_ or incallObserver_ or " 21752d43be4eSopenharmony_ci "cellularDataRdbObserver_ is null", slotId_); 21762d43be4eSopenharmony_ci return; 21772d43be4eSopenharmony_ci } 21782d43be4eSopenharmony_ci std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance(); 21792d43be4eSopenharmony_ci if (settingHelper == nullptr) { 21802d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: settingHelper is null", slotId_); 21812d43be4eSopenharmony_ci return; 21822d43be4eSopenharmony_ci } 21832d43be4eSopenharmony_ci Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI); 21842d43be4eSopenharmony_ci settingHelper->RegisterSettingsObserver(dataEnableUri, settingObserver_); 21852d43be4eSopenharmony_ci 21862d43be4eSopenharmony_ci int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_); 21872d43be4eSopenharmony_ci if (simId <= INVALID_SIM_ID) { 21882d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId); 21892d43be4eSopenharmony_ci return; 21902d43be4eSopenharmony_ci } 21912d43be4eSopenharmony_ci Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId)); 21922d43be4eSopenharmony_ci settingHelper->RegisterSettingsObserver(dataRoamingUri, roamingObserver_); 21932d43be4eSopenharmony_ci Uri dataIncallUri(CELLULAR_DATA_SETTING_DATA_INCALL_URI); 21942d43be4eSopenharmony_ci settingHelper->RegisterSettingsObserver(dataIncallUri, incallObserver_); 21952d43be4eSopenharmony_ci 21962d43be4eSopenharmony_ci std::shared_ptr<CellularDataRdbHelper> cellularDataRdbHelper = CellularDataRdbHelper::GetInstance(); 21972d43be4eSopenharmony_ci if (cellularDataRdbHelper == nullptr) { 21982d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: cellularDataRdbHelper is null", slotId_); 21992d43be4eSopenharmony_ci return; 22002d43be4eSopenharmony_ci } 22012d43be4eSopenharmony_ci cellularDataRdbHelper->RegisterObserver(cellularDataRdbObserver_); 22022d43be4eSopenharmony_ci} 22032d43be4eSopenharmony_ci 22042d43be4eSopenharmony_civoid CellularDataHandler::OnRilAdapterHostDied(const AppExecFwk::InnerEvent::Pointer &event) 22052d43be4eSopenharmony_ci{ 22062d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 22072d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_); 22082d43be4eSopenharmony_ci return; 22092d43be4eSopenharmony_ci } 22102d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: receive event", slotId_); 22112d43be4eSopenharmony_ci std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines = 22122d43be4eSopenharmony_ci connectionManager_->GetAllConnectionMachine(); 22132d43be4eSopenharmony_ci for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) { 22142d43be4eSopenharmony_ci InnerEvent::Pointer eventCode = InnerEvent::Get(CellularDataEventCode::MSG_SM_RIL_ADAPTER_HOST_DIED); 22152d43be4eSopenharmony_ci cellularDataStateMachine->SendEvent(eventCode); 22162d43be4eSopenharmony_ci } 22172d43be4eSopenharmony_ci} 22182d43be4eSopenharmony_ci 22192d43be4eSopenharmony_civoid CellularDataHandler::GetDataConnApnAttr(ApnItem::Attribute &apnAttr) const 22202d43be4eSopenharmony_ci{ 22212d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 22222d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: GetDataConnApnAttr:apnManager is null", slotId_); 22232d43be4eSopenharmony_ci return; 22242d43be4eSopenharmony_ci } 22252d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) { 22262d43be4eSopenharmony_ci if (apnHolder == nullptr) { 22272d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 22282d43be4eSopenharmony_ci continue; 22292d43be4eSopenharmony_ci } 22302d43be4eSopenharmony_ci if (apnHolder->IsDataCallEnabled()) { 22312d43be4eSopenharmony_ci sptr<ApnItem> apnItem = apnHolder->GetCurrentApn(); 22322d43be4eSopenharmony_ci if (apnItem == nullptr) { 22332d43be4eSopenharmony_ci continue; 22342d43be4eSopenharmony_ci } 22352d43be4eSopenharmony_ci apnAttr = apnItem->attr_; 22362d43be4eSopenharmony_ci return; 22372d43be4eSopenharmony_ci } 22382d43be4eSopenharmony_ci } 22392d43be4eSopenharmony_ci} 22402d43be4eSopenharmony_ci 22412d43be4eSopenharmony_cistd::string CellularDataHandler::GetDataConnIpType() const 22422d43be4eSopenharmony_ci{ 22432d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 22442d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: GetDataConnApnAttr:apnManager is null", slotId_); 22452d43be4eSopenharmony_ci return ""; 22462d43be4eSopenharmony_ci } 22472d43be4eSopenharmony_ci for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) { 22482d43be4eSopenharmony_ci if (apnHolder == nullptr) { 22492d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_); 22502d43be4eSopenharmony_ci continue; 22512d43be4eSopenharmony_ci } 22522d43be4eSopenharmony_ci if (apnHolder->IsDataCallEnabled()) { 22532d43be4eSopenharmony_ci auto stateMachine = apnHolder->GetCellularDataStateMachine(); 22542d43be4eSopenharmony_ci if (stateMachine == nullptr) { 22552d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: stateMachine is null", slotId_); 22562d43be4eSopenharmony_ci continue; 22572d43be4eSopenharmony_ci } 22582d43be4eSopenharmony_ci return stateMachine->GetIpType(); 22592d43be4eSopenharmony_ci } 22602d43be4eSopenharmony_ci } 22612d43be4eSopenharmony_ci return ""; 22622d43be4eSopenharmony_ci} 22632d43be4eSopenharmony_ci 22642d43be4eSopenharmony_ciint32_t CellularDataHandler::GetDataRecoveryState() 22652d43be4eSopenharmony_ci{ 22662d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 22672d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_); 22682d43be4eSopenharmony_ci return -1; 22692d43be4eSopenharmony_ci } 22702d43be4eSopenharmony_ci return connectionManager_->GetDataRecoveryState(); 22712d43be4eSopenharmony_ci} 22722d43be4eSopenharmony_ci 22732d43be4eSopenharmony_civoid CellularDataHandler::HandleFactoryReset(const InnerEvent::Pointer &event) 22742d43be4eSopenharmony_ci{ 22752d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: factory reset", slotId_); 22762d43be4eSopenharmony_ci SetCellularDataEnable(true); 22772d43be4eSopenharmony_ci SetCellularDataRoamingEnabled(defaultDataRoamingEnable_); 22782d43be4eSopenharmony_ci if (apnManager_ == nullptr) { 22792d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_); 22802d43be4eSopenharmony_ci return; 22812d43be4eSopenharmony_ci } 22822d43be4eSopenharmony_ci apnManager_->ResetApns(slotId_); 22832d43be4eSopenharmony_ci} 22842d43be4eSopenharmony_ci 22852d43be4eSopenharmony_civoid CellularDataHandler::IsNeedDoRecovery(bool needDoRecovery) const 22862d43be4eSopenharmony_ci{ 22872d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 22882d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: in IsNeedDoRecovery connectionManager_ is null", slotId_); 22892d43be4eSopenharmony_ci return; 22902d43be4eSopenharmony_ci } 22912d43be4eSopenharmony_ci connectionManager_->IsNeedDoRecovery(needDoRecovery); 22922d43be4eSopenharmony_ci} 22932d43be4eSopenharmony_ci 22942d43be4eSopenharmony_civoid CellularDataHandler::OnCleanAllDataConnectionsDone(const AppExecFwk::InnerEvent::Pointer &event) 22952d43be4eSopenharmony_ci{ 22962d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: receive OnCleanAllDataConnectionsDone event", slotId_); 22972d43be4eSopenharmony_ci} 22982d43be4eSopenharmony_ci 22992d43be4eSopenharmony_cibool CellularDataHandler::IsVSimSlotId(int32_t slotId) 23002d43be4eSopenharmony_ci{ 23012d43be4eSopenharmony_ci if (TELEPHONY_EXT_WRAPPER.getVSimSlotId_) { 23022d43be4eSopenharmony_ci int vSimSlotId = INVALID_SLOT_ID; 23032d43be4eSopenharmony_ci TELEPHONY_EXT_WRAPPER.getVSimSlotId_(vSimSlotId); 23042d43be4eSopenharmony_ci return vSimSlotId == slotId; 23052d43be4eSopenharmony_ci } 23062d43be4eSopenharmony_ci return false; 23072d43be4eSopenharmony_ci} 23082d43be4eSopenharmony_ci 23092d43be4eSopenharmony_cistd::shared_ptr<CellularDataStateMachine> CellularDataHandler::CheckForCompatibleDataConnection( 23102d43be4eSopenharmony_ci sptr<ApnHolder> &apnHolder) 23112d43be4eSopenharmony_ci{ 23122d43be4eSopenharmony_ci std::shared_ptr<CellularDataStateMachine> potentialDc = nullptr; 23132d43be4eSopenharmony_ci if (apnHolder == nullptr || apnManager_ == nullptr) { 23142d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: CheckForCompatibleDataConnection failed, apnHolder or apnManager_null", 23152d43be4eSopenharmony_ci slotId_); 23162d43be4eSopenharmony_ci return potentialDc; 23172d43be4eSopenharmony_ci } 23182d43be4eSopenharmony_ci std::vector<sptr<ApnItem>> dunApnList; 23192d43be4eSopenharmony_ci if (apnHolder->GetApnType() == DATA_CONTEXT_ROLE_DUN) { 23202d43be4eSopenharmony_ci apnManager_->FetchDunApns(dunApnList, slotId_); 23212d43be4eSopenharmony_ci } 23222d43be4eSopenharmony_ci if (dunApnList.size() == 0) { 23232d43be4eSopenharmony_ci return potentialDc; 23242d43be4eSopenharmony_ci } 23252d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 23262d43be4eSopenharmony_ci return potentialDc; 23272d43be4eSopenharmony_ci } 23282d43be4eSopenharmony_ci auto allDCs = connectionManager_->GetAllConnectionMachine(); 23292d43be4eSopenharmony_ci bool isRoaming = false; 23302d43be4eSopenharmony_ci int32_t result = IsCellularDataRoamingEnabled(isRoaming); 23312d43be4eSopenharmony_ci if (result != TELEPHONY_ERR_SUCCESS) { 23322d43be4eSopenharmony_ci isRoaming = false; 23332d43be4eSopenharmony_ci } 23342d43be4eSopenharmony_ci for (const auto& curDc : allDCs) { 23352d43be4eSopenharmony_ci sptr<ApnItem> apnItem = curDc->GetApnItem(); 23362d43be4eSopenharmony_ci for (const auto& dunItem : dunApnList) { 23372d43be4eSopenharmony_ci if (!ApnHolder::IsCompatibleApnItem(apnItem, dunItem, isRoaming)) { 23382d43be4eSopenharmony_ci continue; 23392d43be4eSopenharmony_ci } 23402d43be4eSopenharmony_ci if (curDc->IsActiveState()) { 23412d43be4eSopenharmony_ci return curDc; 23422d43be4eSopenharmony_ci } else if (curDc->IsActivatingState()) { 23432d43be4eSopenharmony_ci potentialDc = curDc; 23442d43be4eSopenharmony_ci } else if (curDc->IsDisconnectingState()) { 23452d43be4eSopenharmony_ci if (potentialDc == nullptr) { 23462d43be4eSopenharmony_ci potentialDc = curDc; 23472d43be4eSopenharmony_ci } 23482d43be4eSopenharmony_ci } 23492d43be4eSopenharmony_ci } 23502d43be4eSopenharmony_ci } 23512d43be4eSopenharmony_ci return potentialDc; 23522d43be4eSopenharmony_ci} 23532d43be4eSopenharmony_ci 23542d43be4eSopenharmony_civoid CellularDataHandler::HandleUpdateNetInfo(const AppExecFwk::InnerEvent::Pointer &event) 23552d43be4eSopenharmony_ci{ 23562d43be4eSopenharmony_ci TELEPHONY_LOGI("Slot%{public}d: HandleUpdateNetInfo", slotId_); 23572d43be4eSopenharmony_ci if (event == nullptr || apnManager_ == nullptr) { 23582d43be4eSopenharmony_ci TELEPHONY_LOGE("event or apnManager_ is null"); 23592d43be4eSopenharmony_ci return; 23602d43be4eSopenharmony_ci } 23612d43be4eSopenharmony_ci 23622d43be4eSopenharmony_ci std::shared_ptr<SetupDataCallResultInfo> netInfo = event->GetSharedObject<SetupDataCallResultInfo>(); 23632d43be4eSopenharmony_ci if (netInfo == nullptr) { 23642d43be4eSopenharmony_ci TELEPHONY_LOGE("info is null"); 23652d43be4eSopenharmony_ci return; 23662d43be4eSopenharmony_ci } 23672d43be4eSopenharmony_ci 23682d43be4eSopenharmony_ci sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(netInfo->flag); 23692d43be4eSopenharmony_ci if (apnHolder == nullptr) { 23702d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: flag:%{public}d complete apnHolder is null", slotId_, netInfo->flag); 23712d43be4eSopenharmony_ci return; 23722d43be4eSopenharmony_ci } 23732d43be4eSopenharmony_ci if (apnHolder->GetApnState() != PROFILE_STATE_CONNECTING && apnHolder->GetApnState() != PROFILE_STATE_CONNECTED) { 23742d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: apnHolder is not connecting or connected", slotId_); 23752d43be4eSopenharmony_ci return; 23762d43be4eSopenharmony_ci } 23772d43be4eSopenharmony_ci auto stateMachine = apnHolder->GetCellularDataStateMachine(); 23782d43be4eSopenharmony_ci if (stateMachine == nullptr) { 23792d43be4eSopenharmony_ci TELEPHONY_LOGE("stateMachine is null"); 23802d43be4eSopenharmony_ci return; 23812d43be4eSopenharmony_ci } 23822d43be4eSopenharmony_ci stateMachine->UpdateNetworkInfo(*netInfo); 23832d43be4eSopenharmony_ci} 23842d43be4eSopenharmony_ci 23852d43be4eSopenharmony_cibool CellularDataHandler::IsGsm() 23862d43be4eSopenharmony_ci{ 23872d43be4eSopenharmony_ci bool isGsm = false; 23882d43be4eSopenharmony_ci CoreManagerInner::GetInstance().IsGsm(slotId_, isGsm); 23892d43be4eSopenharmony_ci return isGsm; 23902d43be4eSopenharmony_ci} 23912d43be4eSopenharmony_ci 23922d43be4eSopenharmony_cibool CellularDataHandler::IsCdma() 23932d43be4eSopenharmony_ci{ 23942d43be4eSopenharmony_ci bool isCdma = false; 23952d43be4eSopenharmony_ci CoreManagerInner::GetInstance().IsCdma(slotId_, isCdma); 23962d43be4eSopenharmony_ci return isCdma; 23972d43be4eSopenharmony_ci} 23982d43be4eSopenharmony_ci 23992d43be4eSopenharmony_civoid CellularDataHandler::ReleaseCellularDataConnection() 24002d43be4eSopenharmony_ci{ 24012d43be4eSopenharmony_ci int32_t id = ApnManager::FindApnIdByCapability(OHOS::NetManagerStandard::NET_CAPABILITY_INTERNET); 24022d43be4eSopenharmony_ci if (!apnManager_) { 24032d43be4eSopenharmony_ci TELEPHONY_LOGE("apnManager_ is nullptr"); 24042d43be4eSopenharmony_ci return; 24052d43be4eSopenharmony_ci } 24062d43be4eSopenharmony_ci OHOS::sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id); 24072d43be4eSopenharmony_ci if (apnHolder->GetUidStatus() == HasSystemUse::HAS) { 24082d43be4eSopenharmony_ci TELEPHONY_LOGI("system using, can not release"); 24092d43be4eSopenharmony_ci return; 24102d43be4eSopenharmony_ci } 24112d43be4eSopenharmony_ci apnHolder->ReleaseDataConnection(); 24122d43be4eSopenharmony_ci} 24132d43be4eSopenharmony_ci 24142d43be4eSopenharmony_cibool CellularDataHandler::UpdateNetworkInfo() 24152d43be4eSopenharmony_ci{ 24162d43be4eSopenharmony_ci if (connectionManager_ == nullptr) { 24172d43be4eSopenharmony_ci TELEPHONY_LOGE("Slot%{public}d: connectionManager_ is null", slotId_); 24182d43be4eSopenharmony_ci return false; 24192d43be4eSopenharmony_ci } 24202d43be4eSopenharmony_ci auto stateMachines = connectionManager_->GetAllConnectionMachine(); 24212d43be4eSopenharmony_ci for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) { 24222d43be4eSopenharmony_ci auto eventCode = InnerEvent::Get(CellularDataEventCode::MSG_SM_UPDATE_NETWORK_INFO); 24232d43be4eSopenharmony_ci cellularDataStateMachine->SendEvent(eventCode); 24242d43be4eSopenharmony_ci } 24252d43be4eSopenharmony_ci return true; 24262d43be4eSopenharmony_ci} 24272d43be4eSopenharmony_ci} // namespace Telephony 24282d43be4eSopenharmony_ci} // namespace OHOS 2429