• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "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 &paraInfo, 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