diff --git a/services/include/cellular_data_handler.h b/services/include/cellular_data_handler.h index dc10d1b94a0888c96b044b2188c04ce82adb3a09..79874d4940e1c485ea61511cd125899ad3a48698 100644 --- a/services/include/cellular_data_handler.h +++ b/services/include/cellular_data_handler.h @@ -160,6 +160,10 @@ private: void RetryToSetupDatacall(const AppExecFwk::InnerEvent::Pointer &event); void RetryOrClearConnection(const sptr &apnHolder, DisConnectionReason reason, const std::shared_ptr &netInfo); + std::shared_ptr CreatorDataShareHelper(); + bool GetCurrentDataShareApnInfo(std::shared_ptr dataShareHelper, + const int32_t simId, int32_t &profileIdValue); + void UpdateApnInfo(const int32_t profileId); private: sptr apnManager_; diff --git a/services/src/cellular_data_handler.cpp b/services/src/cellular_data_handler.cpp index 4133713cf35605a17d7b82d6973663cc2bd44b49..06b0cc48098ab702d351fdbf36824a5d6e4fbbfc 100644 --- a/services/src/cellular_data_handler.cpp +++ b/services/src/cellular_data_handler.cpp @@ -821,9 +821,86 @@ void CellularDataHandler::EstablishDataConnectionComplete(const InnerEvent::Poin incallDataStateMachine_->SendEvent(incallEvent); } UpdateCellularDataConnectState(apnHolder->GetApnType()); + UpdateApnInfo(apnHolder->GetCurrentApn()->attr_.profileId_); } } +std::shared_ptr CellularDataHandler::CreatorDataShareHelper() +{ + sptr saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (saManager == nullptr) { + TELEPHONY_LOGE("saManager is nullptr."); + return nullptr; + } + sptr remoteObj = saManager->GetSystemAbility(TELEPHONY_CELLULAR_DATA_SYS_ABILITY_ID); + if (remoteObj == nullptr) { + TELEPHONY_LOGE("remoteObj is nullptr."); + return nullptr; + } + return DataShare::DataShareHelper::Creator(remoteObj, CELLULAR_DATA_RDB_URI); +} + +bool CellularDataHandler::GetCurrentDataShareApnInfo(std::shared_ptr dataShareHelper, + const int32_t simId, int32_t &profileIdValue) +{ + Uri preferApnUri(std::string(CELLULAR_DATA_RDB_PREFER) + "?Proxy=true&simId=" + std::to_string(simId)); + DataShare::DataSharePredicates predicates; + std::vector columns; + std::shared_ptr resultSet = + dataShareHelper->Query(preferApnUri, predicates, columns); + if (resultSet == nullptr) { + TELEPHONY_LOGI("Query CurrentDataShareApnInfo resultSet is nullptr."); + return false; + } + int count = 0; + resultSet->GetRowCount(count); + if (count <= 0) { + TELEPHONY_LOGI("GetRowCount is NULL."); + resultSet->Close(); + return false; + } + int columnIndex = 0; + resultSet->GoToFirstRow(); + resultSet->GetColumnIndex(PdpProfileData::PROFILE_ID, columnIndex); + resultSet->GetInt(columnIndex, profileIdValue); + resultSet->Close(); + return true; +} + +void CellularDataHandler::UpdateApnInfo(const int32_t profileId) +{ + int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_); + if (simId <= INVALID_SIM_ID) { + TELEPHONY_LOGE("Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId); + return; + } + std::shared_ptr dataShareHelper = CreatorDataShareHelper(); + if (dataShareHelper == nullptr) { + TELEPHONY_LOGE("dataShareHelper is nullptr."); + return; + } + int32_t profileIdValue = 0; + if (!GetCurrentDataShareApnInfo(dataShareHelper, simId, profileIdValue)) { + TELEPHONY_LOGE("GetCurrentDataShareApnInfo fail."); + dataShareHelper->Release(); + return; + } + if (profileIdValue != profileId) { + DataShare::DataSharePredicates predicates; + DataShare::DataShareValuesBucket values; + double profileIdAsDouble = static_cast(profileId); + double simIdAsDouble = static_cast(simId); + values.Put(PdpProfileData::PROFILE_ID, profileIdAsDouble); + values.Put(PdpProfileData::SIM_ID, simIdAsDouble); + Uri uri(CELLULAR_DATA_RDB_PREFER); + int32_t result = dataShareHelper->Update(uri, predicates, values); + if (result < TELEPHONY_ERR_SUCCESS) { + TELEPHONY_LOGE("UpdateApnInfo fail! result:%{public}d", result); + } + } + dataShareHelper->Release(); +} + int32_t CellularDataHandler::GetSlotId() const { return slotId_;