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 "call_status_manager.h"
17
18 #include <securec.h>
19
20 #include "call_manager_errors.h"
21 #include "telephony_log_wrapper.h"
22
23 #include "report_call_info_handler.h"
24 #include "cs_call.h"
25 #include "ims_call.h"
26 #include "ott_call.h"
27 #include "audio_control_manager.h"
28 #include "call_control_manager.h"
29
30 namespace OHOS {
31 namespace Telephony {
CallStatusManager()32 CallStatusManager::CallStatusManager()
33 {
34 (void)memset_s(&callReportInfo_, sizeof(CallDetailInfo), 0, sizeof(CallDetailInfo));
35 (void)memset_s(&callDetailsInfo_, sizeof(CallDetailsInfo), 0, sizeof(CallDetailsInfo));
36 }
37
~CallStatusManager()38 CallStatusManager::~CallStatusManager()
39 {
40 UnInit();
41 }
42
Init()43 int32_t CallStatusManager::Init()
44 {
45 callDetailsInfo_.callVec.clear();
46 mEventIdTransferMap_.clear();
47 mOttEventIdTransferMap_.clear();
48 InitCallBaseEvent();
49 CallIncomingFilterManagerPtr_ = (std::make_unique<CallIncomingFilterManager>()).release();
50 return TELEPHONY_SUCCESS;
51 }
52
InitCallBaseEvent()53 void CallStatusManager::InitCallBaseEvent()
54 {
55 mEventIdTransferMap_[RequestResultEventId::RESULT_DIAL_NO_CARRIER] = CallAbilityEventId::EVENT_DIAL_NO_CARRIER;
56 mOttEventIdTransferMap_[OttCallEventId::OTT_CALL_EVENT_FUNCTION_UNSUPPORTED] =
57 CallAbilityEventId::EVENT_OTT_FUNCTION_UNSUPPORTED;
58 }
59
UnInit()60 int32_t CallStatusManager::UnInit()
61 {
62 callDetailsInfo_.callVec.clear();
63 mEventIdTransferMap_.clear();
64 mOttEventIdTransferMap_.clear();
65 return TELEPHONY_SUCCESS;
66 }
67
HandleCallReportInfo(const CallDetailInfo & info)68 int32_t CallStatusManager::HandleCallReportInfo(const CallDetailInfo &info)
69 {
70 int32_t ret = TELEPHONY_ERR_FAIL;
71 callReportInfo_ = info;
72 switch (info.state) {
73 case TelCallState::CALL_STATUS_ACTIVE:
74 ret = ActiveHandle(info);
75 break;
76 case TelCallState::CALL_STATUS_HOLDING:
77 ret = HoldingHandle(info);
78 break;
79 case TelCallState::CALL_STATUS_DIALING:
80 ret = DialingHandle(info);
81 break;
82 case TelCallState::CALL_STATUS_ALERTING:
83 ret = AlertHandle(info);
84 break;
85 case TelCallState::CALL_STATUS_INCOMING:
86 ret = IncomingHandle(info);
87 break;
88 case TelCallState::CALL_STATUS_WAITING:
89 ret = WaitingHandle(info);
90 break;
91 case TelCallState::CALL_STATUS_DISCONNECTED:
92 ret = DisconnectedHandle(info);
93 break;
94 case TelCallState::CALL_STATUS_DISCONNECTING:
95 ret = DisconnectingHandle(info);
96 break;
97 default:
98 TELEPHONY_LOGE("Invalid call state!");
99 break;
100 }
101 return ret;
102 }
103
104 // handle call state changes, incoming call, outgoing call.
HandleCallsReportInfo(const CallDetailsInfo & info)105 int32_t CallStatusManager::HandleCallsReportInfo(const CallDetailsInfo &info)
106 {
107 bool flag = false;
108 TELEPHONY_LOGI("call list size:%{public}zu,slotId:%{public}d", info.callVec.size(), info.slotId);
109 for (auto &it : info.callVec) {
110 for (auto &it1 : callDetailsInfo_.callVec) {
111 if (strcmp(it.phoneNum, it1.phoneNum) == 0) {
112 // call state changes
113 if (it.state != it1.state) {
114 TELEPHONY_LOGI("handle updated call state:%{public}d", it.state);
115 HandleCallReportInfo(it);
116 }
117 flag = true;
118 break;
119 }
120 }
121 // incoming/outgoing call handle
122 if (!flag || callDetailsInfo_.callVec.empty()) {
123 TELEPHONY_LOGI("handle new call state:%{public}d", it.state);
124 HandleCallReportInfo(it);
125 }
126 flag = false;
127 }
128 // disconnected calls handle
129 for (auto &it2 : callDetailsInfo_.callVec) {
130 for (auto &it3 : info.callVec) {
131 if (strcmp(it2.phoneNum, it3.phoneNum) == 0) {
132 TELEPHONY_LOGI("state:%{public}d", it2.state);
133 flag = true;
134 break;
135 }
136 }
137 if (!flag) {
138 it2.state = TelCallState::CALL_STATUS_DISCONNECTED;
139 HandleCallReportInfo(it2);
140 }
141 flag = false;
142 }
143 callDetailsInfo_.callVec.clear();
144 callDetailsInfo_ = info;
145 return TELEPHONY_SUCCESS;
146 }
147
HandleDisconnectedCause(int32_t cause)148 int32_t CallStatusManager::HandleDisconnectedCause(int32_t cause)
149 {
150 bool ret = DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallDestroyed(cause);
151 if (!ret) {
152 TELEPHONY_LOGI("NotifyCallDestroyed failed!");
153 return CALL_ERR_PHONE_CALLSTATE_NOTIFY_FAILED;
154 }
155 return TELEPHONY_SUCCESS;
156 }
157
HandleEventResultReportInfo(const CellularCallEventInfo & info)158 int32_t CallStatusManager::HandleEventResultReportInfo(const CellularCallEventInfo &info)
159 {
160 if (info.eventType != CellularCallEventType::EVENT_REQUEST_RESULT_TYPE) {
161 TELEPHONY_LOGE("unexpected type event occurs, eventId:%{public}d", info.eventId);
162 return CALL_ERR_PHONE_TYPE_UNEXPECTED;
163 }
164 TELEPHONY_LOGI("recv one Event, eventId:%{public}d", info.eventId);
165 CallEventInfo eventInfo;
166 (void)memset_s(&eventInfo, sizeof(CallEventInfo), 0, sizeof(CallEventInfo));
167 if (mEventIdTransferMap_.find(info.eventId) != mEventIdTransferMap_.end()) {
168 eventInfo.eventId = mEventIdTransferMap_[info.eventId];
169 DialParaInfo dialInfo;
170 if (eventInfo.eventId == CallAbilityEventId::EVENT_DIAL_NO_CARRIER) {
171 DelayedSingleton<CallControlManager>::GetInstance()->GetDialParaInfo(dialInfo);
172 if (memcpy_s(eventInfo.phoneNum, kMaxNumberLen, dialInfo.number.c_str(), dialInfo.number.length()) !=
173 EOK) {
174 TELEPHONY_LOGE("memcpy_s failed!");
175 return TELEPHONY_ERR_MEMCPY_FAIL;
176 }
177 }
178 DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallEventUpdated(eventInfo);
179 } else {
180 TELEPHONY_LOGW("unkown type Event, eventid %{public}d", info.eventId);
181 }
182 return TELEPHONY_SUCCESS;
183 }
184
HandleOttEventReportInfo(const OttCallEventInfo & info)185 int32_t CallStatusManager::HandleOttEventReportInfo(const OttCallEventInfo &info)
186 {
187 TELEPHONY_LOGI("recv one Event, eventId:%{public}d", info.ottCallEventId);
188 CallEventInfo eventInfo;
189 (void)memset_s(&eventInfo, sizeof(CallEventInfo), 0, sizeof(CallEventInfo));
190 if (mOttEventIdTransferMap_.find(info.ottCallEventId) != mOttEventIdTransferMap_.end()) {
191 eventInfo.eventId = mOttEventIdTransferMap_[info.ottCallEventId];
192 if (memcpy_s(eventInfo.bundleName, kMaxNumberLen, info.bundleName, strlen(info.bundleName)) != EOK) {
193 TELEPHONY_LOGE("memcpy_s failed!");
194 return TELEPHONY_ERR_MEMCPY_FAIL;
195 }
196 DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallEventUpdated(eventInfo);
197 } else {
198 TELEPHONY_LOGW("unkown type Event, eventid %{public}d", info.ottCallEventId);
199 }
200 return TELEPHONY_SUCCESS;
201 }
202
IncomingHandle(const CallDetailInfo & info)203 int32_t CallStatusManager::IncomingHandle(const CallDetailInfo &info)
204 {
205 int32_t ret = IncomingHandlePolicy(info);
206 if (ret != TELEPHONY_SUCCESS) {
207 TELEPHONY_LOGE("IncomingHandlePolicy failed!");
208 return ret;
209 }
210 if (info.callType == CallType::TYPE_CS || info.callType == CallType::TYPE_IMS) {
211 ret = IncomingFilterPolicy(info);
212 if (ret != TELEPHONY_SUCCESS) {
213 TELEPHONY_LOGE("IncomingFilterPolicy failed!");
214 return ret;
215 }
216 }
217 sptr<CallBase> call = CreateNewCall(info, CallDirection::CALL_DIRECTION_IN);
218 if (call == nullptr) {
219 TELEPHONY_LOGE("CreateNewCall failed!");
220 return CALL_ERR_CALL_OBJECT_IS_NULL;
221 }
222 #ifdef ABILITY_DATABASE_SUPPORT
223 // allow list filtering
224 // Get the contact data from the database
225 GetCallerInfoDate(ContactInfo);
226 SetCallerInfo(contactInfo);
227 #endif
228 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
229 ret = UpdateCallState(call, info.state);
230 if (ret != TELEPHONY_SUCCESS) {
231 TELEPHONY_LOGE("UpdateCallState failed!");
232 return ret;
233 }
234 ret = FilterResultsDispose(call);
235 if (ret != TELEPHONY_SUCCESS) {
236 TELEPHONY_LOGE("FilterResultsDispose failed!");
237 }
238 return ret;
239 }
240
IncomingFilterPolicy(const CallDetailInfo & info)241 int32_t CallStatusManager::IncomingFilterPolicy(const CallDetailInfo &info)
242 {
243 if (CallIncomingFilterManagerPtr_ == nullptr) {
244 TELEPHONY_LOGE("CallIncomingFilterManagerPtr_ is null");
245 return TELEPHONY_ERR_LOCAL_PTR_NULL;
246 }
247 if (CallIncomingFilterManagerPtr_->IsFirstIncoming()) {
248 CallIncomingFilterManagerPtr_->UpdateIncomingFilterData();
249 }
250 return CallIncomingFilterManagerPtr_->doIncomingFilter(info);
251 }
252
CallFilterCompleteResult(const CallDetailInfo & info)253 void CallStatusManager::CallFilterCompleteResult(const CallDetailInfo &info)
254 {
255 int32_t ret = TELEPHONY_ERR_FAIL;
256 sptr<CallBase> call = CreateNewCall(info, CallDirection::CALL_DIRECTION_IN);
257 if (call == nullptr) {
258 TELEPHONY_LOGE("CreateNewCall failed!");
259 return;
260 }
261 #ifdef ABILITY_DATABASE_SUPPORT
262 // allow list filtering
263 // Get the contact data from the database
264 GetCallerInfoDate(ContactInfo);
265 SetCallerInfo(contactInfo);
266 #endif
267 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
268 ret = UpdateCallState(call, info.state);
269 if (ret != TELEPHONY_SUCCESS) {
270 TELEPHONY_LOGE("UpdateCallState failed!");
271 return;
272 }
273 ret = FilterResultsDispose(call);
274 if (ret != TELEPHONY_SUCCESS) {
275 TELEPHONY_LOGE("FilterResultsDispose failed!");
276 return;
277 }
278 }
279
DialingHandle(const CallDetailInfo & info)280 int32_t CallStatusManager::DialingHandle(const CallDetailInfo &info)
281 {
282 TELEPHONY_LOGI("handle dialing state");
283 int32_t ret = DialingHandlePolicy(info);
284 if (ret != TELEPHONY_SUCCESS) {
285 TELEPHONY_LOGE("DialingHandlePolicy failed!");
286 return ret;
287 }
288 sptr<CallBase> call = CreateNewCall(info, CallDirection::CALL_DIRECTION_OUT);
289 if (call == nullptr) {
290 TELEPHONY_LOGE("CreateNewCall failed!");
291 return TELEPHONY_ERR_LOCAL_PTR_NULL;
292 }
293 ret = call->DialingProcess();
294 if (ret != TELEPHONY_SUCCESS) {
295 return ret;
296 }
297 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
298 ret = UpdateCallState(call, TelCallState::CALL_STATUS_DIALING);
299 if (ret != TELEPHONY_SUCCESS) {
300 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
301 }
302 return ret;
303 }
304
ActiveHandle(const CallDetailInfo & info)305 int32_t CallStatusManager::ActiveHandle(const CallDetailInfo &info)
306 {
307 TELEPHONY_LOGI("handle active state");
308 std::string tmpStr(info.phoneNum);
309 sptr<CallBase> call = GetOneCallObject(tmpStr);
310 if (call == nullptr) {
311 TELEPHONY_LOGE("Call is NULL");
312 return TELEPHONY_ERR_LOCAL_PTR_NULL;
313 }
314 // call state change active, need to judge if launching a conference
315 int32_t ret = call->LaunchConference();
316 if (ret == TELEPHONY_SUCCESS) {
317 int32_t mainCallId = call->GetMainCallId();
318 sptr<CallBase> mainCall = GetOneCallObject(mainCallId);
319 if (mainCall != nullptr) {
320 mainCall->SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_ACTIVE);
321 }
322 }
323 ret = UpdateCallState(call, TelCallState::CALL_STATUS_ACTIVE);
324 if (ret != TELEPHONY_SUCCESS) {
325 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
326 return ret;
327 }
328 #ifdef AUDIO_SUPPORT
329 ToSpeakerPhone(call);
330 DelayedSingleton<AudioControlManager>::GetInstance()->SetVolumeAudible();
331 #endif
332 TELEPHONY_LOGI("handle active state success");
333 return ret;
334 }
335
HoldingHandle(const CallDetailInfo & info)336 int32_t CallStatusManager::HoldingHandle(const CallDetailInfo &info)
337 {
338 TELEPHONY_LOGI("handle holding state");
339 std::string tmpStr(info.phoneNum);
340 sptr<CallBase> call = GetOneCallObject(tmpStr);
341 if (call == nullptr) {
342 TELEPHONY_LOGE("Call is NULL");
343 return TELEPHONY_ERR_LOCAL_PTR_NULL;
344 }
345 // if the call is in a conference, it will exit, otherwise just set it holding
346 int32_t ret = call->HoldConference();
347 if (ret == TELEPHONY_SUCCESS) {
348 TELEPHONY_LOGI("HoldConference success");
349 }
350 ret = UpdateCallState(call, TelCallState::CALL_STATUS_HOLDING);
351 if (ret != TELEPHONY_SUCCESS) {
352 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
353 }
354 return ret;
355 }
356
WaitingHandle(const CallDetailInfo & info)357 int32_t CallStatusManager::WaitingHandle(const CallDetailInfo &info)
358 {
359 return IncomingHandle(info);
360 }
361
AlertHandle(const CallDetailInfo & info)362 int32_t CallStatusManager::AlertHandle(const CallDetailInfo &info)
363 {
364 TELEPHONY_LOGI("handle alerting state");
365 std::string tmpStr(info.phoneNum);
366 sptr<CallBase> call = GetOneCallObject(tmpStr);
367 if (call == nullptr) {
368 TELEPHONY_LOGE("Call is NULL");
369 return TELEPHONY_ERR_LOCAL_PTR_NULL;
370 }
371 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_ALERTING);
372 if (ret != TELEPHONY_SUCCESS) {
373 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
374 return ret;
375 }
376 #ifdef AUDIO_SUPPORT
377 ToSpeakerPhone(call);
378 TurnOffMute(call);
379 DelayedSingleton<AudioControlManager>::GetInstance()->SetVolumeAudible();
380 #endif
381 return ret;
382 }
383
DisconnectingHandle(const CallDetailInfo & info)384 int32_t CallStatusManager::DisconnectingHandle(const CallDetailInfo &info)
385 {
386 TELEPHONY_LOGI("handle disconnecting state");
387 std::string tmpStr(info.phoneNum);
388 sptr<CallBase> call = GetOneCallObject(tmpStr);
389 if (call == nullptr) {
390 TELEPHONY_LOGE("Call is NULL");
391 return TELEPHONY_ERR_LOCAL_PTR_NULL;
392 }
393 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_DISCONNECTING);
394 if (ret != TELEPHONY_SUCCESS) {
395 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
396 }
397 return ret;
398 }
399
DisconnectedHandle(const CallDetailInfo & info)400 int32_t CallStatusManager::DisconnectedHandle(const CallDetailInfo &info)
401 {
402 TELEPHONY_LOGI("handle disconnected state");
403 std::string tmpStr(info.phoneNum);
404 sptr<CallBase> call = GetOneCallObject(tmpStr);
405 if (call == nullptr) {
406 TELEPHONY_LOGE("Call is NULL");
407 return TELEPHONY_ERR_LOCAL_PTR_NULL;
408 }
409 int32_t ret = call->ExitConference();
410 if (ret == TELEPHONY_SUCCESS) {
411 TELEPHONY_LOGI("SubCallSeparateFromConference success");
412 }
413 ret = UpdateCallState(call, TelCallState::CALL_STATUS_DISCONNECTED);
414 if (ret != TELEPHONY_SUCCESS) {
415 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
416 return ret;
417 }
418 DeleteOneCallObject(call->GetCallID());
419 return ret;
420 }
421
UpdateCallState(sptr<CallBase> & call,TelCallState nextState)422 int32_t CallStatusManager::UpdateCallState(sptr<CallBase> &call, TelCallState nextState)
423 {
424 TELEPHONY_LOGI("UpdateCallState start");
425 if (call == nullptr) {
426 TELEPHONY_LOGE("Call is NULL");
427 return TELEPHONY_ERR_LOCAL_PTR_NULL;
428 }
429 TelCallState priorState = call->GetTelCallState();
430 TELEPHONY_LOGI("priorState:%{public}d, nextState:%{public}d", priorState, nextState);
431 // need DTMF judge
432 int32_t ret = call->SetTelCallState(nextState);
433 if (ret != TELEPHONY_SUCCESS && ret != CALL_ERR_NOT_NEW_STATE) {
434 TELEPHONY_LOGE("SetTelCallState failed");
435 return TELEPHONY_ERR_LOCAL_PTR_NULL;
436 }
437 // notify state changed
438 if (!DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallStateUpdated(call, priorState, nextState)) {
439 TELEPHONY_LOGE(
440 "NotifyCallStateUpdated failed! priorState:%{public}d,nextState:%{public}d", priorState, nextState);
441 return CALL_ERR_PHONE_CALLSTATE_NOTIFY_FAILED;
442 }
443 return TELEPHONY_SUCCESS;
444 }
445
ToSpeakerPhone(sptr<CallBase> & call)446 int32_t CallStatusManager::ToSpeakerPhone(sptr<CallBase> &call)
447 {
448 int32_t ret = TELEPHONY_ERR_FAIL;
449 if (call == nullptr) {
450 TELEPHONY_LOGE("Call is NULL");
451 return TELEPHONY_ERR_LOCAL_PTR_NULL;
452 }
453 if (call->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_DIALING) {
454 TELEPHONY_LOGI("Call is CALL_STATUS_DIALING");
455 return ret;
456 }
457 if (call->IsSpeakerphoneOn()) {
458 DelayedSingleton<AudioControlManager>::GetInstance()->SetAudioDevice(AudioDevice::DEVICE_SPEAKER);
459 ret = call->SetSpeakerphoneOn(false);
460 }
461 return ret;
462 }
463
TurnOffMute(sptr<CallBase> & call)464 int32_t CallStatusManager::TurnOffMute(sptr<CallBase> &call)
465 {
466 if (call->GetEmergencyState() || HasEmergencyCall()) {
467 DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(false);
468 } else {
469 DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(true);
470 }
471 return TELEPHONY_SUCCESS;
472 }
473
CreateNewCall(const CallDetailInfo & info,CallDirection dir)474 sptr<CallBase> CallStatusManager::CreateNewCall(const CallDetailInfo &info, CallDirection dir)
475 {
476 sptr<CallBase> callPtr = nullptr;
477 DialParaInfo paraInfo;
478 AppExecFwk::PacMap extras;
479 extras.Clear();
480 PackParaInfo(paraInfo, info, dir, extras);
481 switch (info.callType) {
482 case CallType::TYPE_CS: {
483 if (dir == CallDirection::CALL_DIRECTION_OUT) {
484 callPtr = (std::make_unique<CSCall>(paraInfo, extras)).release();
485 } else {
486 callPtr = (std::make_unique<CSCall>(paraInfo)).release();
487 }
488 break;
489 }
490 case CallType::TYPE_IMS: {
491 if (dir == CallDirection::CALL_DIRECTION_OUT) {
492 callPtr = (std::make_unique<IMSCall>(paraInfo, extras)).release();
493 } else {
494 callPtr = (std::make_unique<IMSCall>(paraInfo)).release();
495 }
496 break;
497 }
498 case CallType::TYPE_OTT: {
499 if (dir == CallDirection::CALL_DIRECTION_OUT) {
500 callPtr = (std::make_unique<OTTCall>(paraInfo, extras)).release();
501 } else {
502 callPtr = (std::make_unique<OTTCall>(paraInfo)).release();
503 }
504 break;
505 }
506 default:
507 return nullptr;
508 }
509 if (callPtr == nullptr) {
510 TELEPHONY_LOGE("CreateNewCall failed!");
511 return nullptr;
512 }
513 AddOneCallObject(callPtr);
514 return callPtr;
515 }
516
PackParaInfo(DialParaInfo & paraInfo,const CallDetailInfo & info,CallDirection dir,AppExecFwk::PacMap & extras)517 void CallStatusManager::PackParaInfo(
518 DialParaInfo ¶Info, const CallDetailInfo &info, CallDirection dir, AppExecFwk::PacMap &extras)
519 {
520 paraInfo.isEcc = false;
521 paraInfo.dialType = DialType::DIAL_CARRIER_TYPE;
522 if (dir == CallDirection::CALL_DIRECTION_OUT) {
523 DelayedSingleton<CallControlManager>::GetInstance()->GetDialParaInfo(paraInfo, extras);
524 }
525 paraInfo.number = info.phoneNum;
526 paraInfo.callId = GetNewCallId();
527 paraInfo.index = info.index;
528 paraInfo.videoState = VideoStateType::TYPE_VOICE;
529 paraInfo.accountId = info.accountId;
530 paraInfo.callType = info.callType;
531 paraInfo.callState = info.state;
532 paraInfo.bundleName = info.bundleName;
533 }
534 } // namespace Telephony
535 } // namespace OHOS
536