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