1 /*
2 * Copyright (C) 2023 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 "incall_data_state_machine.h"
17
18 #include "cellular_data_settings_rdb_helper.h"
19 #include "core_manager_inner.h"
20 #include "telephony_log_wrapper.h"
21 #include "telephony_types.h"
22
23 namespace OHOS {
24 namespace Telephony {
UpdateCallState(int32_t state)25 void IncallDataStateMachine::UpdateCallState(int32_t state)
26 {
27 callState_ = state;
28 }
29
GetCallState() const30 int32_t IncallDataStateMachine::GetCallState() const
31 {
32 return callState_;
33 }
34
HasAnyConnectedState() const35 bool IncallDataStateMachine::HasAnyConnectedState() const
36 {
37 if (apnManager_ != nullptr) {
38 return apnManager_->HasAnyConnectedState();
39 }
40 return false;
41 }
42
GetSlotId() const43 int32_t IncallDataStateMachine::GetSlotId() const
44 {
45 return slotId_;
46 }
47
IsIncallDataSwitchOn()48 bool IncallDataStateMachine::IsIncallDataSwitchOn()
49 {
50 std::shared_ptr<CellularDataSettingsRdbHelper> settingHelper = CellularDataSettingsRdbHelper::GetInstance();
51 if (settingHelper == nullptr) {
52 TELEPHONY_LOGE("settingHelper null!");
53 return false;
54 }
55 int32_t value = static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_DISABLED);
56 int32_t intelligenceNetworkValue = static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_DISABLED);
57 Uri intelligenceNetworkUri(CELLULAR_DATA_SETTING_INTELLIGENCE_NETWORK_URI);
58 if (settingHelper->GetValue(
59 intelligenceNetworkUri, INTELLIGENCE_NETWORK_COLUMN_ENABLE,
60 intelligenceNetworkValue) != TELEPHONY_SUCCESS) {
61 TELEPHONY_LOGE("GetValue failed!");
62 return false;
63 }
64 int32_t smartDualCardValue = static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_DISABLED);
65 Uri smartDualCardUri(CELLULAR_DATA_SETTING_INTELLIGENCE_SWITCH_URI);
66 if (settingHelper->GetValue(
67 smartDualCardUri, INTELLIGENCE_SWITCH_COLUMN_ENABLE, smartDualCardValue) != TELEPHONY_SUCCESS) {
68 TELEPHONY_LOGE("GetValue failed!");
69 return false;
70 }
71 value = (intelligenceNetworkValue == static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED) &&
72 smartDualCardValue == static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED)) ?
73 static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED) :
74 static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_DISABLED);
75 TELEPHONY_LOGI("Slot%{public}d: value=%{public}d", slotId_, value);
76 return value == static_cast<int32_t>(DataSwitchCode::CELLULAR_DATA_ENABLED);
77 }
78
IsSecondaryCanActiveData()79 bool IncallDataStateMachine::IsSecondaryCanActiveData()
80 {
81 int32_t dsdsMode = DSDS_MODE_V2;
82 CoreManagerInner::GetInstance().GetDsdsMode(dsdsMode);
83 if (dsdsMode >= DSDS_MODE_V3) {
84 TELEPHONY_LOGI("Slot%{public}d: not dsds 2.0", slotId_);
85 return false;
86 }
87 int32_t primarySlotId = INVALID_SLOT_ID;
88 CoreManagerInner::GetInstance().GetPrimarySlotId(primarySlotId);
89 if (primarySlotId == INVALID_SLOT_ID || primarySlotId == slotId_) {
90 TELEPHONY_LOGI("Slot%{public}d: not secondary sim card", slotId_);
91 return false;
92 }
93 bool hasPrimarySimCard = false;
94 CoreManagerInner::GetInstance().HasSimCard(primarySlotId, hasPrimarySimCard);
95 if (!hasPrimarySimCard) {
96 TELEPHONY_LOGI("Slot%{public}d: no primary sim card", slotId_);
97 return false;
98 }
99 ImsRegInfo voiceInfo;
100 CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VOICE, voiceInfo);
101 ImsRegInfo videoInfo;
102 CoreManagerInner::GetInstance().GetImsRegStatus(slotId_, ImsServiceType::TYPE_VIDEO, videoInfo);
103 if (voiceInfo.imsRegState != ImsRegState::IMS_REGISTERED && videoInfo.imsRegState != ImsRegState::IMS_REGISTERED) {
104 TELEPHONY_LOGI("Slot%{public}d: not ims call", slotId_);
105 return false;
106 }
107 if (callState_ == static_cast<int32_t>(TelCallStatus::CALL_STATUS_IDLE) ||
108 callState_ == static_cast<int32_t>(TelCallStatus::CALL_STATUS_DISCONNECTED)) {
109 TELEPHONY_LOGI("Slot%{public}d: not in call", slotId_);
110 return false;
111 }
112 return CanActiveDataByRadioTech();
113 }
114
CanActiveDataByRadioTech()115 bool IncallDataStateMachine::CanActiveDataByRadioTech()
116 {
117 int32_t radioTech = static_cast<int32_t>(RadioTech::RADIO_TECHNOLOGY_INVALID);
118 CoreManagerInner::GetInstance().GetPsRadioTech(slotId_, radioTech);
119 switch (static_cast<RadioTech>(radioTech)) {
120 case RadioTech::RADIO_TECHNOLOGY_WCDMA:
121 // fall_through
122 case RadioTech::RADIO_TECHNOLOGY_HSPA:
123 // fall_through
124 case RadioTech::RADIO_TECHNOLOGY_HSPAP:
125 // fall_through
126 case RadioTech::RADIO_TECHNOLOGY_LTE:
127 // fall_through
128 case RadioTech::RADIO_TECHNOLOGY_LTE_CA:
129 // fall_through
130 case RadioTech::RADIO_TECHNOLOGY_NR:
131 return true;
132 default:
133 return false;
134 }
135 }
136
Init(int32_t callState)137 void IncallDataStateMachine::Init(int32_t callState)
138 {
139 idleState_ = new (std::nothrow) IdleState(std::weak_ptr<IncallDataStateMachine>(shared_from_this()), "IdleState");
140 secondaryActiveState_ = new (std::nothrow)
141 SecondaryActiveState(std::weak_ptr<IncallDataStateMachine>(shared_from_this()), "SecondaryActiveState");
142 activatingSecondaryState_ = new (std::nothrow)
143 ActivatingSecondaryState(std::weak_ptr<IncallDataStateMachine>(shared_from_this()), "ActivatingSecondaryState");
144 activatedSecondaryState_ = new (std::nothrow)
145 ActivatedSecondaryState(std::weak_ptr<IncallDataStateMachine>(shared_from_this()), "ActivatedSecondaryState");
146 deactivatingSecondaryState_ = new (std::nothrow) DeactivatingSecondaryState(
147 std::weak_ptr<IncallDataStateMachine>(shared_from_this()), "DeactivatingSecondaryState");
148 if (idleState_ == nullptr || secondaryActiveState_ == nullptr || activatingSecondaryState_ == nullptr ||
149 activatedSecondaryState_ == nullptr || deactivatingSecondaryState_ == nullptr) {
150 TELEPHONY_LOGE("memory allocation failed");
151 return;
152 }
153 activatingSecondaryState_->SetParentState(secondaryActiveState_);
154 activatedSecondaryState_->SetParentState(secondaryActiveState_);
155 callState_ = callState;
156 StateMachine::SetOriginalState(idleState_);
157 StateMachine::Start();
158 }
159
SetCurrentState(const sptr<State> && state)160 void IncallDataStateMachine::SetCurrentState(const sptr<State> &&state)
161 {
162 currentState_ = std::move(state);
163 }
164
GetCurrentState() const165 sptr<State> IncallDataStateMachine::GetCurrentState() const
166 {
167 return currentState_;
168 }
169
IsSecondaryActiveState() const170 bool IncallDataStateMachine::IsSecondaryActiveState() const
171 {
172 return currentState_ == activatingSecondaryState_ || currentState_ == activatedSecondaryState_;
173 }
174
DeInit()175 void IncallDataStateMachine::DeInit()
176 {
177 idleState_ = nullptr;
178 secondaryActiveState_ = nullptr;
179 activatingSecondaryState_ = nullptr;
180 activatedSecondaryState_ = nullptr;
181 deactivatingSecondaryState_ = nullptr;
182 currentState_ = nullptr;
183 cellularDataHandler_.reset();
184 apnManager_ = nullptr;
185
186 slotId_ = INVALID_SLOT_ID;
187 callState_ = static_cast<int32_t>(TelCallStatus::CALL_STATUS_IDLE);
188 }
189
StateBegin()190 void IdleState::StateBegin()
191 {
192 TELEPHONY_LOGI("Enter Idle State");
193 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
194 if (stateMachine == nullptr) {
195 TELEPHONY_LOGE("stateMachine is null");
196 return;
197 }
198 isActive_ = true;
199 stateMachine->SetCurrentState(sptr<State>(this));
200 if (stateMachine->GetCallState() == static_cast<int32_t>(TelCallStatus::CALL_STATUS_IDLE) ||
201 stateMachine->GetCallState() == static_cast<int32_t>(TelCallStatus::CALL_STATUS_DISCONNECTED)) {
202 std::shared_ptr<TelEventHandler> eventHandler = stateMachine->cellularDataHandler_.lock();
203 if (eventHandler != nullptr) {
204 eventHandler->SendEvent(CellularDataEventCode::MSG_INCALL_DATA_COMPLETE);
205 }
206 }
207 }
208
StateEnd()209 void IdleState::StateEnd()
210 {
211 TELEPHONY_LOGI("Exit Idle State");
212 isActive_ = false;
213 }
214
StateProcess(const AppExecFwk::InnerEvent::Pointer & event)215 bool IdleState::StateProcess(const AppExecFwk::InnerEvent::Pointer &event)
216 {
217 if (event == nullptr) {
218 TELEPHONY_LOGE("event is null");
219 return NOT_PROCESSED;
220 }
221 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
222 if (stateMachine == nullptr) {
223 TELEPHONY_LOGE("stateMachine is null");
224 return NOT_PROCESSED;
225 }
226 uint32_t eventCode = event->GetInnerEventId();
227 std::map<uint32_t, Fun>::iterator it = eventIdFunMap_.find(eventCode);
228 if (it != eventIdFunMap_.end()) {
229 return it->second(event);
230 }
231 return NOT_PROCESSED;
232 }
233
ProcessCallStarted(const AppExecFwk::InnerEvent::Pointer & event)234 bool IdleState::ProcessCallStarted(const AppExecFwk::InnerEvent::Pointer &event)
235 {
236 TELEPHONY_LOGI("IdleState::MSG_SM_INCALL_DATA_CALL_STARTED");
237 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
238 if (stateMachine == nullptr) {
239 TELEPHONY_LOGE("stateMachine is null");
240 return NOT_PROCESSED;
241 }
242 if (stateMachine->IsIncallDataSwitchOn() && stateMachine->IsSecondaryCanActiveData()) {
243 int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
244 if (defaultSlotId != stateMachine->GetSlotId()) {
245 stateMachine->TransitionTo(stateMachine->activatingSecondaryState_);
246 CoreManagerInner::GetInstance().SetDefaultCellularDataSlotId(stateMachine->GetSlotId());
247 }
248 }
249 return PROCESSED;
250 }
251
ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer & event)252 bool IdleState::ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer &event)
253 {
254 TELEPHONY_LOGI("IdleState::MSG_SM_INCALL_DATA_CALL_ENDED");
255 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
256 if (stateMachine == nullptr) {
257 TELEPHONY_LOGE("stateMachine is null");
258 return NOT_PROCESSED;
259 }
260 if (stateMachine->stateMachineEventHandler_ == nullptr) {
261 TELEPHONY_LOGE("stateMachineEventHandler_ is null");
262 return NOT_PROCESSED;
263 }
264 if (stateMachine->stateMachineEventHandler_->HasInnerEvent(
265 CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED)) {
266 stateMachine->stateMachineEventHandler_->RemoveEvent(CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED);
267 }
268 std::shared_ptr<TelEventHandler> eventHandler = stateMachine->cellularDataHandler_.lock();
269 if (eventHandler != nullptr) {
270 eventHandler->SendEvent(CellularDataEventCode::MSG_INCALL_DATA_COMPLETE);
271 }
272 return PROCESSED;
273 }
274
ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer & event)275 bool IdleState::ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer &event)
276 {
277 TELEPHONY_LOGI("IdleState::MSG_SM_INCALL_DATA_SETTINGS_ON");
278 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
279 if (stateMachine == nullptr) {
280 TELEPHONY_LOGE("stateMachine is null");
281 return NOT_PROCESSED;
282 }
283 if (stateMachine->IsIncallDataSwitchOn() && stateMachine->IsSecondaryCanActiveData()) {
284 int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
285 if (defaultSlotId != stateMachine->GetSlotId()) {
286 stateMachine->TransitionTo(stateMachine->activatingSecondaryState_);
287 CoreManagerInner::GetInstance().SetDefaultCellularDataSlotId(stateMachine->GetSlotId());
288 }
289 }
290 return PROCESSED;
291 }
292
ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer & event)293 bool IdleState::ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer &event)
294 {
295 TELEPHONY_LOGI("IdleState::MSG_SM_INCALL_DATA_DSDS_CHANGED");
296 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
297 if (stateMachine == nullptr) {
298 TELEPHONY_LOGE("stateMachine is null");
299 return NOT_PROCESSED;
300 }
301 if (stateMachine->IsIncallDataSwitchOn() && stateMachine->IsSecondaryCanActiveData()) {
302 int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
303 if (defaultSlotId != stateMachine->GetSlotId()) {
304 stateMachine->TransitionTo(stateMachine->activatingSecondaryState_);
305 CoreManagerInner::GetInstance().SetDefaultCellularDataSlotId(stateMachine->GetSlotId());
306 }
307 }
308 return PROCESSED;
309 }
310
StateBegin()311 void SecondaryActiveState::StateBegin()
312 {
313 TELEPHONY_LOGI("Enter SecondaryActive State");
314 isActive_ = true;
315 }
316
StateEnd()317 void SecondaryActiveState::StateEnd()
318 {
319 TELEPHONY_LOGI("Exit SecondaryActive State");
320 isActive_ = false;
321 }
322
StateProcess(const AppExecFwk::InnerEvent::Pointer & event)323 bool SecondaryActiveState::StateProcess(const AppExecFwk::InnerEvent::Pointer &event)
324 {
325 if (event == nullptr) {
326 TELEPHONY_LOGE("event is null");
327 return NOT_PROCESSED;
328 }
329 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
330 if (stateMachine == nullptr) {
331 TELEPHONY_LOGE("stateMachine is null");
332 return NOT_PROCESSED;
333 }
334 uint32_t eventCode = event->GetInnerEventId();
335 std::map<uint32_t, Fun>::iterator it = eventIdFunMap_.find(eventCode);
336 if (it != eventIdFunMap_.end()) {
337 return it->second(event);
338 }
339 return NOT_PROCESSED;
340 }
341
ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer & event)342 bool SecondaryActiveState::ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer &event)
343 {
344 TELEPHONY_LOGI("SecondaryActiveState::MSG_SM_INCALL_DATA_SETTINGS_ON");
345 return PROCESSED;
346 }
347
ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer & event)348 bool SecondaryActiveState::ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer &event)
349 {
350 TELEPHONY_LOGI("SecondaryActiveState::MSG_SM_INCALL_DATA_CALL_ENDED");
351 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
352 if (stateMachine == nullptr) {
353 TELEPHONY_LOGE("stateMachine is null");
354 return NOT_PROCESSED;
355 }
356 if (stateMachine->GetCallState() == static_cast<int32_t>(TelCallStatus::CALL_STATUS_IDLE) ||
357 stateMachine->GetCallState() == static_cast<int32_t>(TelCallStatus::CALL_STATUS_DISCONNECTED)) {
358 int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
359 int32_t primarySlotId = INVALID_SLOT_ID;
360 CoreManagerInner::GetInstance().GetPrimarySlotId(primarySlotId);
361 if (defaultSlotId != primarySlotId) {
362 stateMachine->TransitionTo(stateMachine->deactivatingSecondaryState_);
363 } else {
364 stateMachine->TransitionTo(stateMachine->idleState_);
365 }
366 }
367 return PROCESSED;
368 }
369
ProcessSettingsOff(const AppExecFwk::InnerEvent::Pointer & event)370 bool SecondaryActiveState::ProcessSettingsOff(const AppExecFwk::InnerEvent::Pointer &event)
371 {
372 TELEPHONY_LOGI("SecondaryActiveState::MSG_SM_INCALL_DATA_SETTINGS_OFF");
373 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
374 if (stateMachine == nullptr) {
375 TELEPHONY_LOGE("stateMachine is null");
376 return NOT_PROCESSED;
377 }
378 if (!stateMachine->IsIncallDataSwitchOn()) {
379 int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
380 int32_t primarySlotId = INVALID_SLOT_ID;
381 CoreManagerInner::GetInstance().GetPrimarySlotId(primarySlotId);
382 if (defaultSlotId != primarySlotId) {
383 stateMachine->TransitionTo(stateMachine->deactivatingSecondaryState_);
384 } else {
385 stateMachine->TransitionTo(stateMachine->idleState_);
386 }
387 }
388 return PROCESSED;
389 }
390
ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer & event)391 bool SecondaryActiveState::ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer &event)
392 {
393 TELEPHONY_LOGI("SecondaryActiveState::MSG_SM_INCALL_DATA_DSDS_CHANGED");
394 return PROCESSED;
395 }
396
StateBegin()397 void ActivatingSecondaryState::StateBegin()
398 {
399 TELEPHONY_LOGI("Enter ActivatingSecondary State");
400 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
401 if (stateMachine == nullptr) {
402 TELEPHONY_LOGE("stateMachine is null");
403 return;
404 }
405 isActive_ = true;
406 stateMachine->SetCurrentState(sptr<State>(this));
407 }
408
StateEnd()409 void ActivatingSecondaryState::StateEnd()
410 {
411 TELEPHONY_LOGI("Exit ActivatingSecondary State");
412 isActive_ = false;
413 }
414
StateProcess(const AppExecFwk::InnerEvent::Pointer & event)415 bool ActivatingSecondaryState::StateProcess(const AppExecFwk::InnerEvent::Pointer &event)
416 {
417 if (event == nullptr) {
418 TELEPHONY_LOGE("event is null");
419 return NOT_PROCESSED;
420 }
421 uint32_t eventCode = event->GetInnerEventId();
422 if (eventCode == CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_CONNECTED) {
423 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
424 if (stateMachine == nullptr) {
425 TELEPHONY_LOGE("stateMachine is null");
426 return NOT_PROCESSED;
427 }
428 stateMachine->TransitionTo(stateMachine->activatedSecondaryState_);
429 return PROCESSED;
430 }
431 return NOT_PROCESSED;
432 }
433
StateBegin()434 void ActivatedSecondaryState::StateBegin()
435 {
436 TELEPHONY_LOGI("Enter ActivatedSecondary State");
437 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
438 if (stateMachine == nullptr) {
439 TELEPHONY_LOGE("stateMachine is null");
440 return;
441 }
442 isActive_ = true;
443 stateMachine->SetCurrentState(sptr<State>(this));
444 }
445
StateEnd()446 void ActivatedSecondaryState::StateEnd()
447 {
448 TELEPHONY_LOGI("Exit ActivatedSecondary State");
449 isActive_ = false;
450 }
451
StateProcess(const AppExecFwk::InnerEvent::Pointer & event)452 bool ActivatedSecondaryState::StateProcess(const AppExecFwk::InnerEvent::Pointer &event)
453 {
454 return NOT_PROCESSED;
455 }
456
StateBegin()457 void DeactivatingSecondaryState::StateBegin()
458 {
459 TELEPHONY_LOGI("Enter DeactivatingSecondary State");
460 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
461 if (stateMachine == nullptr) {
462 TELEPHONY_LOGE("stateMachine is null");
463 return;
464 }
465 isActive_ = true;
466 stateMachine->SetCurrentState(sptr<State>(this));
467 int32_t defaultSlotId = CoreManagerInner::GetInstance().GetDefaultCellularDataSlotId();
468 int32_t primarySlotId = INVALID_SLOT_ID;
469 CoreManagerInner::GetInstance().GetPrimarySlotId(primarySlotId);
470 if (defaultSlotId != primarySlotId) {
471 CoreManagerInner::GetInstance().SetDefaultCellularDataSlotId(primarySlotId);
472 } else {
473 stateMachine->TransitionTo(stateMachine->idleState_);
474 }
475 if (!stateMachine->HasAnyConnectedState()) {
476 stateMachine->TransitionTo(stateMachine->idleState_);
477 }
478 }
479
StateEnd()480 void DeactivatingSecondaryState::StateEnd()
481 {
482 TELEPHONY_LOGI("Exit DeactivatingSecondary State");
483 isActive_ = false;
484 }
485
StateProcess(const AppExecFwk::InnerEvent::Pointer & event)486 bool DeactivatingSecondaryState::StateProcess(const AppExecFwk::InnerEvent::Pointer &event)
487 {
488 if (event == nullptr) {
489 TELEPHONY_LOGE("event is null");
490 return NOT_PROCESSED;
491 }
492 uint32_t eventCode = event->GetInnerEventId();
493 if (eventCode == CellularDataEventCode::MSG_SM_INCALL_DATA_DATA_DISCONNECTED) {
494 std::shared_ptr<IncallDataStateMachine> stateMachine = stateMachine_.lock();
495 if (stateMachine == nullptr) {
496 TELEPHONY_LOGE("stateMachine is null");
497 return NOT_PROCESSED;
498 }
499 int32_t primarySlotId = INVALID_SLOT_ID;
500 CoreManagerInner::GetInstance().GetPrimarySlotId(primarySlotId);
501 if (stateMachine->GetSlotId() != primarySlotId) {
502 stateMachine->TransitionTo(stateMachine->idleState_);
503 }
504 return PROCESSED;
505 }
506 if (eventCode == CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON) {
507 return PROCESSED;
508 }
509 return NOT_PROCESSED;
510 }
511 } // namespace Telephony
512 } // namespace OHOS
513