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