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 #include "call_manager_info.h"
30 #include "call_voice_assistant_manager.h"
31 
32 namespace OHOS {
33 namespace Telephony {
34 static const int MILLI_TO_BASE = 1000;
35 
CallBase(DialParaInfo &info)36 CallBase::CallBase(DialParaInfo &info)
37     : callId_(info.callId), callType_(info.callType), videoState_(info.videoState), accountNumber_(info.number),
38       bundleName_(info.bundleName), callRunningState_(CallRunningState::CALL_RUNNING_STATE_CREATE),
39       conferenceState_(TelConferenceState::TEL_CONFERENCE_IDLE), startTime_(0),
40       direction_(CallDirection::CALL_DIRECTION_IN), policyFlag_(0), callState_(info.callState), autoAnswerState_(false),
41       canUnHoldState_(true), canSwitchCallState_(true), answerVideoState_(0), isSpeakerphoneOn_(false),
42       callEndedType_(CallEndedType::UNKNOWN), callBeginTime_(0), callCreateTime_(0), callEndTime_(0), ringBeginTime_(0),
43       ringEndTime_(0), answerType_(CallAnswerType::CALL_ANSWER_MISSED), accountId_(info.accountId),
44       crsType_(info.crsType), originalCallType_(info.originalCallType), isMuted_(false), numberLocation_("default"),
45       blockReason_(0), isEccContact_(false), celiaCallType_(-1), extraParams_(info.extraParams), isAnswered_(false)
46 {
47     (void)memset_s(&contactInfo_, sizeof(ContactInfo), 0, sizeof(ContactInfo));
48     (void)memset_s(&numberMarkInfo_, sizeof(NumberMarkInfo), 0, sizeof(NumberMarkInfo));
49 }
50 
CallBase(DialParaInfo &info, AppExecFwk::PacMap &extras)51 CallBase::CallBase(DialParaInfo &info, AppExecFwk::PacMap &extras)
52     : callId_(info.callId), callType_(info.callType), videoState_(info.videoState), accountNumber_(info.number),
53       bundleName_(info.bundleName), callRunningState_(CallRunningState::CALL_RUNNING_STATE_CREATE),
54       conferenceState_(TelConferenceState::TEL_CONFERENCE_IDLE), startTime_(0),
55       direction_(CallDirection::CALL_DIRECTION_OUT), policyFlag_(0), callState_(info.callState),
56       autoAnswerState_(false), canUnHoldState_(true), canSwitchCallState_(true), answerVideoState_(0),
57       isSpeakerphoneOn_(false), callEndedType_(CallEndedType::UNKNOWN), callBeginTime_(0), callCreateTime_(0),
58       callEndTime_(0), ringBeginTime_(0), ringEndTime_(0), answerType_(CallAnswerType::CALL_ANSWER_MISSED),
59       accountId_(info.accountId), crsType_(info.crsType), originalCallType_(info.originalCallType), isMuted_(false),
60       numberLocation_("default"), blockReason_(0), isEccContact_(false), celiaCallType_(-1),
61       extraParams_(info.extraParams), isAnswered_(false)
62 {
63     (void)memset_s(&contactInfo_, sizeof(ContactInfo), 0, sizeof(ContactInfo));
64     (void)memset_s(&numberMarkInfo_, sizeof(NumberMarkInfo), 0, sizeof(NumberMarkInfo));
65 }
66 
~CallBase()67 CallBase::~CallBase() {}
68 
DialCallBase()69 int32_t CallBase::DialCallBase()
70 {
71     std::lock_guard<std::mutex> lock(mutex_);
72     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_CONNECTING;
73     TELEPHONY_LOGI("start to set audio");
74     // Set audio, set hands-free
75     ffrt::submit([=]() { HangUpVoipCall(); });
76     return TELEPHONY_SUCCESS;
77 }
78 
HangUpVoipCall()79 void CallBase::HangUpVoipCall()
80 {
81     std::vector<CallAttributeInfo> callAttributeInfo = CallObjectManager::GetAllCallInfoList();
82     std::vector<CallAttributeInfo>::iterator it = callAttributeInfo.begin();
83     while (it != callAttributeInfo.end()) {
84         CallAttributeInfo callinfo = (*it);
85         TelCallState callState = callinfo.callState;
86         ++it;
87         if (callinfo.callType == CallType::TYPE_VOIP) {
88             sptr<CallBase> tempCall = CallObjectManager::GetOneCallObject(callinfo.callId);
89             sptr<VoIPCall> call = static_cast<VoIPCall *>(static_cast<void *>(tempCall.GetRefPtr()));
90             if (call == nullptr) {
91                 TELEPHONY_LOGE("the call object is nullptr, callId:%{public}d", callinfo.callId);
92                 break;
93             }
94             if (call->GetTelCallState() == TelCallState::CALL_STATUS_ACTIVE) {
95                 TELEPHONY_LOGI("the voip call with callId %{public}d is active, no need to hangup", call->GetCallID());
96                 continue;
97             }
98             call->HangUpCall(ErrorReason::CELLULAR_CALL_EXISTS);
99         }
100     }
101 }
102 
IncomingCallBase()103 int32_t CallBase::IncomingCallBase()
104 {
105     std::lock_guard<std::mutex> lock(mutex_);
106     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_RINGING;
107     return TELEPHONY_SUCCESS;
108 }
109 
AnswerCallBase()110 int32_t CallBase::AnswerCallBase()
111 {
112     if (!IsCurrentRinging()) {
113         TELEPHONY_LOGW("the device is currently not ringing");
114         return CALL_ERR_PHONE_ANSWER_IS_BUSY;
115     }
116     return TELEPHONY_SUCCESS;
117 }
118 
RejectCallBase()119 int32_t CallBase::RejectCallBase()
120 {
121     answerType_ = CallAnswerType::CALL_ANSWER_REJECT;
122     return TELEPHONY_SUCCESS;
123 }
124 
SetExtraParams(AAFwk::WantParams extraParams)125 void CallBase::SetExtraParams(AAFwk::WantParams extraParams)
126 {
127     extraParams_ = extraParams;
128 }
129 
GetCallAttributeBaseInfo(CallAttributeInfo &info)130 void CallBase::GetCallAttributeBaseInfo(CallAttributeInfo &info)
131 {
132     std::lock_guard<std::mutex> lock(mutex_);
133     (void)memset_s(info.accountNumber, kMaxNumberLen, 0, kMaxNumberLen);
134     if (accountNumber_.length() > static_cast<size_t>(kMaxNumberLen)) {
135         TELEPHONY_LOGE("Number out of limit!");
136         return;
137     }
138     if (memcpy_s(info.accountNumber, kMaxNumberLen, accountNumber_.c_str(), accountNumber_.length()) == 0) {
139         info.speakerphoneOn = isSpeakerphoneOn_;
140         info.videoState = videoState_;
141         info.startTime = startTime_;
142         info.callType = callType_;
143         info.callId = callId_;
144         info.callState = callState_;
145         info.conferenceState = conferenceState_;
146         info.callBeginTime = callBeginTime_;
147         info.callCreateTime = callCreateTime_;
148         info.callEndTime = callEndTime_;
149         info.ringBeginTime = ringBeginTime_;
150         info.ringEndTime = ringEndTime_;
151         info.callDirection = direction_;
152         info.answerType = answerType_;
153         info.accountId = accountId_;
154         info.crsType = crsType_;
155         info.originalCallType = originalCallType_;
156         info.isEccContact = isEccContact_;
157         info.celiaCallType = celiaCallType_;
158         info.extraParamsString = AAFwk::WantParamWrapper(extraParams_).ToString();
159         if (memset_s(info.numberLocation, kMaxNumberLen, 0, kMaxNumberLen) != EOK) {
160             TELEPHONY_LOGE("memset_s numberLocation fail");
161             return;
162         }
163         if (memcpy_s(info.numberLocation, kMaxNumberLen, numberLocation_.c_str(), numberLocation_.length()) != EOK) {
164             TELEPHONY_LOGE("memcpy_s numberLocation fail");
165             return;
166         }
167         if (memcpy_s(info.contactName, kMaxNumberLen, contactInfo_.name.c_str(), contactInfo_.name.length()) != EOK) {
168             TELEPHONY_LOGE("memcpy_s contact name fail");
169         }
170         info.numberMarkInfo = numberMarkInfo_;
171         info.blockReason = blockReason_;
172         if (bundleName_.length() > static_cast<size_t>(kMaxBundleNameLen)) {
173             TELEPHONY_LOGE("Number out of limit!");
174             return;
175         }
176         errno_t result = memcpy_s(info.bundleName, kMaxBundleNameLen, bundleName_.c_str(), bundleName_.length());
177         if (result != EOK) {
178             TELEPHONY_LOGE("memcpy_s failed!");
179         }
180     }
181 }
182 
GetCallID()183 int32_t CallBase::GetCallID()
184 {
185     std::lock_guard<std::mutex> lock(mutex_);
186     return callId_;
187 }
188 
GetCallType()189 CallType CallBase::GetCallType()
190 {
191     return callType_;
192 }
193 
GetCallRunningState()194 CallRunningState CallBase::GetCallRunningState()
195 {
196     std::lock_guard<std::mutex> lock(mutex_);
197     return callRunningState_;
198 }
199 
200 // transfer from external call state to callmanager local state
SetTelCallState(TelCallState nextState)201 int32_t CallBase::SetTelCallState(TelCallState nextState)
202 {
203     std::lock_guard<std::mutex> lock(mutex_);
204     if (callRunningState_ != CallRunningState::CALL_RUNNING_STATE_CREATE && callState_ == nextState &&
205         nextState != TelCallState::CALL_STATUS_DIALING) {
206         TELEPHONY_LOGI("Call state duplication %{public}d", nextState);
207         return CALL_ERR_NOT_NEW_STATE;
208     }
209     callState_ = nextState;
210     switch (nextState) {
211         case TelCallState::CALL_STATUS_DIALING:
212             StateChangesToDialing();
213             break;
214         case TelCallState::CALL_STATUS_INCOMING:
215             StateChangesToIncoming();
216             break;
217         case TelCallState::CALL_STATUS_WAITING:
218             StateChangesToWaiting();
219             break;
220         case TelCallState::CALL_STATUS_ACTIVE:
221             StateChangesToActive();
222             break;
223         case TelCallState::CALL_STATUS_HOLDING:
224             StateChangesToHolding();
225             break;
226         case TelCallState::CALL_STATUS_DISCONNECTED:
227             StateChangesToDisconnected();
228             break;
229         case TelCallState::CALL_STATUS_DISCONNECTING:
230             StateChangesToDisconnecting();
231             break;
232         case TelCallState::CALL_STATUS_ALERTING:
233             StateChangesToAlerting();
234             break;
235         default:
236             break;
237     }
238     return TELEPHONY_SUCCESS;
239 }
240 
StateChangesToDialing()241 void CallBase::StateChangesToDialing()
242 {
243     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_DIALING;
244 }
245 
StateChangesToIncoming()246 void CallBase::StateChangesToIncoming()
247 {
248     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_RINGING;
249     ringBeginTime_ = time(nullptr);
250 }
251 
StateChangesToWaiting()252 void CallBase::StateChangesToWaiting()
253 {
254     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_RINGING;
255     ringBeginTime_ = time(nullptr);
256 }
257 
StateChangesToActive()258 void CallBase::StateChangesToActive()
259 {
260     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_ACTIVE;
261     if (callBeginTime_ == 0) {
262         callBeginTime_ = ringEndTime_ = time(nullptr);
263         if (callType_ == CallType::TYPE_VOIP) {
264             struct timeval tv;
265             gettimeofday(&tv, nullptr);
266             startTime_ = tv.tv_sec * MILLI_TO_BASE + tv.tv_usec / MILLI_TO_BASE;
267         } else {
268             startTime_ = callBeginTime_;
269         }
270         answerType_ = CallAnswerType::CALL_ANSWER_ACTIVED;
271     }
272 }
273 
StateChangesToHolding()274 void CallBase::StateChangesToHolding()
275 {
276     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_HOLD;
277     if (conferenceState_ == TelConferenceState::TEL_CONFERENCE_ACTIVE) {
278         conferenceState_ = TelConferenceState::TEL_CONFERENCE_DISCONNECTED;
279     }
280 }
281 
StateChangesToDisconnected()282 void CallBase::StateChangesToDisconnected()
283 {
284     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_ENDED;
285     if (conferenceState_ == TelConferenceState::TEL_CONFERENCE_DISCONNECTING ||
286         conferenceState_ == TelConferenceState::TEL_CONFERENCE_ACTIVE) {
287         conferenceState_ = TelConferenceState::TEL_CONFERENCE_DISCONNECTED;
288     }
289     callEndTime_ = time(nullptr);
290     if (ringEndTime_ == 0) {
291         ringEndTime_ = time(nullptr);
292     }
293 }
294 
StateChangesToDisconnecting()295 void CallBase::StateChangesToDisconnecting()
296 {
297     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_ENDING;
298     if (conferenceState_ == TelConferenceState::TEL_CONFERENCE_ACTIVE) {
299         conferenceState_ = TelConferenceState::TEL_CONFERENCE_DISCONNECTING;
300     }
301     if (ringEndTime_ == 0) {
302         ringEndTime_ = time(nullptr);
303     }
304 }
305 
StateChangesToAlerting()306 void CallBase::StateChangesToAlerting()
307 {
308     callRunningState_ = CallRunningState::CALL_RUNNING_STATE_DIALING;
309     ringBeginTime_ = time(nullptr);
310 }
311 
GetTelCallState()312 TelCallState CallBase::GetTelCallState()
313 {
314     std::lock_guard<std::mutex> lock(mutex_);
315     return callState_;
316 }
317 
SetAutoAnswerState(bool flag)318 void CallBase::SetAutoAnswerState(bool flag)
319 {
320     std::lock_guard<std::mutex> lock(mutex_);
321     autoAnswerState_ = flag;
322     TELEPHONY_LOGI("NeedAutoAnswer:%{public}d", autoAnswerState_);
323 }
324 
GetAutoAnswerState()325 bool CallBase::GetAutoAnswerState()
326 {
327     std::lock_guard<std::mutex> lock(mutex_);
328     return autoAnswerState_;
329 }
330 
SetAnswerVideoState(int32_t videoState)331 void CallBase::SetAnswerVideoState(int32_t videoState)
332 {
333     std::lock_guard<std::mutex> lock(mutex_);
334     answerVideoState_ = videoState;
335     TELEPHONY_LOGI("set answer video state :%{public}d", answerVideoState_);
336 }
337 
GetAnswerVideoState()338 int32_t CallBase::GetAnswerVideoState()
339 {
340     std::lock_guard<std::mutex> lock(mutex_);
341     return answerVideoState_;
342 }
343 
SetCanUnHoldState(bool flag)344 void CallBase::SetCanUnHoldState(bool flag)
345 {
346     std::lock_guard<std::mutex> lock(mutex_);
347     canUnHoldState_ = flag;
348     TELEPHONY_LOGI("CanUnHoldState:%{public}d", canUnHoldState_);
349 }
350 
GetCanUnHoldState()351 bool CallBase::GetCanUnHoldState()
352 {
353     std::lock_guard<std::mutex> lock(mutex_);
354     TELEPHONY_LOGI("CanUnHoldState:%{public}d", canUnHoldState_);
355     return canUnHoldState_;
356 }
357 
SetCanSwitchCallState(bool flag)358 void CallBase::SetCanSwitchCallState(bool flag)
359 {
360     std::lock_guard<std::mutex> lock(mutex_);
361     canSwitchCallState_ = flag;
362     TELEPHONY_LOGI("CanSwitchCallState:%{public}d", canSwitchCallState_);
363 }
364 
GetCanSwitchCallState()365 bool CallBase::GetCanSwitchCallState()
366 {
367     std::lock_guard<std::mutex> lock(mutex_);
368     TELEPHONY_LOGI("CanSwitchCallState:%{public}d", canSwitchCallState_);
369     return canSwitchCallState_;
370 }
371 
SetTelConferenceState(TelConferenceState state)372 void CallBase::SetTelConferenceState(TelConferenceState state)
373 {
374     std::lock_guard<std::mutex> lock(mutex_);
375     conferenceState_ = state;
376     TELEPHONY_LOGI("SetTelConferenceState, callId:%{public}d, state:%{public}d", callId_, state);
377 }
378 
GetTelConferenceState()379 TelConferenceState CallBase::GetTelConferenceState()
380 {
381     std::lock_guard<std::mutex> lock(mutex_);
382     return conferenceState_;
383 }
384 
GetVideoStateType()385 VideoStateType CallBase::GetVideoStateType()
386 {
387     std::lock_guard<std::mutex> lock(mutex_);
388     return videoState_;
389 }
390 
SetVideoStateType(VideoStateType mediaType)391 void CallBase::SetVideoStateType(VideoStateType mediaType)
392 {
393     std::lock_guard<std::mutex> lock(mutex_);
394     videoState_ = mediaType;
395 }
396 
GetCrsType()397 int32_t CallBase::GetCrsType()
398 {
399     std::lock_guard<std::mutex> lock(mutex_);
400     return crsType_;
401 }
402 
SetCrsType(int32_t crsType)403 void CallBase::SetCrsType(int32_t crsType)
404 {
405     std::lock_guard<std::mutex> lock(mutex_);
406     crsType_ = crsType;
407 }
408 
GetOriginalCallType()409 int32_t CallBase::GetOriginalCallType()
410 {
411     std::lock_guard<std::mutex> lock(mutex_);
412     return originalCallType_;
413 }
414 
SetOriginalCallType(int32_t originalCallType)415 void CallBase::SetOriginalCallType(int32_t originalCallType)
416 {
417     std::lock_guard<std::mutex> lock(mutex_);
418     originalCallType_ = originalCallType;
419 }
420 
SetIsEccContact(bool isEccContact)421 void CallBase::SetIsEccContact(bool isEccContact)
422 {
423     std::lock_guard<std::mutex> lock(mutex_);
424     isEccContact_ = isEccContact;
425 }
426 
SetNumberLocation(std::string numberLocation)427 void CallBase::SetNumberLocation(std::string numberLocation)
428 {
429     CallVoiceAssistantManager::GetInstance()->UpdateNumberLocation(numberLocation, callId_);
430     std::lock_guard<std::mutex> lock(mutex_);
431     numberLocation_ = numberLocation;
432 }
433 
GetAccountId()434 int32_t CallBase::GetAccountId()
435 {
436     return accountId_;
437 }
438 
GetNumberLocation()439 std::string CallBase::GetNumberLocation()
440 {
441     std::lock_guard<std::mutex> lock(mutex_);
442     return numberLocation_;
443 }
444 
SetPolicyFlag(PolicyFlag flag)445 void CallBase::SetPolicyFlag(PolicyFlag flag)
446 {
447     std::lock_guard<std::mutex> lock(mutex_);
448     policyFlag_ |= flag;
449 }
450 
GetPolicyFlag()451 uint64_t CallBase::GetPolicyFlag()
452 {
453     std::lock_guard<std::mutex> lock(mutex_);
454     return policyFlag_;
455 }
456 
GetCallerInfo()457 ContactInfo CallBase::GetCallerInfo()
458 {
459     std::lock_guard<std::mutex> lock(mutex_);
460     return contactInfo_;
461 }
462 
SetCallerInfo(const ContactInfo &info)463 void CallBase::SetCallerInfo(const ContactInfo &info)
464 {
465     CallVoiceAssistantManager::GetInstance()->UpdateContactInfo(info, callId_);
466     std::lock_guard<std::mutex> lock(mutex_);
467     contactInfo_ = info;
468 }
469 
GetNumberMarkInfo()470 NumberMarkInfo CallBase::GetNumberMarkInfo()
471 {
472     std::lock_guard<std::mutex> lock(mutex_);
473     return numberMarkInfo_;
474 }
475 
SetNumberMarkInfo(const NumberMarkInfo &numberMarkInfo)476 void CallBase::SetNumberMarkInfo(const NumberMarkInfo &numberMarkInfo)
477 {
478     std::lock_guard<std::mutex> lock(mutex_);
479     numberMarkInfo_ = numberMarkInfo;
480 }
481 
SetBlockReason(const int32_t &blockReason)482 void CallBase::SetBlockReason(const int32_t &blockReason)
483 {
484     std::lock_guard<std::mutex> lock(mutex_);
485     blockReason_ = blockReason;
486 }
487 
SetCallRunningState(CallRunningState callRunningState)488 void CallBase::SetCallRunningState(CallRunningState callRunningState)
489 {
490     std::lock_guard<std::mutex> lock(mutex_);
491     callRunningState_ = callRunningState;
492 }
493 
SetStartTime(int64_t startTime)494 void CallBase::SetStartTime(int64_t startTime)
495 {
496     std::lock_guard<std::mutex> lock(mutex_);
497     startTime_ = startTime;
498 }
499 
SetCallBeginTime(time_t callBeginTime)500 void CallBase::SetCallBeginTime(time_t callBeginTime)
501 {
502     std::lock_guard<std::mutex> lock(mutex_);
503     callBeginTime_ = callBeginTime;
504 }
505 
SetCallCreateTime(time_t callCreateTime)506 void CallBase::SetCallCreateTime(time_t callCreateTime)
507 {
508     std::lock_guard<std::mutex> lock(mutex_);
509     callCreateTime_ = callCreateTime;
510 }
511 
SetCallEndTime(time_t callEndTime)512 void CallBase::SetCallEndTime(time_t callEndTime)
513 {
514     std::lock_guard<std::mutex> lock(mutex_);
515     callEndTime_ = callEndTime;
516 }
517 
SetRingBeginTime(time_t ringBeginTime)518 void CallBase::SetRingBeginTime(time_t ringBeginTime)
519 {
520     std::lock_guard<std::mutex> lock(mutex_);
521     ringBeginTime_ = ringBeginTime;
522 }
523 
SetRingEndTime(time_t ringEndTime)524 void CallBase::SetRingEndTime(time_t ringEndTime)
525 {
526     std::lock_guard<std::mutex> lock(mutex_);
527     ringEndTime_ = ringEndTime;
528 }
529 
SetAnswerType(CallAnswerType answerType)530 void CallBase::SetAnswerType(CallAnswerType answerType)
531 {
532     std::lock_guard<std::mutex> lock(mutex_);
533     answerType_ = answerType;
534 }
535 
GetCallEndedType()536 CallEndedType CallBase::GetCallEndedType()
537 {
538     std::lock_guard<std::mutex> lock(mutex_);
539     return callEndedType_;
540 }
541 
SetCallEndedType(CallEndedType callEndedType)542 int32_t CallBase::SetCallEndedType(CallEndedType callEndedType)
543 {
544     std::lock_guard<std::mutex> lock(mutex_);
545     callEndedType_ = callEndedType;
546     return TELEPHONY_SUCCESS;
547 }
548 
SetCallId(int32_t callId)549 void CallBase::SetCallId(int32_t callId)
550 {
551     std::lock_guard<std::mutex> lock(mutex_);
552     callId_ = callId;
553 }
554 
SetCeliaCallType(int32_t celiaCallType)555 void CallBase::SetCeliaCallType(int32_t celiaCallType)
556 {
557     std::lock_guard<std::mutex> lock(mutex_);
558     celiaCallType_ = celiaCallType;
559 }
560 
CheckVoicemailNumber(std::string phoneNumber)561 bool CallBase::CheckVoicemailNumber(std::string phoneNumber)
562 {
563     return false;
564 }
565 
IsSpeakerphoneEnabled()566 bool CallBase::IsSpeakerphoneEnabled()
567 {
568     std::shared_ptr<BluetoothCallManager> bluetoothCallManager = std::make_shared<BluetoothCallManager>();
569     // Gets whether the device can be started from the configuration
570     if (bluetoothCallManager->IsBtAvailble()) {
571         return false;
572     }
573     return true;
574 }
575 
IsCurrentRinging()576 bool CallBase::IsCurrentRinging()
577 {
578     std::lock_guard<std::mutex> lock(mutex_);
579     return (callRunningState_ == CallRunningState::CALL_RUNNING_STATE_RINGING) ? true : false;
580 }
581 
GetAccountNumber()582 std::string CallBase::GetAccountNumber()
583 {
584     return accountNumber_;
585 }
586 
SetAccountNumber(const std::string accountNumber)587 void CallBase::SetAccountNumber(const std::string accountNumber)
588 {
589     accountNumber_ = accountNumber;
590 }
591 
IsAnsweredCall()592 bool CallBase::IsAnsweredCall()
593 {
594     std::lock_guard<std::mutex> lock(mutex_);
595     return isAnswered_;
596 }
597 
SetAnsweredCall(bool isAnswered)598 void CallBase::SetAnsweredCall(bool isAnswered)
599 {
600     std::lock_guard<std::mutex> lock(mutex_);
601     isAnswered_ = isAnswered;
602 }
603 
SetSpeakerphoneOn(bool speakerphoneOn)604 int32_t CallBase::SetSpeakerphoneOn(bool speakerphoneOn)
605 {
606     isSpeakerphoneOn_ = speakerphoneOn;
607     return TELEPHONY_SUCCESS;
608 }
609 
IsSpeakerphoneOn()610 bool CallBase::IsSpeakerphoneOn()
611 {
612     return isSpeakerphoneOn_;
613 }
614 
IsAliveState()615 bool CallBase::IsAliveState()
616 {
617     return !(callState_ == TelCallState::CALL_STATUS_IDLE || callState_ == TelCallState::CALL_STATUS_DISCONNECTED ||
618         callState_ == TelCallState::CALL_STATUS_DISCONNECTING);
619 }
620 
SetBundleName(const char *bundleName)621 void CallBase::SetBundleName(const char *bundleName)
622 {
623     bundleName_ = bundleName;
624 }
625 
SetCallType(CallType callType)626 void CallBase::SetCallType(CallType callType)
627 {
628     callType_ = callType;
629 }
630 
SetMicPhoneState(bool isMuted)631 int32_t CallBase::SetMicPhoneState(bool isMuted)
632 {
633     isMuted_ = isMuted;
634     return TELEPHONY_SUCCESS;
635 }
636 
IsMuted()637 bool CallBase::IsMuted()
638 {
639     return isMuted_;
640 }
641 
SetCallDirection(CallDirection direction)642 void CallBase::SetCallDirection(CallDirection direction)
643 {
644     direction_ = direction;
645 }
646 
GetCallDirection()647 CallDirection CallBase::GetCallDirection()
648 {
649     return direction_;
650 }
651 } // namespace Telephony
652 } // namespace OHOS
653