• 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_base.h"
17 
18 #include <securec.h>
19 
20 #include "audio_control_manager.h"
21 #include "bluetooth_call_manager.h"
22 #include "call_manager_errors.h"
23 #include "cellular_call_connection.h"
24 #include "common_type.h"
25 #include "ffrt.h"
26 #include "telephony_log_wrapper.h"
27 #include "voip_call.h"
28 #include "voip_call_connection.h"
29 
30 namespace OHOS {
31 namespace Telephony {
CallBase(DialParaInfo & info)32 CallBase::CallBase(DialParaInfo &info)
33     : callId_(info.callId), callType_(info.callType), videoState_(info.videoState), accountNumber_(info.number),
34       bundleName_(info.bundleName), callRunningState_(CallRunningState::CALL_RUNNING_STATE_CREATE),
35       conferenceState_(TelConferenceState::TEL_CONFERENCE_IDLE), startTime_(0),
36       direction_(CallDirection::CALL_DIRECTION_IN), policyFlag_(0), callState_(info.callState), autoAnswerState_(false),
37       canUnHoldState_(true), canSwitchCallState_(true), answerVideoState_(0), isSpeakerphoneOn_(false),
38       callEndedType_(CallEndedType::UNKNOWN), callBeginTime_(0), callEndTime_(0), ringBeginTime_(0), ringEndTime_(0),
39       answerType_(CallAnswerType::CALL_ANSWER_MISSED), accountId_(info.accountId), crsType_(info.crsType),
40       originalCallType_(info.originalCallType), isMuted_(false)
41 {
42     (void)memset_s(&contactInfo_, sizeof(ContactInfo), 0, sizeof(ContactInfo));
43 }
44 
CallBase(DialParaInfo & info,AppExecFwk::PacMap & extras)45 CallBase::CallBase(DialParaInfo &info, AppExecFwk::PacMap &extras)
46     : callId_(info.callId), callType_(info.callType), videoState_(info.videoState), accountNumber_(info.number),
47       bundleName_(info.bundleName), callRunningState_(CallRunningState::CALL_RUNNING_STATE_CREATE),
48       conferenceState_(TelConferenceState::TEL_CONFERENCE_IDLE), startTime_(0),
49       direction_(CallDirection::CALL_DIRECTION_OUT), policyFlag_(0), callState_(info.callState),
50       autoAnswerState_(false), canUnHoldState_(true), canSwitchCallState_(true), answerVideoState_(0),
51       isSpeakerphoneOn_(false), callEndedType_(CallEndedType::UNKNOWN), callBeginTime_(0), callEndTime_(0),
52       ringBeginTime_(0), ringEndTime_(0), answerType_(CallAnswerType::CALL_ANSWER_MISSED), accountId_(info.accountId),
53       crsType_(info.crsType), originalCallType_(info.originalCallType), isMuted_(false)
54 {
55     (void)memset_s(&contactInfo_, sizeof(ContactInfo), 0, sizeof(ContactInfo));
56 }
57 
~CallBase()58 CallBase::~CallBase() {}
59 
DialCallBase()60 int32_t CallBase::DialCallBase()
61 {
62     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_CONNECTING;
63     TELEPHONY_LOGI("start to set audio");
64     // Set audio, set hands-free
65     ffrt::submit([=]() { HangUpVoipCall(); });
66     return TELEPHONY_SUCCESS;
67 }
68 
HangUpVoipCall()69 void CallBase::HangUpVoipCall()
70 {
71     std::vector<CallAttributeInfo> callAttributeInfo = CallObjectManager::GetAllCallInfoList();
72     std::vector<CallAttributeInfo>::iterator it = callAttributeInfo.begin();
73     while (it != callAttributeInfo.end()) {
74         CallAttributeInfo callinfo = (*it);
75         TelCallState callState = callinfo.callState;
76         it++;
77         if (callinfo.callType == CallType::TYPE_VOIP &&
78             (callState == TelCallState::CALL_STATUS_ACTIVE || callState == TelCallState::CALL_STATUS_INCOMING)) {
79             sptr<CallBase> tempCall = CallObjectManager::GetOneCallObject(callinfo.callId);
80             sptr<VoIPCall> call = static_cast<VoIPCall *>(static_cast<void *>(tempCall.GetRefPtr()));
81             if (call == nullptr) {
82                 TELEPHONY_LOGE("the call object is nullptr, callId:%{public}d", callinfo.callId);
83                 break;
84             }
85             call->HangUpCall(ErrorReason::CELLULAR_CALL_EXISTS);
86         }
87     }
88 }
89 
IncomingCallBase()90 int32_t CallBase::IncomingCallBase()
91 {
92     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_RINGING;
93     return TELEPHONY_SUCCESS;
94 }
95 
AnswerCallBase()96 int32_t CallBase::AnswerCallBase()
97 {
98     if (!IsCurrentRinging()) {
99         TELEPHONY_LOGW("the device is currently not ringing");
100         return CALL_ERR_PHONE_ANSWER_IS_BUSY;
101     }
102     return TELEPHONY_SUCCESS;
103 }
104 
RejectCallBase()105 int32_t CallBase::RejectCallBase()
106 {
107     answerType_ = CallAnswerType::CALL_ANSWER_REJECT;
108     return TELEPHONY_SUCCESS;
109 }
110 
GetCallAttributeBaseInfo(CallAttributeInfo & info)111 void CallBase::GetCallAttributeBaseInfo(CallAttributeInfo &info)
112 {
113     std::lock_guard<std::mutex> lock(mutex_);
114     (void)memset_s(info.accountNumber, kMaxNumberLen, 0, kMaxNumberLen);
115     if (accountNumber_.length() > static_cast<size_t>(kMaxNumberLen)) {
116         TELEPHONY_LOGE("Number out of limit!");
117         return;
118     }
119     if (memcpy_s(info.accountNumber, kMaxNumberLen, accountNumber_.c_str(), accountNumber_.length()) == 0) {
120         info.speakerphoneOn = isSpeakerphoneOn_;
121         info.videoState = videoState_;
122         info.startTime = startTime_;
123         info.callType = callType_;
124         info.callId = callId_;
125         info.callState = callState_;
126         info.conferenceState = conferenceState_;
127         info.callBeginTime = callBeginTime_;
128         info.callEndTime = callEndTime_;
129         info.ringBeginTime = ringBeginTime_;
130         info.ringEndTime = ringEndTime_;
131         info.callDirection = direction_;
132         info.answerType = answerType_;
133         info.accountId = accountId_;
134         info.crsType = crsType_;
135         info.originalCallType = originalCallType_;
136         if (bundleName_.length() > static_cast<size_t>(kMaxBundleNameLen)) {
137             TELEPHONY_LOGE("Number out of limit!");
138             return;
139         }
140         errno_t result = memcpy_s(info.bundleName, kMaxBundleNameLen, bundleName_.c_str(), bundleName_.length());
141         if (result != EOK) {
142             TELEPHONY_LOGE("memcpy_s failed!");
143         }
144     }
145 }
146 
GetCallID()147 int32_t CallBase::GetCallID()
148 {
149     std::lock_guard<std::mutex> lock(mutex_);
150     return callId_;
151 }
152 
GetCallType()153 CallType CallBase::GetCallType()
154 {
155     return callType_;
156 }
157 
GetCallRunningState()158 CallRunningState CallBase::GetCallRunningState()
159 {
160     std::lock_guard<std::mutex> lock(mutex_);
161     return callRunningState_;
162 }
163 
164 // transfer from external call state to callmanager local state
SetTelCallState(TelCallState nextState)165 int32_t CallBase::SetTelCallState(TelCallState nextState)
166 {
167     std::lock_guard<std::mutex> lock(mutex_);
168     if (callRunningState_ != CallRunningState::CALL_RUNNING_STATE_CREATE && callState_ == nextState &&
169         nextState != TelCallState::CALL_STATUS_DIALING) {
170         TELEPHONY_LOGI("Call state duplication %{public}d", nextState);
171         return CALL_ERR_NOT_NEW_STATE;
172     }
173     callState_ = nextState;
174     switch (nextState) {
175         case TelCallState::CALL_STATUS_DIALING:
176             StateChangesToDialing();
177             break;
178         case TelCallState::CALL_STATUS_INCOMING:
179             StateChangesToIncoming();
180             break;
181         case TelCallState::CALL_STATUS_WAITING:
182             StateChangesToWaiting();
183             break;
184         case TelCallState::CALL_STATUS_ACTIVE:
185             StateChangesToActive();
186             break;
187         case TelCallState::CALL_STATUS_HOLDING:
188             StateChangesToHolding();
189             break;
190         case TelCallState::CALL_STATUS_DISCONNECTED:
191             StateChangesToDisconnected();
192             break;
193         case TelCallState::CALL_STATUS_DISCONNECTING:
194             StateChangesToDisconnecting();
195             break;
196         case TelCallState::CALL_STATUS_ALERTING:
197             StateChangesToAlerting();
198             break;
199         default:
200             break;
201     }
202     return TELEPHONY_SUCCESS;
203 }
204 
StateChangesToDialing()205 void CallBase::StateChangesToDialing()
206 {
207     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_DIALING;
208 }
209 
StateChangesToIncoming()210 void CallBase::StateChangesToIncoming()
211 {
212     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_RINGING;
213     ringBeginTime_ = time(nullptr);
214 }
215 
StateChangesToWaiting()216 void CallBase::StateChangesToWaiting()
217 {
218     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_RINGING;
219     ringBeginTime_ = time(nullptr);
220 }
221 
StateChangesToActive()222 void CallBase::StateChangesToActive()
223 {
224     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_ACTIVE;
225     if (callBeginTime_ == 0) {
226         callBeginTime_ = ringEndTime_ = time(nullptr);
227         startTime_ = callBeginTime_;
228         answerType_ = CallAnswerType::CALL_ANSWER_ACTIVED;
229     }
230 }
231 
StateChangesToHolding()232 void CallBase::StateChangesToHolding()
233 {
234     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_HOLD;
235     if (conferenceState_ == TelConferenceState::TEL_CONFERENCE_ACTIVE) {
236         conferenceState_ = TelConferenceState::TEL_CONFERENCE_DISCONNECTED;
237     }
238 }
239 
StateChangesToDisconnected()240 void CallBase::StateChangesToDisconnected()
241 {
242     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_ENDED;
243     if (conferenceState_ == TelConferenceState::TEL_CONFERENCE_DISCONNECTING ||
244         conferenceState_ == TelConferenceState::TEL_CONFERENCE_ACTIVE) {
245         conferenceState_ = TelConferenceState::TEL_CONFERENCE_DISCONNECTED;
246     }
247     callEndTime_ = time(nullptr);
248     if (ringEndTime_ == 0) {
249         ringEndTime_ = time(nullptr);
250     }
251 }
252 
StateChangesToDisconnecting()253 void CallBase::StateChangesToDisconnecting()
254 {
255     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_ENDING;
256     if (conferenceState_ == TelConferenceState::TEL_CONFERENCE_ACTIVE) {
257         conferenceState_ = TelConferenceState::TEL_CONFERENCE_DISCONNECTING;
258     }
259     if (ringEndTime_ == 0) {
260         ringEndTime_ = time(nullptr);
261     }
262 }
263 
StateChangesToAlerting()264 void CallBase::StateChangesToAlerting()
265 {
266     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_DIALING;
267     ringBeginTime_ = time(nullptr);
268 }
269 
GetTelCallState()270 TelCallState CallBase::GetTelCallState()
271 {
272     std::lock_guard<std::mutex> lock(mutex_);
273     return callState_;
274 }
275 
SetAutoAnswerState(bool flag)276 void CallBase::SetAutoAnswerState(bool flag)
277 {
278     std::lock_guard<std::mutex> lock(mutex_);
279     autoAnswerState_ = flag;
280     TELEPHONY_LOGI("NeedAutoAnswer:%{public}d", autoAnswerState_);
281 }
282 
GetAutoAnswerState()283 bool CallBase::GetAutoAnswerState()
284 {
285     std::lock_guard<std::mutex> lock(mutex_);
286     return autoAnswerState_;
287 }
288 
SetAnswerVideoState(int32_t videoState)289 void CallBase::SetAnswerVideoState(int32_t videoState)
290 {
291     std::lock_guard<std::mutex> lock(mutex_);
292     answerVideoState_ = videoState;
293     TELEPHONY_LOGI("set answer video state :%{public}d", answerVideoState_);
294 }
295 
GetAnswerVideoState()296 int32_t CallBase::GetAnswerVideoState()
297 {
298     std::lock_guard<std::mutex> lock(mutex_);
299     return answerVideoState_;
300 }
301 
SetCanUnHoldState(bool flag)302 void CallBase::SetCanUnHoldState(bool flag)
303 {
304     std::lock_guard<std::mutex> lock(mutex_);
305     canUnHoldState_ = flag;
306     TELEPHONY_LOGI("CanUnHoldState:%{public}d", canUnHoldState_);
307 }
308 
GetCanUnHoldState()309 bool CallBase::GetCanUnHoldState()
310 {
311     std::lock_guard<std::mutex> lock(mutex_);
312     TELEPHONY_LOGI("CanUnHoldState:%{public}d", canUnHoldState_);
313     return canUnHoldState_;
314 }
315 
SetCanSwitchCallState(bool flag)316 void CallBase::SetCanSwitchCallState(bool flag)
317 {
318     std::lock_guard<std::mutex> lock(mutex_);
319     canSwitchCallState_ = flag;
320     TELEPHONY_LOGI("CanSwitchCallState:%{public}d", canSwitchCallState_);
321 }
322 
GetCanSwitchCallState()323 bool CallBase::GetCanSwitchCallState()
324 {
325     std::lock_guard<std::mutex> lock(mutex_);
326     TELEPHONY_LOGI("CanSwitchCallState:%{public}d", canSwitchCallState_);
327     return canSwitchCallState_;
328 }
329 
SetTelConferenceState(TelConferenceState state)330 void CallBase::SetTelConferenceState(TelConferenceState state)
331 {
332     std::lock_guard<std::mutex> lock(mutex_);
333     conferenceState_ = state;
334     TELEPHONY_LOGI("SetTelConferenceState, callId:%{public}d, state:%{public}d", callId_, state);
335 }
336 
GetTelConferenceState()337 TelConferenceState CallBase::GetTelConferenceState()
338 {
339     std::lock_guard<std::mutex> lock(mutex_);
340     return conferenceState_;
341 }
342 
GetVideoStateType()343 VideoStateType CallBase::GetVideoStateType()
344 {
345     std::lock_guard<std::mutex> lock(mutex_);
346     return videoState_;
347 }
348 
SetVideoStateType(VideoStateType mediaType)349 void CallBase::SetVideoStateType(VideoStateType mediaType)
350 {
351     std::lock_guard<std::mutex> lock(mutex_);
352     videoState_ = mediaType;
353 }
354 
GetCrsType()355 int32_t CallBase::GetCrsType()
356 {
357     std::lock_guard<std::mutex> lock(mutex_);
358     return crsType_;
359 }
360 
SetCrsType(int32_t crsType)361 void CallBase::SetCrsType(int32_t crsType)
362 {
363     std::lock_guard<std::mutex> lock(mutex_);
364     crsType_ = crsType;
365 }
366 
GetOriginalCallType()367 int32_t CallBase::GetOriginalCallType()
368 {
369     std::lock_guard<std::mutex> lock(mutex_);
370     return originalCallType_;
371 }
372 
SetOriginalCallType(int32_t originalCallType)373 void CallBase::SetOriginalCallType(int32_t originalCallType)
374 {
375     std::lock_guard<std::mutex> lock(mutex_);
376     originalCallType_ = originalCallType;
377 }
378 
SetPolicyFlag(PolicyFlag flag)379 void CallBase::SetPolicyFlag(PolicyFlag flag)
380 {
381     std::lock_guard<std::mutex> lock(mutex_);
382     policyFlag_ |= flag;
383 }
384 
GetPolicyFlag()385 uint64_t CallBase::GetPolicyFlag()
386 {
387     std::lock_guard<std::mutex> lock(mutex_);
388     return policyFlag_;
389 }
390 
GetCallerInfo()391 ContactInfo CallBase::GetCallerInfo()
392 {
393     std::lock_guard<std::mutex> lock(mutex_);
394     return contactInfo_;
395 }
396 
SetCallerInfo(const ContactInfo & info)397 void CallBase::SetCallerInfo(const ContactInfo &info)
398 {
399     std::lock_guard<std::mutex> lock(mutex_);
400     contactInfo_ = info;
401 }
402 
SetCallRunningState(CallRunningState callRunningState)403 void CallBase::SetCallRunningState(CallRunningState callRunningState)
404 {
405     std::lock_guard<std::mutex> lock(mutex_);
406     callRunningState_ = callRunningState;
407 }
408 
SetStartTime(int64_t startTime)409 void CallBase::SetStartTime(int64_t startTime)
410 {
411     std::lock_guard<std::mutex> lock(mutex_);
412     startTime_ = startTime;
413 }
414 
SetCallBeginTime(time_t callBeginTime)415 void CallBase::SetCallBeginTime(time_t callBeginTime)
416 {
417     std::lock_guard<std::mutex> lock(mutex_);
418     callBeginTime_ = callBeginTime;
419 }
420 
SetCallEndTime(time_t callEndTime)421 void CallBase::SetCallEndTime(time_t callEndTime)
422 {
423     std::lock_guard<std::mutex> lock(mutex_);
424     callEndTime_ = callEndTime;
425 }
426 
SetRingBeginTime(time_t ringBeginTime)427 void CallBase::SetRingBeginTime(time_t ringBeginTime)
428 {
429     std::lock_guard<std::mutex> lock(mutex_);
430     ringBeginTime_ = ringBeginTime;
431 }
432 
SetRingEndTime(time_t ringEndTime)433 void CallBase::SetRingEndTime(time_t ringEndTime)
434 {
435     std::lock_guard<std::mutex> lock(mutex_);
436     ringEndTime_ = ringEndTime;
437 }
438 
SetAnswerType(CallAnswerType answerType)439 void CallBase::SetAnswerType(CallAnswerType answerType)
440 {
441     std::lock_guard<std::mutex> lock(mutex_);
442     answerType_ = answerType;
443 }
444 
GetCallEndedType()445 CallEndedType CallBase::GetCallEndedType()
446 {
447     std::lock_guard<std::mutex> lock(mutex_);
448     return callEndedType_;
449 }
450 
SetCallEndedType(CallEndedType callEndedType)451 int32_t CallBase::SetCallEndedType(CallEndedType callEndedType)
452 {
453     std::lock_guard<std::mutex> lock(mutex_);
454     callEndedType_ = callEndedType;
455     return TELEPHONY_SUCCESS;
456 }
457 
SetCallId(int32_t callId)458 void CallBase::SetCallId(int32_t callId)
459 {
460     std::lock_guard<std::mutex> lock(mutex_);
461     callId_ = callId;
462 }
463 
CheckVoicemailNumber(std::string phoneNumber)464 bool CallBase::CheckVoicemailNumber(std::string phoneNumber)
465 {
466     return false;
467 }
468 
IsSpeakerphoneEnabled()469 bool CallBase::IsSpeakerphoneEnabled()
470 {
471     std::shared_ptr<BluetoothCallManager> bluetoothCallManager = std::make_shared<BluetoothCallManager>();
472     // Gets whether the device can be started from the configuration
473     if (bluetoothCallManager->IsBtAvailble()) {
474         return false;
475     }
476     return true;
477 }
478 
IsCurrentRinging()479 bool CallBase::IsCurrentRinging()
480 {
481     return (callRunningState_ == CallRunningState::CALL_RUNNING_STATE_RINGING) ? true : false;
482 }
483 
GetAccountNumber()484 std::string CallBase::GetAccountNumber()
485 {
486     return accountNumber_;
487 }
488 
SetAccountNumber(const std::string accountNumber)489 void CallBase::SetAccountNumber(const std::string accountNumber)
490 {
491     accountNumber_ = accountNumber;
492 }
493 
SetSpeakerphoneOn(bool speakerphoneOn)494 int32_t CallBase::SetSpeakerphoneOn(bool speakerphoneOn)
495 {
496     isSpeakerphoneOn_ = speakerphoneOn;
497     return TELEPHONY_SUCCESS;
498 }
499 
IsSpeakerphoneOn()500 bool CallBase::IsSpeakerphoneOn()
501 {
502     return isSpeakerphoneOn_;
503 }
504 
IsAliveState()505 bool CallBase::IsAliveState()
506 {
507     return !(callState_ == TelCallState::CALL_STATUS_IDLE || callState_ == TelCallState::CALL_STATUS_DISCONNECTED ||
508         callState_ == TelCallState::CALL_STATUS_DISCONNECTING);
509 }
510 
SetBundleName(const char * bundleName)511 void CallBase::SetBundleName(const char *bundleName)
512 {
513     bundleName_ = bundleName;
514 }
515 
SetCallType(CallType callType)516 void CallBase::SetCallType(CallType callType)
517 {
518     callType_ = callType;
519 }
520 
SetMicPhoneState(bool isMuted)521 int32_t CallBase::SetMicPhoneState(bool isMuted)
522 {
523     isMuted_ = isMuted;
524     return TELEPHONY_SUCCESS;
525 }
526 
IsMuted()527 bool CallBase::IsMuted()
528 {
529     return isMuted_;
530 }
531 } // namespace Telephony
532 } // namespace OHOS
533