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