• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "cellular_data_handler.h"
17 
18 #include "cellular_data_constant.h"
19 #include "cellular_data_error.h"
20 #include "cellular_data_hisysevent.h"
21 #include "cellular_data_settings_rdb_helper.h"
22 #include "cellular_data_types.h"
23 #include "cellular_data_utils.h"
24 #include "common_event_manager.h"
25 #include "common_event_support.h"
26 #include "core_manager_inner.h"
27 #include "hitrace_meter.h"
28 #include "hril_call_parcel.h"
29 #include "net_specifier.h"
30 #include "radio_event.h"
31 #include "str_convert.h"
32 #include "string_ex.h"
33 #include "telephony_log_wrapper.h"
34 #include "telephony_types.h"
35 
36 namespace OHOS {
37 namespace Telephony {
38 using namespace AppExecFwk;
39 using namespace OHOS::EventFwk;
40 using namespace NetManagerStandard;
CellularDataHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner,const EventFwk::CommonEventSubscribeInfo & sp,int32_t slotId)41 CellularDataHandler::CellularDataHandler(const std::shared_ptr<AppExecFwk::EventRunner> &runner,
42     const EventFwk::CommonEventSubscribeInfo &sp, int32_t slotId)
43     : EventHandler(runner), CommonEventSubscriber(sp), slotId_(slotId)
44 {}
45 
Init()46 void CellularDataHandler::Init()
47 {
48     apnManager_ = std::make_unique<ApnManager>().release();
49     dataSwitchSettings_ = std::make_unique<DataSwitchSettings>(slotId_);
50     connectionManager_ = std::make_unique<DataConnectionManager>(GetEventRunner(), slotId_).release();
51     settingObserver_ = std::make_unique<CellularDataSettingObserver>(shared_from_this()).release();
52     roamingObserver_ = std::make_unique<CellularDataRoamingObserver>(shared_from_this(), slotId_).release();
53     if ((apnManager_ == nullptr) || (dataSwitchSettings_ == nullptr) || (connectionManager_ == nullptr)) {
54         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or dataSwitchSettings_ or connectionManager_ is null", slotId_);
55         return;
56     }
57     apnManager_->InitApnHolders();
58     apnManager_->CreateAllApnItem();
59     dataSwitchSettings_->LoadSwitchValue();
60     GetConfigurationFor5G();
61     SetRilLinkBandwidths();
62 }
63 
~CellularDataHandler()64 CellularDataHandler::~CellularDataHandler()
65 {
66     UnRegisterDataSettingObserver();
67 }
68 
ReleaseNet(const NetRequest & request)69 bool CellularDataHandler::ReleaseNet(const NetRequest &request)
70 {
71     if (apnManager_ == nullptr) {
72         TELEPHONY_LOGE("Slot%{public}d: apnManager is null.", slotId_);
73         return false;
74     }
75     int32_t id = ApnManager::FindApnIdByCapability(request.capability);
76     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
77     if (apnHolder == nullptr) {
78         TELEPHONY_LOGE("Slot%{public}d: ReleaseNet apnHolder is null.", slotId_);
79         return false;
80     }
81     std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>();
82     if (netRequest == nullptr) {
83         TELEPHONY_LOGE("Netrequest is null");
84         return false;
85     }
86     netRequest->capability = request.capability;
87     netRequest->ident = request.ident;
88     AppExecFwk::InnerEvent::Pointer event =
89         InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_RELEASE_NET);
90     return SendEvent(event);
91 }
92 
RequestNet(const NetRequest & request)93 bool CellularDataHandler::RequestNet(const NetRequest &request)
94 {
95     if (apnManager_ == nullptr) {
96         TELEPHONY_LOGE("Slot%{public}d: apnManager is null.", slotId_);
97         return false;
98     }
99     int32_t id = ApnManager::FindApnIdByCapability(request.capability);
100     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
101     if (apnHolder == nullptr) {
102         TELEPHONY_LOGE("Slot%{public}d: RequestNet apnHolder is null.", slotId_);
103         return false;
104     }
105     ApnProfileState apnState = apnHolder->GetApnState();
106     if (apnState == ApnProfileState::PROFILE_STATE_CONNECTED || apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
107         apnState == ApnProfileState::PROFILE_STATE_DISCONNECTING) {
108         TELEPHONY_LOGE("Slot%{public}d: RequestNet apn state is connected(%{public}d).", slotId_, apnState);
109         return true;
110     }
111     std::unique_ptr<NetRequest> netRequest = std::make_unique<NetRequest>();
112     if (netRequest == nullptr) {
113         TELEPHONY_LOGE("Netrequest is null");
114         return false;
115     }
116     netRequest->capability = request.capability;
117     netRequest->ident = request.ident;
118     AppExecFwk::InnerEvent::Pointer event =
119         InnerEvent::Get(CellularDataEventCode::MSG_REQUEST_NETWORK, netRequest, TYPE_REQUEST_NET);
120     return SendEvent(event);
121 }
122 
SetCellularDataEnable(bool userDataOn)123 int32_t CellularDataHandler::SetCellularDataEnable(bool userDataOn)
124 {
125     if (dataSwitchSettings_ == nullptr) {
126         TELEPHONY_LOGE("Slot%{public}d: SetCellularDataEnable dataSwitchSettings_ is null.", slotId_);
127         return TELEPHONY_ERR_LOCAL_PTR_NULL;
128     }
129     bool dataEnabled = false;
130     dataSwitchSettings_->IsUserDataOn(dataEnabled);
131     if (dataEnabled != userDataOn) {
132         int32_t result = dataSwitchSettings_->SetUserDataOn(userDataOn);
133         if (result != TELEPHONY_ERR_SUCCESS) {
134             TELEPHONY_LOGE("Slot%{public}d: SetUserDataOn %{public}d fail.", slotId_, userDataOn);
135             return result;
136         }
137         int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
138         if (userDataOn && defaultSlotId == slotId_) {
139             EstablishAllApnsIfConnectable();
140             if (apnManager_ == nullptr) {
141                 TELEPHONY_LOGE("Slot%{public}d: apnManager is null.", slotId_);
142                 return TELEPHONY_ERR_SUCCESS;
143             }
144             const int32_t id = DATA_CONTEXT_ROLE_DEFAULT_ID;
145             sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
146             if (apnHolder == nullptr) {
147                 TELEPHONY_LOGE("Slot%{public}d: apnHolder is null.", slotId_);
148                 return TELEPHONY_ERR_SUCCESS;
149             }
150             if (!apnHolder->IsDataCallEnabled()) {
151                 NetRequest netRequest;
152                 netRequest.ident =
153                     std::string(IDENT_PREFIX) + std::to_string(CoreManagerInner::GetInstance().GetSimId(slotId_));
154                 netRequest.capability = NetCap::NET_CAPABILITY_INTERNET;
155                 apnHolder->RequestCellularData(netRequest);
156                 AttemptEstablishDataConnection(apnHolder);
157                 return TELEPHONY_ERR_SUCCESS;
158             }
159         } else {
160             CellularDataHiSysEvent::WriteDataDeactiveBehaviorEvent(slotId_, DataDisconnectCause::BY_USER);
161             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
162         }
163     } else {
164         TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_);
165     }
166     return TELEPHONY_ERR_SUCCESS;
167 }
168 
IsCellularDataEnabled(bool & dataEnabled) const169 int32_t CellularDataHandler::IsCellularDataEnabled(bool &dataEnabled) const
170 {
171     if (dataSwitchSettings_ == nullptr) {
172         TELEPHONY_LOGE("Slot%{public}d: IsCellularDataEnabled dataSwitchSettings_ is null", slotId_);
173         return TELEPHONY_ERR_LOCAL_PTR_NULL;
174     }
175     return dataSwitchSettings_->IsUserDataOn(dataEnabled);
176 }
177 
IsCellularDataRoamingEnabled(bool & dataRoamingEnabled) const178 int32_t CellularDataHandler::IsCellularDataRoamingEnabled(bool &dataRoamingEnabled) const
179 {
180     if (dataSwitchSettings_ == nullptr) {
181         TELEPHONY_LOGE("Slot%{public}d: IsCellularDataRoamingEnabled dataSwitchSettings_ is null", slotId_);
182         return TELEPHONY_ERR_LOCAL_PTR_NULL;
183     }
184     return dataSwitchSettings_->IsUserDataRoamingOn(dataRoamingEnabled);
185 }
186 
SetCellularDataRoamingEnabled(bool dataRoamingEnabled)187 int32_t CellularDataHandler::SetCellularDataRoamingEnabled(bool dataRoamingEnabled)
188 {
189     if (dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
190         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_);
191         return TELEPHONY_ERR_LOCAL_PTR_NULL;
192     }
193     bool currentDataEnabled = false;
194     dataSwitchSettings_->IsUserDataRoamingOn(currentDataEnabled);
195     if (currentDataEnabled == dataRoamingEnabled) {
196         TELEPHONY_LOGI("Slot%{public}d: The roaming switch status has not changed", slotId_);
197         return TELEPHONY_ERR_SUCCESS;
198     }
199     int32_t result = dataSwitchSettings_->SetUserDataRoamingOn(dataRoamingEnabled);
200     if (result != TELEPHONY_ERR_SUCCESS) {
201         return result;
202     }
203     bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0;
204     if (roamingState) {
205         ApnProfileState apnState = apnManager_->GetOverallApnState();
206         if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
207             apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
208             ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
209         }
210         EstablishAllApnsIfConnectable();
211     } else {
212         TELEPHONY_LOGI("Slot%{public}d: Not roaming(%{public}d), not doing anything", slotId_, roamingState);
213     }
214     return TELEPHONY_ERR_SUCCESS;
215 }
216 
ClearAllConnections(DisConnectionReason reason)217 void CellularDataHandler::ClearAllConnections(DisConnectionReason reason)
218 {
219     if (apnManager_ == nullptr) {
220         TELEPHONY_LOGE("Slot%{public}d: ClearAllConnections:apnManager is null", slotId_);
221         return;
222     }
223     ApnProfileState currentState = apnManager_->GetOverallApnState();
224     if (currentState == ApnProfileState::PROFILE_STATE_CONNECTED ||
225         currentState == ApnProfileState::PROFILE_STATE_CONNECTING) {
226         int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
227         CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
228         StateNotification::GetInstance().UpdateCellularDataConnectState(
229             slotId_, PROFILE_STATE_DISCONNECTING, networkType);
230     }
231     for (const sptr<ApnHolder> &apn : apnManager_->GetAllApnHolder()) {
232         ClearConnection(apn, reason);
233     }
234 
235     if (connectionManager_ == nullptr) {
236         TELEPHONY_LOGE("Slot%{public}d: in ClearAllConnections connectionManager_ is null", slotId_);
237         return;
238     }
239     connectionManager_->StopStallDetectionTimer();
240     connectionManager_->EndNetStatistics();
241 
242     if (dataSwitchSettings_ == nullptr) {
243         TELEPHONY_LOGE("Slot%{public}d: in ClearAllConnections dataSwitchSettings_ is null", slotId_);
244         return;
245     }
246     bool dataEnabled = false;
247     dataSwitchSettings_->IsUserDataOn(dataEnabled);
248     if (!dataEnabled) {
249         connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_NONE);
250     }
251 }
252 
ClearConnection(const sptr<ApnHolder> & apn,DisConnectionReason reason)253 void CellularDataHandler::ClearConnection(const sptr<ApnHolder> &apn, DisConnectionReason reason)
254 {
255     if (apn == nullptr) {
256         TELEPHONY_LOGE("Slot%{public}d: ClearConnection:apnHolder is null", slotId_);
257         return;
258     }
259     std::shared_ptr<CellularDataStateMachine> stateMachine = apn->GetCellularDataStateMachine();
260     if (stateMachine == nullptr) {
261         TELEPHONY_LOGE("Slot%{public}d: stateMachine is null", slotId_);
262         return;
263     }
264     TELEPHONY_LOGI("Slot%{public}d: The APN holder is of type %{public}s", slotId_, apn->GetApnType().c_str());
265     std::unique_ptr<DataDisconnectParams> object = std::make_unique<DataDisconnectParams>(apn->GetApnType(), reason);
266     if (object == nullptr) {
267         TELEPHONY_LOGE("Slot%{public}d: ClearConnection fail, object is null", slotId_);
268         return;
269     }
270     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_DISCONNECT, object);
271     stateMachine->SendEvent(event);
272     apn->SetApnState(PROFILE_STATE_DISCONNECTING);
273     apn->SetCellularDataStateMachine(nullptr);
274 }
275 
GetCellularDataState() const276 ApnProfileState CellularDataHandler::GetCellularDataState() const
277 {
278     if (apnManager_ == nullptr) {
279         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
280         return ApnProfileState::PROFILE_STATE_IDLE;
281     }
282     return apnManager_->GetOverallApnState();
283 }
284 
GetCellularDataState(const std::string & apnType) const285 ApnProfileState CellularDataHandler::GetCellularDataState(const std::string &apnType) const
286 {
287     if (apnManager_ == nullptr) {
288         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
289         return ApnProfileState::PROFILE_STATE_IDLE;
290     }
291     sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnType);
292     if (apnHolder == nullptr) {
293         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
294         return ApnProfileState::PROFILE_STATE_IDLE;
295     }
296     return apnHolder->GetApnState();
297 }
298 
RadioPsConnectionAttached(const InnerEvent::Pointer & event)299 void CellularDataHandler::RadioPsConnectionAttached(const InnerEvent::Pointer &event)
300 {
301     TELEPHONY_LOGI("Slot%{public}d: ps attached", slotId_);
302     if (event == nullptr || apnManager_ == nullptr) {
303         TELEPHONY_LOGE("Slot%{public}d: event or apnManager_ is null", slotId_);
304         return;
305     }
306     ApnProfileState apnState = apnManager_->GetOverallApnState();
307     if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
308         ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
309     }
310     EstablishAllApnsIfConnectable();
311 }
312 
RadioPsConnectionDetached(const InnerEvent::Pointer & event)313 void CellularDataHandler::RadioPsConnectionDetached(const InnerEvent::Pointer &event)
314 {
315     TELEPHONY_LOGI("Slot%{public}d: ps detached", slotId_);
316     if (event == nullptr) {
317         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
318         return;
319     }
320     ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
321 }
322 
RoamingStateOn(const InnerEvent::Pointer & event)323 void CellularDataHandler::RoamingStateOn(const InnerEvent::Pointer &event)
324 {
325     TELEPHONY_LOGI("Slot%{public}d: roaming on", slotId_);
326     if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
327         TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_);
328         return;
329     }
330     bool roamingState = false;
331     if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
332         roamingState = true;
333     }
334     if (!roamingState) {
335         TELEPHONY_LOGE("Slot%{public}d: device not currently roaming state", slotId_);
336         return;
337     }
338     ApnProfileState apnState = apnManager_->GetOverallApnState();
339     if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
340         ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
341     }
342     EstablishAllApnsIfConnectable();
343 }
344 
RoamingStateOff(const InnerEvent::Pointer & event)345 void CellularDataHandler::RoamingStateOff(const InnerEvent::Pointer &event)
346 {
347     TELEPHONY_LOGI("Slot%{public}d: roaming off", slotId_);
348     if (event == nullptr || dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
349         TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ or apnManager_ is null", slotId_);
350         return;
351     }
352     ApnProfileState apnState = apnManager_->GetOverallApnState();
353     if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
354         ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
355     }
356     EstablishAllApnsIfConnectable();
357 }
358 
PsRadioEmergencyStateOpen(const InnerEvent::Pointer & event)359 void CellularDataHandler::PsRadioEmergencyStateOpen(const InnerEvent::Pointer &event)
360 {
361     TELEPHONY_LOGI("Slot%{public}d: emergency on", slotId_);
362     ApnProfileState currentState = apnManager_->GetOverallApnState();
363     if (currentState == ApnProfileState::PROFILE_STATE_CONNECTED ||
364         currentState == ApnProfileState::PROFILE_STATE_CONNECTING) {
365         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
366     }
367 }
368 
PsRadioEmergencyStateClose(const InnerEvent::Pointer & event)369 void CellularDataHandler::PsRadioEmergencyStateClose(const InnerEvent::Pointer &event)
370 {
371     TELEPHONY_LOGI("Slot%{public}d: emergency off", slotId_);
372     ApnProfileState currentState = apnManager_->GetOverallApnState();
373     if (currentState == ApnProfileState::PROFILE_STATE_IDLE ||
374         currentState == ApnProfileState::PROFILE_STATE_DISCONNECTING) {
375         EstablishAllApnsIfConnectable();
376     }
377 }
378 
EstablishAllApnsIfConnectable()379 void CellularDataHandler::EstablishAllApnsIfConnectable()
380 {
381     if (apnManager_ == nullptr) {
382         TELEPHONY_LOGE("Slot%{public}d: EstablishAllApnsIfConnectable:apnManager is null", slotId_);
383         return;
384     }
385     const int32_t defSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
386     if (defSlotId != slotId_) {
387         TELEPHONY_LOGI("Slot%{public}d: Establish all default:%{public}d", slotId_, defSlotId);
388         return;
389     }
390     for (sptr<ApnHolder> apnHolder : apnManager_->GetSortApnHolder()) {
391         if (apnHolder == nullptr) {
392             TELEPHONY_LOGE("Slot%{public}d: apn is null", slotId_);
393             continue;
394         }
395         if (apnHolder->IsDataCallEnabled()) {
396             ApnProfileState apnState = apnHolder->GetApnState();
397             if (apnState == PROFILE_STATE_FAILED || apnState == PROFILE_STATE_RETRYING) {
398                 apnHolder->ReleaseDataConnection();
399             }
400             if (apnHolder->IsDataCallConnectable()) {
401                 AttemptEstablishDataConnection(apnHolder);
402             }
403         }
404     }
405 }
406 
CheckCellularDataSlotId()407 bool CellularDataHandler::CheckCellularDataSlotId()
408 {
409     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
410     const int32_t defSlotId = coreInner.GetDefaultCellularDataSlotId();
411     if (defSlotId != slotId_) {
412         TELEPHONY_LOGI("Slot%{public}d: default:%{public}d, current:%{public}d", slotId_, defSlotId, slotId_);
413         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
414             CellularDataErrorCode::DATA_ERROR_CELLULAR_DATA_SLOT_ID_MISMATCH,
415             "Default cellular data slot id is not current slot id");
416         return false;
417     }
418     return true;
419 }
420 
CheckAttachAndSimState(sptr<ApnHolder> & apnHolder)421 bool CellularDataHandler::CheckAttachAndSimState(sptr<ApnHolder> &apnHolder)
422 {
423     if (apnHolder == nullptr) {
424         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
425         return false;
426     }
427     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
428     bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE;
429     SimState simState = SimState::SIM_STATE_UNKNOWN;
430     coreInner.GetSimState(slotId_, simState);
431     TELEPHONY_LOGI("Slot%{public}d: attached: %{public}d simState: %{public}d", slotId_, attached, simState);
432     bool isEmergencyApn = apnHolder->IsEmergencyType();
433     if (!isEmergencyApn && !attached) {
434         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
435             CellularDataErrorCode::DATA_ERROR_PS_NOT_ATTACH, "It is not emergencyApn and not attached");
436         return false;
437     }
438     if (!isEmergencyApn && (simState != SimState::SIM_STATE_READY)) {
439         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
440             CellularDataErrorCode::DATA_ERROR_SIM_NOT_READY, "It is not emergencyApn and sim not ready");
441         return false;
442     }
443     return true;
444 }
445 
CheckRoamingState(sptr<ApnHolder> & apnHolder)446 bool CellularDataHandler::CheckRoamingState(sptr<ApnHolder> &apnHolder)
447 {
448     if (dataSwitchSettings_ == nullptr || apnHolder == nullptr) {
449         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_);
450         return false;
451     }
452     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
453     bool isEmergencyApn = apnHolder->IsEmergencyType();
454     bool isAllowActiveData = dataSwitchSettings_->IsAllowActiveData();
455     bool roamingState = coreInner.GetPsRoamingState(slotId_) > 0;
456     bool dataRoamingEnabled = false;
457     dataSwitchSettings_->IsUserDataRoamingOn(dataRoamingEnabled);
458     if (roamingState && !dataRoamingEnabled) {
459         isAllowActiveData = false;
460     }
461     if (isEmergencyApn) {
462         isAllowActiveData = true;
463     }
464     if (!isAllowActiveData) {
465         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
466             CellularDataErrorCode::DATA_ERROR_ROAMING_SWITCH_OFF_AND_ROAMING, "Data roaming is not on and is roaming");
467         TELEPHONY_LOGE("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_,
468             isAllowActiveData, lastCallState_);
469         return false;
470     }
471     if (IsRestrictedMode()) {
472         CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
473             CellularDataErrorCode::DATA_ERROR_CALL_AND_DATA_NOT_CONCURRENCY,
474             "CS call and data are not allowed concurrency");
475         TELEPHONY_LOGE("Slot%{public}d: AllowActiveData:%{public}d lastCallState_:%{public}d", slotId_,
476             isAllowActiveData, lastCallState_);
477         return false;
478     }
479     return true;
480 }
481 
CheckApnState(sptr<ApnHolder> & apnHolder)482 bool CellularDataHandler::CheckApnState(sptr<ApnHolder> &apnHolder)
483 {
484     if (apnManager_ == nullptr || apnHolder == nullptr) {
485         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or apnManager_ is null", slotId_);
486         return false;
487     }
488 
489     if (apnHolder->GetApnState() == PROFILE_STATE_FAILED) {
490         apnHolder->SetApnState(PROFILE_STATE_IDLE);
491     }
492 
493     if (apnHolder->GetApnState() != PROFILE_STATE_IDLE) {
494         TELEPHONY_LOGI("Slot%{public}d: APN holder is not idle", slotId_);
495         return false;
496     }
497     std::vector<sptr<ApnItem>> matchedApns = apnManager_->FilterMatchedApns(apnHolder->GetApnType());
498     if (matchedApns.empty()) {
499         TELEPHONY_LOGE("Slot%{public}d: AttemptEstablishDataConnection:matchedApns is empty", slotId_);
500         return false;
501     }
502     apnHolder->SetAllMatchedApns(matchedApns);
503     return true;
504 }
505 
AttemptEstablishDataConnection(sptr<ApnHolder> & apnHolder)506 void CellularDataHandler::AttemptEstablishDataConnection(sptr<ApnHolder> &apnHolder)
507 {
508     if (!CheckCellularDataSlotId() || !CheckAttachAndSimState(apnHolder) || !CheckRoamingState(apnHolder)) {
509         return;
510     }
511     DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->SetCellularDataActivateStartTime();
512     StartTrace(HITRACE_TAG_OHOS, "ActivateCellularData");
513     if (!CheckApnState(apnHolder)) {
514         FinishTrace(HITRACE_TAG_OHOS);
515         return;
516     }
517     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
518     int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
519     coreInner.GetPsRadioTech(slotId_, radioTech);
520     if (!EstablishDataConnection(apnHolder, radioTech)) {
521         TELEPHONY_LOGE("Slot%{public}d: Establish data connection fail", slotId_);
522     }
523     FinishTrace(HITRACE_TAG_OHOS);
524     DelayedSingleton<CellularDataHiSysEvent>::GetInstance()->JudgingDataActivateTimeOut(slotId_, SWITCH_ON);
525 }
526 
FindIdleCellularDataConnection() const527 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::FindIdleCellularDataConnection() const
528 {
529     if (connectionManager_ == nullptr) {
530         TELEPHONY_LOGE("Slot%{public}d: in FindIdleCellularDataConnection connectionManager_ is null", slotId_);
531         return nullptr;
532     }
533     std::vector<std::shared_ptr<CellularDataStateMachine>> allMachines = connectionManager_->GetAllConnectionMachine();
534     for (const std::shared_ptr<CellularDataStateMachine> &connect : allMachines) {
535         if (connect == nullptr || apnManager_ == nullptr) {
536             TELEPHONY_LOGE("Slot%{public}d: CellularDataHandler:stateMachine or apnManager_ is null", slotId_);
537             return nullptr;
538         }
539         if (connect->IsInactiveState() && apnManager_->IsDataConnectionNotUsed(connect)) {
540             return connect;
541         }
542     }
543     return nullptr;
544 }
545 
CreateCellularDataConnect()546 std::shared_ptr<CellularDataStateMachine> CellularDataHandler::CreateCellularDataConnect()
547 {
548     if (stateMachineEventLoop_ == nullptr) {
549         stateMachineEventLoop_ = AppExecFwk::EventRunner::Create("CellularDataStateMachine");
550         if (stateMachineEventLoop_ == nullptr) {
551             TELEPHONY_LOGE("Slot%{public}d: failed to create EventRunner", slotId_);
552             return nullptr;
553         }
554         stateMachineEventLoop_->Run();
555     }
556     std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine =
557         std::make_shared<CellularDataStateMachine>(connectionManager_, shared_from_this(), stateMachineEventLoop_);
558     if (cellularDataStateMachine == nullptr) {
559         TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_);
560         return nullptr;
561     }
562     return cellularDataStateMachine;
563 }
564 
EstablishDataConnection(sptr<ApnHolder> & apnHolder,int32_t radioTech)565 bool CellularDataHandler::EstablishDataConnection(sptr<ApnHolder> &apnHolder, int32_t radioTech)
566 {
567     sptr<ApnItem> apnItem = apnHolder->GetNextRetryApn();
568     if (apnItem == nullptr) {
569         TELEPHONY_LOGE("Slot%{public}d: apnItem is null", slotId_);
570         return false;
571     }
572     int32_t profileId = apnItem->attr_.profileId_;
573     profileId == INVALID_PROFILE_ID ? apnHolder->GetProfileId(apnHolder->GetApnType()) : profileId;
574     if (!multipleConnectionsEnabled_) {
575         if (HasAnyHigherPriorityConnection(apnHolder)) {
576             TELEPHONY_LOGE("Slot%{public}d: has higher priority connection", slotId_);
577             return false;
578         }
579         ApnProfileState apnState = apnManager_->GetOverallApnState();
580         if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
581             apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
582             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
583         }
584     }
585     std::shared_ptr<CellularDataStateMachine> cellularDataStateMachine = FindIdleCellularDataConnection();
586     if (cellularDataStateMachine == nullptr) {
587         cellularDataStateMachine = CreateCellularDataConnect();
588         if (cellularDataStateMachine == nullptr) {
589             TELEPHONY_LOGE("Slot%{public}d: cellularDataStateMachine is null", slotId_);
590             return false;
591         }
592         cellularDataStateMachine->Init();
593         if (connectionManager_ == nullptr) {
594             TELEPHONY_LOGE("Slot%{public}d: in EstablishDataConnection connectionManager_ is null", slotId_);
595             return false;
596         }
597         connectionManager_->AddConnectionStateMachine(cellularDataStateMachine);
598     }
599     cellularDataStateMachine->SetCapability(apnHolder->GetCapability());
600     apnHolder->SetCurrentApn(apnItem);
601     apnHolder->SetApnState(PROFILE_STATE_CONNECTING);
602     apnHolder->SetCellularDataStateMachine(cellularDataStateMachine);
603     bool roamingState = CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0;
604     bool userDataRoaming = false;
605     dataSwitchSettings_->IsUserDataRoamingOn(userDataRoaming);
606     StateNotification::GetInstance().UpdateCellularDataConnectState(slotId_, PROFILE_STATE_CONNECTING, radioTech);
607     std::unique_ptr<DataConnectionParams> object =
608         std::make_unique<DataConnectionParams>(apnHolder, profileId, radioTech, roamingState, userDataRoaming, true);
609     if (object == nullptr) {
610         TELEPHONY_LOGE("DataConnectionParams is nullptr");
611         return false;
612     }
613     TELEPHONY_LOGI("Slot%{public}d: MSG_SM_CONNECT profileId:%{public}d type:%{public}s networkType:%{public}d",
614         slotId_, profileId, apnHolder->GetApnType().c_str(), radioTech);
615     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_SM_CONNECT, object);
616     cellularDataStateMachine->SendEvent(event);
617     return true;
618 }
619 
EstablishDataConnectionComplete(const InnerEvent::Pointer & event)620 void CellularDataHandler::EstablishDataConnectionComplete(const InnerEvent::Pointer &event)
621 {
622     if (event == nullptr) {
623         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
624         return;
625     }
626     std::shared_ptr<SetupDataCallResultInfo> resultInfo = event->GetSharedObject<SetupDataCallResultInfo>();
627     if ((resultInfo != nullptr) && (apnManager_ != nullptr)) {
628         sptr<ApnHolder> apnHolder = apnManager_->GetApnHolder(apnManager_->FindApnNameByApnId(resultInfo->flag));
629         if (apnHolder == nullptr) {
630             TELEPHONY_LOGE("Slot%{public}d: flag:%{public}d complete apnHolder is null", slotId_, resultInfo->flag);
631             return;
632         }
633         apnHolder->SetApnState(PROFILE_STATE_CONNECTED);
634         apnHolder->InitialApnRetryCount();
635         int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
636         CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
637         StateNotification::GetInstance().UpdateCellularDataConnectState(slotId_, PROFILE_STATE_CONNECTED, networkType);
638         std::shared_ptr<CellularDataStateMachine> stateMachine = apnHolder->GetCellularDataStateMachine();
639         if (stateMachine != nullptr) {
640             stateMachine->UpdateNetworkInfo(*resultInfo);
641         } else {
642             TELEPHONY_LOGE(
643                 "Slot%{public}d:update network info stateMachine(%{public}d) is null", slotId_, resultInfo->flag);
644         }
645         if (connectionManager_ != nullptr) {
646             connectionManager_->StartStallDetectionTimer();
647             connectionManager_->BeginNetStatistics();
648         }
649         if (!physicalConnectionActiveState_) {
650             physicalConnectionActiveState_ = true;
651             CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
652         }
653     }
654 }
655 
GetSlotId() const656 int32_t CellularDataHandler::GetSlotId() const
657 {
658     return slotId_;
659 }
660 
DisconnectDataComplete(const InnerEvent::Pointer & event)661 void CellularDataHandler::DisconnectDataComplete(const InnerEvent::Pointer &event)
662 {
663     if ((event == nullptr) || (apnManager_ == nullptr)) {
664         TELEPHONY_LOGE("Slot%{public}d: event or apnManager is null", slotId_);
665         return;
666     }
667     if (connectionManager_ == nullptr) {
668         TELEPHONY_LOGE("Slot%{public}d: in DisconnectDataComplete connectionManager_ is null", slotId_);
669         return;
670     }
671     std::unique_ptr<DataDisconnectParams> object = event->GetUniqueObject<DataDisconnectParams>();
672     int32_t apnId = apnManager_->FindApnIdByApnName(object->GetApnType());
673     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(apnId);
674     if (apnHolder == nullptr) {
675         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null, apnId is %{public}d", slotId_, apnId);
676         return;
677     }
678     DisConnectionReason reason = object->GetReason();
679     apnHolder->SetApnState(PROFILE_STATE_IDLE);
680     int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
681     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
682     StateNotification::GetInstance().UpdateCellularDataConnectState(slotId_, PROFILE_STATE_IDLE, networkType);
683     TELEPHONY_LOGI("Slot%{public}d: apn type: %{public}s call:%{public}d", slotId_, apnHolder->GetApnType().c_str(),
684         apnHolder->IsDataCallEnabled());
685     bool noActiveConnection = connectionManager_->isNoActiveConnection();
686     if (noActiveConnection && physicalConnectionActiveState_) {
687         physicalConnectionActiveState_ = false;
688         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
689     } else if (!noActiveConnection && !physicalConnectionActiveState_) {
690         physicalConnectionActiveState_ = true;
691         CoreManagerInner::GetInstance().DcPhysicalLinkActiveUpdate(slotId_, physicalConnectionActiveState_);
692     }
693     if (apnHolder->IsDataCallEnabled()) {
694         if (apnHolder->GetApnState() == PROFILE_STATE_IDLE || apnHolder->GetApnState() == PROFILE_STATE_FAILED) {
695             apnHolder->SetCellularDataStateMachine(nullptr);
696         }
697         if (reason == DisConnectionReason::REASON_RETRY_CONNECTION) {
698             int64_t delayTime = apnHolder->GetRetryDelay();
699             TELEPHONY_LOGI("Slot%{public}d: Establish a data connection. The apn type is %{public}s", slotId_,
700                 apnHolder->GetApnType().c_str());
701             SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, delayTime);
702         }
703     }
704     if (connectionManager_ != nullptr && !apnManager_->HasAnyConnectedState()) {
705         connectionManager_->StopStallDetectionTimer();
706         connectionManager_->EndNetStatistics();
707     }
708     if (reason == DisConnectionReason::REASON_CHANGE_CONNECTION) {
709         HandleSortConnection();
710     }
711 }
712 
HandleSortConnection()713 void CellularDataHandler::HandleSortConnection()
714 {
715     ApnProfileState state = apnManager_->GetOverallApnState();
716     if (state == PROFILE_STATE_IDLE || state == PROFILE_STATE_FAILED) {
717         for (const sptr<ApnHolder> &sortApnHolder : apnManager_->GetSortApnHolder()) {
718             if (sortApnHolder->IsDataCallEnabled()) {
719                 int64_t delayTime = sortApnHolder->GetRetryDelay();
720                 int32_t apnId = apnManager_->FindApnIdByApnName(sortApnHolder->GetApnType());
721                 TELEPHONY_LOGI("Slot%{public}d: HandleSortConnection the apn type is %{public}s", slotId_,
722                     sortApnHolder->GetApnType().c_str());
723                 SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, apnId, delayTime);
724                 break;
725             }
726         }
727     }
728 }
729 
MsgEstablishDataConnection(const InnerEvent::Pointer & event)730 void CellularDataHandler::MsgEstablishDataConnection(const InnerEvent::Pointer &event)
731 {
732     if (apnManager_ == nullptr || event == nullptr) {
733         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_);
734         return;
735     }
736     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(event->GetParam());
737     if (apnHolder == nullptr) {
738         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null", slotId_);
739         return;
740     }
741     TELEPHONY_LOGI("Slot%{public}d: Establish a data connection. APN holder type:%{public}s call:%{public}d", slotId_,
742         apnHolder->GetApnType().c_str(), apnHolder->IsDataCallEnabled());
743     if (apnHolder->IsDataCallEnabled()) {
744         AttemptEstablishDataConnection(apnHolder);
745     } else {
746         DisConnectionReason reason = DisConnectionReason::REASON_CHANGE_CONNECTION;
747         if (multipleConnectionsEnabled_) {
748             reason = DisConnectionReason::REASON_CLEAR_CONNECTION;
749         }
750         ClearConnection(apnHolder, reason);
751     }
752 }
753 
MsgRequestNetwork(const InnerEvent::Pointer & event)754 void CellularDataHandler::MsgRequestNetwork(const InnerEvent::Pointer &event)
755 {
756     if (apnManager_ == nullptr || event == nullptr) {
757         TELEPHONY_LOGE("Slot%{public}d: apnManager_ or event is null", slotId_);
758         return;
759     }
760     std::unique_ptr<NetRequest> netRequest = event->GetUniqueObject<NetRequest>();
761     if (netRequest == nullptr) {
762         TELEPHONY_LOGE("Slot%{public}d: netRequest is null", slotId_);
763         return;
764     }
765     NetRequest request;
766     request.ident = netRequest->ident;
767     request.capability = netRequest->capability;
768     int32_t id = ApnManager::FindApnIdByCapability(request.capability);
769     sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
770     if (apnHolder == nullptr) {
771         TELEPHONY_LOGE("Slot%{public}d: apnHolder is null.", slotId_);
772         return;
773     }
774     if (event->GetParam() == TYPE_REQUEST_NET) {
775         apnHolder->RequestCellularData(request);
776     } else {
777         apnHolder->ReleaseCellularData(request);
778         if (apnHolder->IsDataCallEnabled()) {
779             return;
780         }
781     }
782     InnerEvent::Pointer innerEvent = InnerEvent::Get(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id);
783     if (!SendEvent(innerEvent)) {
784         TELEPHONY_LOGE("Slot%{public}d: send data connection event failed", slotId_);
785     }
786 }
787 
ProcessEvent(const InnerEvent::Pointer & event)788 void CellularDataHandler::ProcessEvent(const InnerEvent::Pointer &event)
789 {
790     if (event == nullptr) {
791         TELEPHONY_LOGE("Slot%{public}d: start ProcessEvent but event is null!", slotId_);
792         return;
793     }
794     uint32_t eventCode = event->GetInnerEventId();
795     std::map<uint32_t, Fun>::iterator it = eventIdMap_.find(eventCode);
796     if (it != eventIdMap_.end()) {
797         (this->*(it->second))(event);
798     }
799 }
800 
OnReceiveEvent(const EventFwk::CommonEventData & data)801 void CellularDataHandler::OnReceiveEvent(const EventFwk::CommonEventData &data)
802 {
803     const AAFwk::Want &want = data.GetWant();
804     std::string action = want.GetAction();
805     if (EventFwk::CommonEventSupport::COMMON_EVENT_CALL_STATE_CHANGED == action) {
806         int32_t slotId = want.GetIntParam("slotId", 0);
807         if (slotId_ != slotId) {
808             return;
809         }
810         int32_t state = want.GetIntParam("state", CALL_STATUS_UNKNOWN);
811         if (state == CALL_STATUS_UNKNOWN) {
812             TELEPHONY_LOGE("Slot%{public}d: unknown call state=%{public}d", slotId, state);
813             return;
814         }
815         HandleVoiceCallChanged(state);
816     } else {
817         TELEPHONY_LOGI("Slot%{public}d: action=%{public}s code=%{public}d", slotId_, action.c_str(), data.GetCode());
818     }
819 }
820 
HandleSettingSwitchChanged(const InnerEvent::Pointer & event)821 void CellularDataHandler::HandleSettingSwitchChanged(const InnerEvent::Pointer &event)
822 {
823     if (event == nullptr) {
824         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
825         return;
826     }
827     bool setting_switch = event->GetParam();
828     TELEPHONY_LOGI("Slot%{public}d: setting switch = %{public}d", slotId_, setting_switch);
829 }
830 
HandleVoiceCallChanged(int32_t state)831 void CellularDataHandler::HandleVoiceCallChanged(int32_t state)
832 {
833     if (apnManager_ == nullptr || connectionManager_ == nullptr) {
834         TELEPHONY_LOGE("Slot%{public}d: apnManager or connectionManager is null!", slotId_);
835         return;
836     }
837     TELEPHONY_LOGI("Slot%{public}d: handle voice call changed lastState:%{public}d, state:%{public}d", slotId_,
838         lastCallState_, state);
839     // next to check if radio technology support voice and data at same time.
840     int32_t psRadioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
841     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, psRadioTech);
842     bool support = (psRadioTech == static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_GSM));
843     if (lastCallState_ != state) {
844         // call is busy
845         lastCallState_ = state;
846         if (state != TelCallStatus::CALL_STATUS_IDLE && state != TelCallStatus::CALL_STATUS_DISCONNECTED) {
847             if (apnManager_->HasAnyConnectedState() && support) {
848                 connectionManager_->EndNetStatistics();
849                 connectionManager_->SetDataFlowType(CellDataFlowType::DATA_FLOW_TYPE_DORMANT);
850                 connectionManager_->StopStallDetectionTimer();
851                 disconnectionReason_ = DisConnectionReason::REASON_GSM_AND_CALLING_ONLY;
852             }
853         } else {
854             if (apnManager_->HasAnyConnectedState() && support) {
855                 connectionManager_->StartStallDetectionTimer();
856                 connectionManager_->BeginNetStatistics();
857             }
858             disconnectionReason_ = DisConnectionReason::REASON_NORMAL;
859             TELEPHONY_LOGI("Slot%{public}d: HandleVoiceCallChanged EstablishAllApnsIfConnectable", slotId_);
860             EstablishAllApnsIfConnectable();
861         }
862         TELEPHONY_LOGI("Slot%{public}d: disconnectionReason_=%{public}d", slotId_, disconnectionReason_);
863     }
864 }
865 
HandleSimStateOrRecordsChanged(const AppExecFwk::InnerEvent::Pointer & event)866 void CellularDataHandler::HandleSimStateOrRecordsChanged(const AppExecFwk::InnerEvent::Pointer &event)
867 {
868     if (event == nullptr) {
869         return;
870     }
871     std::u16string iccId;
872     uint32_t eventId = event->GetInnerEventId();
873     switch (eventId) {
874         case RadioEvent::RADIO_SIM_STATE_CHANGE: {
875             SimState simState = SimState::SIM_STATE_UNKNOWN;
876             CoreManagerInner::GetInstance().GetSimState(slotId_, simState);
877             TELEPHONY_LOGI("Slot%{public}d: sim state is :%{public}d", slotId_, simState);
878             if (simState != SimState::SIM_STATE_READY) {
879                 ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
880                 if (simState == SimState::SIM_STATE_NOT_PRESENT) {
881                     UnRegisterDataSettingObserver();
882                 }
883             } else {
884                 dataSwitchSettings_->LoadSwitchValue();
885                 CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId);
886                 if (lastIccId_ != u"" && lastIccId_ == iccId) {
887                     EstablishAllApnsIfConnectable();
888                 }
889             }
890             break;
891         }
892         case RadioEvent::RADIO_SIM_RECORDS_LOADED: {
893             CoreManagerInner::GetInstance().GetSimIccId(slotId_, iccId);
894             SimState simState = SimState::SIM_STATE_UNKNOWN;
895             CoreManagerInner::GetInstance().GetSimState(slotId_, simState);
896             TELEPHONY_LOGI("Slot%{public}d: sim records loaded state is :%{public}d", slotId_, simState);
897             if (simState == SimState::SIM_STATE_READY && iccId != u"") {
898                 if (iccId != lastIccId_) {
899                     dataSwitchSettings_->SetPolicyDataOn(true);
900                     GetConfigurationFor5G();
901                     lastIccId_ = iccId;
902                     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_APN_CHANGED);
903                     SendEvent(event);
904                 } else if (lastIccId_ == iccId) {
905                     TELEPHONY_LOGI("Slot%{public}d: sim state changed, but iccId not changed.", slotId_);
906                     // the sim card status has changed to ready, so try to connect
907                     EstablishAllApnsIfConnectable();
908                 }
909             }
910             break;
911         }
912         default:
913             break;
914     }
915 }
916 
HandleSimAccountLoaded(const InnerEvent::Pointer & event)917 void CellularDataHandler::HandleSimAccountLoaded(const InnerEvent::Pointer &event)
918 {
919     if (event == nullptr || dataSwitchSettings_ == nullptr) {
920         TELEPHONY_LOGE("Slot%{public}d: event or dataSwitchSettings_ is null", slotId_);
921         return;
922     }
923     CellularDataNetAgent::GetInstance().RegisterNetSupplier(slotId_);
924     if (slotId_ == 0) {
925         CellularDataNetAgent::GetInstance().RegisterPolicyCallback();
926     }
927     RegisterDataSettingObserver();
928     dataSwitchSettings_->LoadSwitchValue();
929     int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
930     TELEPHONY_LOGI("Slot%{public}d: HandleSimAccountLoaded defaultSlotId is: %{public}d", slotId_, defaultSlotId);
931     if (slotId_ == defaultSlotId) {
932         SetDataPermitted(true);
933         EstablishAllApnsIfConnectable();
934     } else {
935         ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
936         SetDataPermitted(false);
937     }
938 }
939 
HandleApnChanged()940 bool CellularDataHandler::HandleApnChanged()
941 {
942     if (apnManager_ == nullptr) {
943         TELEPHONY_LOGE("apnManager is null");
944         return false;
945     }
946     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
947         TELEPHONY_LOGI("Slot%{public}d: apn type:%{public}s state:%{public}d", slotId_, apnHolder->GetApnType().c_str(),
948             apnHolder->GetApnState());
949     }
950     InnerEvent::Pointer event = InnerEvent::Get(CellularDataEventCode::MSG_APN_CHANGED);
951     if (event == nullptr) {
952         TELEPHONY_LOGE("Slot%{public}d: get apn changed event is null", slotId_);
953         return false;
954     }
955     return SendEvent(event);
956 }
957 
HandleApnChanged(const InnerEvent::Pointer & event)958 void CellularDataHandler::HandleApnChanged(const InnerEvent::Pointer &event)
959 {
960     if (apnManager_ == nullptr) {
961         TELEPHONY_LOGE("Slot%{public}d: apnManager_ is null", slotId_);
962         return;
963     }
964     std::u16string operatorNumeric;
965     CoreManagerInner::GetInstance().GetSimOperatorNumeric(slotId_, operatorNumeric);
966     std::string numeric = Str16ToStr8(operatorNumeric);
967     int32_t result = 0;
968     for (int32_t i = 0; i < DEFAULT_READ_APN_TIME; ++i) {
969         result = apnManager_->CreateAllApnItemByDatabase(numeric);
970         if (result != 0) {
971             break;
972         }
973     }
974     if (result == 0) {
975         apnManager_->CreateAllApnItem();
976     }
977     SetRilAttachApn();
978     ApnProfileState apnState = apnManager_->GetOverallApnState();
979     if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
980         ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
981     }
982     for (const sptr<ApnHolder> &apnHolder : apnManager_->GetAllApnHolder()) {
983         if (apnHolder == nullptr) {
984             continue;
985         }
986         int32_t id = apnManager_->FindApnIdByApnName(apnHolder->GetApnType());
987         SendEvent(CellularDataEventCode::MSG_ESTABLISH_DATA_CONNECTION, id, ESTABLISH_DATA_CONNECTION_DELAY);
988     }
989 }
990 
GetCellularDataFlowType()991 int32_t CellularDataHandler::GetCellularDataFlowType()
992 {
993     if (connectionManager_ == nullptr) {
994         TELEPHONY_LOGE("Slot%{public}d: connection manager is null", slotId_);
995         return 0;
996     }
997     return connectionManager_->GetDataFlowType();
998 }
999 
HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer & event)1000 void CellularDataHandler::HandleRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
1001 {
1002     if (apnManager_ == nullptr || event == nullptr) {
1003         TELEPHONY_LOGE("Slot%{public}d: radio off or not available apnManager or event is null!", slotId_);
1004         return;
1005     }
1006     std::shared_ptr<HRilInt32Parcel> object = event->GetSharedObject<HRilInt32Parcel>();
1007     if (object == nullptr) {
1008         TELEPHONY_LOGE("Slot%{public}d: HandleRadioStateChanged object is nullptr!", slotId_);
1009         return;
1010     }
1011     TELEPHONY_LOGI("Slot%{public}d: Radio changed with state: %{public}d", slotId_, object->data);
1012     switch (object->data) {
1013         case CORE_SERVICE_POWER_OFF:
1014         case CORE_SERVICE_POWER_NOT_AVAILABLE: {
1015             ApnProfileState apnState = apnManager_->GetOverallApnState();
1016             TELEPHONY_LOGI("Slot%{public}d: apn state is %{public}d", slotId_, apnState);
1017             if (apnState != ApnProfileState::PROFILE_STATE_IDLE) {
1018                 ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1019             }
1020             break;
1021         }
1022         case CORE_SERVICE_POWER_ON:
1023             SyncDataPermitted();
1024             SetRilLinkBandwidths();
1025             EstablishAllApnsIfConnectable();
1026             break;
1027         default:
1028             TELEPHONY_LOGI("Slot%{public}d: un-handle state:%{public}d", slotId_, object->data);
1029             break;
1030     }
1031 }
1032 
PsDataRatChanged(const InnerEvent::Pointer & event)1033 void CellularDataHandler::PsDataRatChanged(const InnerEvent::Pointer &event)
1034 {
1035     CoreManagerInner &coreInner = CoreManagerInner::GetInstance();
1036     int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1037     coreInner.GetPsRadioTech(slotId_, radioTech);
1038     TELEPHONY_LOGI("Slot%{public}d: radioTech is %{public}d", slotId_, radioTech);
1039     if (event == nullptr) {
1040         TELEPHONY_LOGE("Slot%{public}d: event is null", slotId_);
1041         return;
1042     }
1043     bool dataEnabled = false;
1044     IsCellularDataEnabled(dataEnabled);
1045     if (!dataEnabled) {
1046         TELEPHONY_LOGE("Slot%{public}d: data enable is close", slotId_);
1047         return;
1048     }
1049     bool attached = coreInner.GetPsRegState(slotId_) == (int32_t)RegServiceState::REG_STATE_IN_SERVICE;
1050     if (!attached) {
1051         TELEPHONY_LOGE("Slot%{public}d: attached is false", slotId_);
1052         return;
1053     }
1054     ApnProfileState apnState = apnManager_->GetOverallApnState();
1055     if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING || apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
1056         ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
1057     }
1058     EstablishAllApnsIfConnectable();
1059 }
1060 
SetPolicyDataOn(bool enable)1061 void CellularDataHandler::SetPolicyDataOn(bool enable)
1062 {
1063     if (dataSwitchSettings_ == nullptr) {
1064         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings is null", slotId_);
1065         return;
1066     }
1067     bool policyDataOn = dataSwitchSettings_->IsPolicyDataOn();
1068     if (policyDataOn != enable) {
1069         dataSwitchSettings_->SetPolicyDataOn(enable);
1070         if (enable) {
1071             EstablishAllApnsIfConnectable();
1072         } else {
1073             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1074         }
1075     }
1076 }
1077 
IsRestrictedMode() const1078 bool CellularDataHandler::IsRestrictedMode() const
1079 {
1080     int32_t networkType = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
1081     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, networkType);
1082     bool support = (networkType == (int32_t)RadioTech::RADIO_TECHNOLOGY_GSM);
1083     bool inCall = (lastCallState_ != TelCallStatus::CALL_STATUS_IDLE &&
1084                    lastCallState_ != TelCallStatus::CALL_STATUS_DISCONNECTED);
1085     TELEPHONY_LOGI("Slot%{public}d: radio technology is gsm only:%{public}d and call is busy:%{public}d", slotId_,
1086         support, inCall);
1087     return inCall && support;
1088 }
1089 
GetDisConnectionReason()1090 DisConnectionReason CellularDataHandler::GetDisConnectionReason()
1091 {
1092     return disconnectionReason_;
1093 }
1094 
SyncDataPermitted()1095 void CellularDataHandler::SyncDataPermitted()
1096 {
1097     const int32_t defSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
1098     if (defSlotId < 0) {
1099         TELEPHONY_LOGE("Slot%{public}d: defSlotId is %{public}d.", slotId_, defSlotId);
1100         return;
1101     }
1102     if (defSlotId == slotId_) {
1103         SetDataPermitted(true);
1104     } else {
1105         SetDataPermitted(false);
1106     }
1107 }
1108 
SetDataPermitted(bool dataPermitted)1109 void CellularDataHandler::SetDataPermitted(bool dataPermitted)
1110 {
1111     TELEPHONY_LOGI("Slot%{public}d: dataPermitted is %{public}d.", slotId_, dataPermitted);
1112     int32_t maxSimCount = CoreManagerInner::GetInstance().GetMaxSimCount();
1113     if (maxSimCount <= 1) {
1114         TELEPHONY_LOGE("Slot%{public}d: maxSimCount is: %{public}d", slotId_, maxSimCount);
1115         return;
1116     }
1117     CoreManagerInner::GetInstance().SetDataPermitted(
1118         slotId_, CellularDataEventCode::MSG_SET_DATA_PERMITTED, dataPermitted, shared_from_this());
1119 }
1120 
SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer & event)1121 void CellularDataHandler::SetDataPermittedResponse(const AppExecFwk::InnerEvent::Pointer &event)
1122 {
1123     if (event == nullptr) {
1124         TELEPHONY_LOGE("SetDataPermittedResponse:Slot%{public}d: event is null", slotId_);
1125         return;
1126     }
1127     std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>();
1128     if (rilInfo == nullptr) {
1129         TELEPHONY_LOGE("SetDataPermittedResponse:Slot%{public}d: HRilRadioResponseInfo is null", slotId_);
1130         return;
1131     }
1132     if (rilInfo->errorNo != 0) {
1133         TELEPHONY_LOGE("Slot%{public}d: SetDataPermitted error", slotId_);
1134     }
1135 }
1136 
SetRilAttachApn()1137 void CellularDataHandler::SetRilAttachApn()
1138 {
1139     sptr<ApnItem> attachApn = apnManager_->GetRilAttachApn();
1140     if (attachApn == nullptr) {
1141         TELEPHONY_LOGE("Slot%{public}d: attachApn is null", slotId_);
1142         return;
1143     }
1144     DataProfile dataProfile;
1145     dataProfile.profileId = attachApn->attr_.profileId_;
1146     dataProfile.apn = attachApn->attr_.apn_;
1147     dataProfile.protocol = attachApn->attr_.protocol_;
1148     dataProfile.verType = attachApn->attr_.authType_;
1149     dataProfile.userName = attachApn->attr_.user_;
1150     dataProfile.password = attachApn->attr_.password_;
1151     dataProfile.roamingProtocol = attachApn->attr_.roamingProtocol_;
1152     CoreManagerInner::GetInstance().SetInitApnInfo(
1153         slotId_, CellularDataEventCode::MSG_SET_RIL_ATTACH_APN, dataProfile, shared_from_this());
1154 }
1155 
SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer & event)1156 void CellularDataHandler::SetRilAttachApnResponse(const AppExecFwk::InnerEvent::Pointer &event)
1157 {
1158     if (event == nullptr) {
1159         TELEPHONY_LOGE("SetRilAttachApnResponse:Slot%{public}d: event is null", slotId_);
1160         return;
1161     }
1162     std::shared_ptr<TelRilResponseInfo<int32_t>> rilInfo = event->GetSharedObject<TelRilResponseInfo<int32_t>>();
1163     if (rilInfo == nullptr) {
1164         TELEPHONY_LOGE("SetRilAttachApnResponse:Slot%{public}d: HRilRadioResponseInfo is null", slotId_);
1165         return;
1166     }
1167     if (rilInfo->errorNo != 0) {
1168         TELEPHONY_LOGE("Slot%{public}d: SetRilAttachApn error", slotId_);
1169     }
1170 }
1171 
HasAnyHigherPriorityConnection(const sptr<ApnHolder> & apnHolder)1172 bool CellularDataHandler::HasAnyHigherPriorityConnection(const sptr<ApnHolder> &apnHolder)
1173 {
1174     if (apnManager_ == nullptr) {
1175         TELEPHONY_LOGE("Slot%{public}d: apnManager is null", slotId_);
1176         return false;
1177     }
1178     std::vector<sptr<ApnHolder>> sortApnHolders = apnManager_->GetSortApnHolder();
1179     if (sortApnHolders.empty()) {
1180         TELEPHONY_LOGE("Slot%{public}d: SortApnHolder is null", slotId_);
1181         return false;
1182     }
1183     for (const sptr<ApnHolder> &sortApnHolder : sortApnHolders) {
1184         if (sortApnHolder->GetPriority() > apnHolder->GetPriority()) {
1185             if (sortApnHolder->IsDataCallEnabled() &&
1186                 (sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTED ||
1187                     sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_CONNECTING ||
1188                     sortApnHolder->GetApnState() == ApnProfileState::PROFILE_STATE_DISCONNECTING)) {
1189                 CellularDataHiSysEvent::WriteDataActivateFaultEvent(slotId_, SWITCH_ON,
1190                     CellularDataErrorCode::DATA_ERROR_HAS_HIGHER_PRIORITY_CONNECTION,
1191                     "There is higher priority connection");
1192                 return true;
1193             }
1194         }
1195     }
1196     return false;
1197 }
1198 
HasInternetCapability(const int32_t cid) const1199 bool CellularDataHandler::HasInternetCapability(const int32_t cid) const
1200 {
1201     if (connectionManager_ == nullptr) {
1202         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
1203         return false;
1204     }
1205     std::shared_ptr<CellularDataStateMachine> activeStateMachine = connectionManager_->GetActiveConnectionByCid(cid);
1206     if (activeStateMachine == nullptr) {
1207         TELEPHONY_LOGE("Slot%{public}d: get activeStateMachine by cid fail", slotId_);
1208         return false;
1209     }
1210     uint64_t netCapability = activeStateMachine->GetCapability();
1211     if (netCapability == NetCap::NET_CAPABILITY_INTERNET) {
1212         return true;
1213     }
1214     return false;
1215 }
1216 
GetConfigurationFor5G()1217 void CellularDataHandler::GetConfigurationFor5G()
1218 {
1219     // get 5G configurations
1220     unMeteredAllNsaConfig_ = ParseOperatorConfig(u"allmeterednas");
1221     unMeteredNrNsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrnsammware");
1222     unMeteredNrNsaSub6Config_ = ParseOperatorConfig(u"meteredNrnsasub6");
1223     unMeteredAllNrsaConfig_ = ParseOperatorConfig(u"meteredallnrsa");
1224     unMeteredNrsaMmwaveConfig_ = ParseOperatorConfig(u"meterednrsammware");
1225     unMeteredNrsaSub6Config_ = ParseOperatorConfig(u"meterednrsasub6");
1226     unMeteredRoamingConfig_ = ParseOperatorConfig(u"meteredroaming");
1227     GetDefaultConfiguration();
1228 }
1229 
ParseOperatorConfig(const std::u16string & configName)1230 bool CellularDataHandler::ParseOperatorConfig(const std::u16string &configName)
1231 {
1232     OperatorConfig configsFor5G;
1233     CoreManagerInner::GetInstance().GetOperatorConfigs(slotId_, configsFor5G);
1234     if (configsFor5G.configValue.count(configName) > 0) {
1235         std::string flag = Str16ToStr8(configsFor5G.configValue[configName]);
1236         TELEPHONY_LOGI("Slot%{public}d: parse operator 5G config: %{public}s", slotId_, flag.c_str());
1237         if (flag == "true") {
1238             return true;
1239         }
1240     }
1241     return false;
1242 }
1243 
GetDefaultConfiguration()1244 void CellularDataHandler::GetDefaultConfiguration()
1245 {
1246     if (connectionManager_ == nullptr) {
1247         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
1248         return;
1249     }
1250     connectionManager_->GetDefaultBandWidthsConfig();
1251     connectionManager_->GetDefaultTcpBufferConfig();
1252     GetDefaultUpLinkThresholdsConfig();
1253     GetDefaultDownLinkThresholdsConfig();
1254     defaultMobileMtuConfig_ = CellularDataUtils::GetDefaultMobileMtuConfig();
1255     TELEPHONY_LOGI("Slot%{public}d: defaultMobileMtuConfig_ = %{public}d", slotId_, defaultMobileMtuConfig_);
1256     defaultPreferApn_ = CellularDataUtils::GetDefaultPreferApnConfig();
1257     TELEPHONY_LOGI("Slot%{public}d: defaultPreferApn_ is %{public}d", slotId_, defaultPreferApn_);
1258     multipleConnectionsEnabled_ = CellularDataUtils::GetDefaultMultipleConnectionsConfig();
1259     TELEPHONY_LOGI("Slot%{public}d: multipleConnectionsEnabled_ = %{public}d", slotId_, multipleConnectionsEnabled_);
1260 }
1261 
HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer & event)1262 void CellularDataHandler::HandleRadioNrStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
1263 {
1264     if (connectionManager_ == nullptr) {
1265         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
1266         return;
1267     }
1268     TELEPHONY_LOGI("Slot%{public}d: receive HandleRadioNrStateChanged event", slotId_);
1269     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
1270         connectionManager_->GetAllConnectionMachine();
1271     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
1272         InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_STATE_CHANGED);
1273         cellularDataStateMachine->SendEvent(eventCode);
1274     }
1275 }
1276 
HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer & event)1277 void CellularDataHandler::HandleRadioNrFrequencyChanged(const AppExecFwk::InnerEvent::Pointer &event)
1278 {
1279     if (connectionManager_ == nullptr) {
1280         TELEPHONY_LOGE("Slot%{public}d: connectionManager is null", slotId_);
1281         return;
1282     }
1283     TELEPHONY_LOGI("Slot%{public}d: receive HandleRadioNrFrequencyChanged event", slotId_);
1284     std::vector<std::shared_ptr<CellularDataStateMachine>> stateMachines =
1285         connectionManager_->GetAllConnectionMachine();
1286     for (const std::shared_ptr<CellularDataStateMachine> &cellularDataStateMachine : stateMachines) {
1287         InnerEvent::Pointer eventCode = InnerEvent::Get(RadioEvent::RADIO_NR_FREQUENCY_CHANGED);
1288         cellularDataStateMachine->SendEvent(eventCode);
1289     }
1290 }
1291 
GetDefaultUpLinkThresholdsConfig()1292 void CellularDataHandler::GetDefaultUpLinkThresholdsConfig()
1293 {
1294     upLinkThresholds_.clear();
1295     char upLinkConfig[UP_DOWN_LINK_SIZE] = { 0 };
1296     GetParameter(CONFIG_UPLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_UPLINK, upLinkConfig, UP_DOWN_LINK_SIZE);
1297     TELEPHONY_LOGI("Slot%{public}d: upLinkThresholds = %{public}s", slotId_, upLinkConfig);
1298     upLinkThresholds_ = CellularDataUtils::Split(upLinkConfig, ",");
1299 }
1300 
GetDefaultDownLinkThresholdsConfig()1301 void CellularDataHandler::GetDefaultDownLinkThresholdsConfig()
1302 {
1303     downLinkThresholds_.clear();
1304     char downLinkConfig[UP_DOWN_LINK_SIZE] = { 0 };
1305     GetParameter(CONFIG_DOWNLINK_THRESHOLDS, CAPACITY_THRESHOLDS_FOR_DOWNLINK, downLinkConfig, UP_DOWN_LINK_SIZE);
1306     TELEPHONY_LOGI("Slot%{public}d: downLinkThresholds_ = %{public}s", slotId_, downLinkConfig);
1307     downLinkThresholds_ = CellularDataUtils::Split(downLinkConfig, ",");
1308 }
1309 
SetRilLinkBandwidths()1310 void CellularDataHandler::SetRilLinkBandwidths()
1311 {
1312     LinkBandwidthRule linkBandwidth;
1313     CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, linkBandwidth.rat);
1314     linkBandwidth.delayMs = DELAY_SET_RIL_BANDWIDTH_MS;
1315     linkBandwidth.delayUplinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS;
1316     linkBandwidth.delayDownlinkKbps = DELAY_SET_RIL_UP_DOWN_BANDWIDTH_MS;
1317     for (std::string upLinkThreshold : upLinkThresholds_) {
1318         linkBandwidth.maximumUplinkKbps.push_back(atoi(upLinkThreshold.c_str()));
1319     }
1320     for (std::string downLinkThreshold : downLinkThresholds_) {
1321         linkBandwidth.maximumDownlinkKbps.push_back(atoi(downLinkThreshold.c_str()));
1322     }
1323     CoreManagerInner::GetInstance().SetLinkBandwidthReportingRule(
1324         slotId_, CellularDataEventCode::MSG_SET_RIL_BANDWIDTH, linkBandwidth, shared_from_this());
1325 }
1326 
HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer & event)1327 void CellularDataHandler::HandleDBSettingEnableChanged(const AppExecFwk::InnerEvent::Pointer &event)
1328 {
1329     if (event == nullptr) {
1330         return;
1331     }
1332     if (dataSwitchSettings_ == nullptr) {
1333         TELEPHONY_LOGE("Slot%{public}d: HandleDBSettingEnableChanged dataSwitchSettings_ is null.", slotId_);
1334         return;
1335     }
1336     int64_t value = event->GetParam();
1337     bool dataEnabled = false;
1338     dataSwitchSettings_->IsUserDataOn(dataEnabled);
1339     if (dataEnabled != value) {
1340         dataSwitchSettings_->SetUserDataOn(value);
1341         if (value) {
1342             EstablishAllApnsIfConnectable();
1343             if (apnManager_ == nullptr) {
1344                 TELEPHONY_LOGE("Slot%{public}d: apnManager is null.", slotId_);
1345                 return;
1346             }
1347             const int32_t id = DATA_CONTEXT_ROLE_DEFAULT_ID;
1348             sptr<ApnHolder> apnHolder = apnManager_->FindApnHolderById(id);
1349             if (apnHolder == nullptr) {
1350                 TELEPHONY_LOGE("Slot%{public}d: apnHolder is null.", slotId_);
1351                 return;
1352             }
1353             if (!apnHolder->IsDataCallEnabled()) {
1354                 NetRequest netRequest;
1355                 netRequest.ident =
1356                     std::string(IDENT_PREFIX) + std::to_string(CoreManagerInner::GetInstance().GetSimId(slotId_));
1357                 netRequest.capability = NetCap::NET_CAPABILITY_INTERNET;
1358                 apnHolder->RequestCellularData(netRequest);
1359                 AttemptEstablishDataConnection(apnHolder);
1360                 return;
1361             }
1362         } else {
1363             ClearAllConnections(DisConnectionReason::REASON_CLEAR_CONNECTION);
1364         }
1365     } else {
1366         TELEPHONY_LOGI("Slot%{public}d: The status of the cellular data switch has not changed", slotId_);
1367     }
1368 }
1369 
HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer & event)1370 void CellularDataHandler::HandleDBSettingRoamingChanged(const AppExecFwk::InnerEvent::Pointer &event)
1371 {
1372     if (event == nullptr) {
1373         return;
1374     }
1375     if (dataSwitchSettings_ == nullptr || apnManager_ == nullptr) {
1376         TELEPHONY_LOGE("Slot%{public}d: dataSwitchSettings_ or apnManager_ is null", slotId_);
1377         return;
1378     }
1379     int64_t value = event->GetParam();
1380     bool dataRoamingEnabled = false;
1381     dataSwitchSettings_->IsUserDataRoamingOn(dataRoamingEnabled);
1382     if (dataRoamingEnabled != value) {
1383         dataSwitchSettings_->SetUserDataRoamingOn(value);
1384         bool roamingState = false;
1385         if (CoreManagerInner::GetInstance().GetPsRoamingState(slotId_) > 0) {
1386             roamingState = true;
1387         }
1388         if (roamingState) {
1389             ApnProfileState apnState = apnManager_->GetOverallApnState();
1390             if (apnState == ApnProfileState::PROFILE_STATE_CONNECTING ||
1391                 apnState == ApnProfileState::PROFILE_STATE_CONNECTED) {
1392                 ClearAllConnections(DisConnectionReason::REASON_RETRY_CONNECTION);
1393             }
1394             EstablishAllApnsIfConnectable();
1395         } else {
1396             TELEPHONY_LOGI("Slot%{public}d: Not roaming(%{public}d), not doing anything", slotId_, roamingState);
1397         }
1398     } else {
1399         TELEPHONY_LOGI("Slot%{public}d: The roaming switch status has not changed", slotId_);
1400     }
1401 }
1402 
UnRegisterDataSettingObserver()1403 void CellularDataHandler::UnRegisterDataSettingObserver()
1404 {
1405     if (settingObserver_ == nullptr || roamingObserver_ == nullptr) {
1406         TELEPHONY_LOGE(
1407             "UnRegisterDataSettingObserver:Slot%{public}d: settingObserver_ or roamingObserver_ is null", slotId_);
1408         return;
1409     }
1410     std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance();
1411     if (settingHelper == nullptr) {
1412         TELEPHONY_LOGE("UnRegisterDataSettingObserver:Slot%{public}d: settingHelper is null", slotId_);
1413         return;
1414     }
1415     Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
1416     settingHelper->UnRegisterSettingsObserver(dataEnableUri, settingObserver_);
1417 
1418     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
1419     if (simId <= INVALID_SIM_ID) {
1420         TELEPHONY_LOGE(
1421             "UnRegisterDataSettingObserver:Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
1422         return;
1423     }
1424     Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
1425     settingHelper->UnRegisterSettingsObserver(dataRoamingUri, roamingObserver_);
1426 }
1427 
RegisterDataSettingObserver()1428 void CellularDataHandler::RegisterDataSettingObserver()
1429 {
1430     if (settingObserver_ == nullptr || roamingObserver_ == nullptr) {
1431         TELEPHONY_LOGE(
1432             "RegisterDataSettingObserver:Slot%{public}d: settingObserver_ or roamingObserver_ is null", slotId_);
1433         return;
1434     }
1435     std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance();
1436     if (settingHelper == nullptr) {
1437         TELEPHONY_LOGE("RegisterDataSettingObserver:Slot%{public}d: settingHelper is null", slotId_);
1438         return;
1439     }
1440     Uri dataEnableUri(CELLULAR_DATA_SETTING_DATA_ENABLE_URI);
1441     settingHelper->RegisterSettingsObserver(dataEnableUri, settingObserver_);
1442 
1443     int32_t simId = CoreManagerInner::GetInstance().GetSimId(slotId_);
1444     if (simId <= INVALID_SIM_ID) {
1445         TELEPHONY_LOGE(
1446             "RegisterDataSettingObserver:Slot%{public}d: failed due to invalid sim id %{public}d", slotId_, simId);
1447         return;
1448     }
1449     Uri dataRoamingUri(std::string(CELLULAR_DATA_SETTING_DATA_ROAMING_URI) + std::to_string(simId));
1450     settingHelper->RegisterSettingsObserver(dataRoamingUri, roamingObserver_);
1451 }
1452 } // namespace Telephony
1453 } // namespace OHOS
1454