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_control_manager.h"
17
18 #include <securec.h>
19 #include <string_ex.h>
20
21 #include "call_manager_errors.h"
22 #include "telephony_log_wrapper.h"
23
24 #include "common_type.h"
25 #include "audio_control_manager.h"
26 #include "video_control_manager.h"
27 #include "bluetooth_call_manager.h"
28 #include "call_ability_report_proxy.h"
29 #include "call_state_broadcast.h"
30 #include "call_state_report_proxy.h"
31 #include "cellular_call_connection.h"
32 #include "call_broadcast_subscriber.h"
33 #include "call_records_manager.h"
34 #include "call_number_utils.h"
35 #include "reject_call_sms.h"
36
37 namespace OHOS {
38 namespace Telephony {
CallControlManager()39 CallControlManager::CallControlManager()
40 : callStateListenerPtr_(nullptr), callRequestHandlerServicePtr_(nullptr), missedCallNotification_(nullptr),
41 callSettingManagerPtr_(nullptr)
42 {
43 dialSrcInfo_.callId = ERR_ID;
44 dialSrcInfo_.number = "";
45 extras_.Clear();
46 dialSrcInfo_.isDialing = false;
47 }
48
~CallControlManager()49 CallControlManager::~CallControlManager() {}
50
Init()51 bool CallControlManager::Init()
52 {
53 callStateListenerPtr_ = std::make_unique<CallStateListener>();
54 if (callStateListenerPtr_ == nullptr) {
55 TELEPHONY_LOGE("callStateListenerPtr_ is null");
56 return false;
57 }
58 callRequestHandlerServicePtr_ = std::make_unique<CallRequestHandlerService>();
59 if (callRequestHandlerServicePtr_ == nullptr) {
60 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is null");
61 return false;
62 }
63 callRequestHandlerServicePtr_->Start();
64 missedCallNotification_ = std::make_unique<MissedCallNotification>();
65 if (missedCallNotification_ == nullptr) {
66 TELEPHONY_LOGE("missedCallNotification_ is null");
67 return false;
68 }
69 callSettingManagerPtr_ = std::make_unique<CallSettingManager>();
70 if (callSettingManagerPtr_ == nullptr) {
71 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
72 return false;
73 }
74 if (BroadcastSubscriber() != TELEPHONY_SUCCESS) {
75 TELEPHONY_LOGE("BroadcastSubscriber failed!");
76 return false;
77 }
78 DelayedSingleton<AudioControlManager>::GetInstance()->Init();
79 CallStateObserve();
80 return true;
81 }
82
DialCall(std::u16string & number,AppExecFwk::PacMap & extras)83 int32_t CallControlManager::DialCall(std::u16string &number, AppExecFwk::PacMap &extras)
84 {
85 int32_t errorCode = TELEPHONY_ERR_FAIL;
86 sptr<CallBase> callObjectPtr = nullptr;
87 std::string accountNumber(Str16ToStr8(number));
88 int32_t ret = NumberLegalityCheck(accountNumber);
89 if (ret != TELEPHONY_SUCCESS) {
90 TELEPHONY_LOGE("Invalid number!");
91 return ret;
92 }
93 bool isEcc = DelayedSingleton<CallNumberUtils>::GetInstance()->CheckNumberIsEmergency(
94 accountNumber, extras.GetIntValue("accountId"), errorCode);
95 ret = DialPolicy(number, extras, isEcc);
96 if (ret != TELEPHONY_SUCCESS) {
97 TELEPHONY_LOGE("dial policy result:%{public}d", ret);
98 return ret;
99 }
100 // temporarily save dial information
101 {
102 std::lock_guard<std::mutex> lock(mutex_);
103 dialSrcInfo_.callId = ERR_ID;
104 dialSrcInfo_.number = accountNumber;
105 dialSrcInfo_.isDialing = true;
106 dialSrcInfo_.isEcc = isEcc;
107 dialSrcInfo_.callType = (CallType)extras.GetIntValue("callType");
108 dialSrcInfo_.accountId = extras.GetIntValue("accountId");
109 dialSrcInfo_.dialType = (DialType)extras.GetIntValue("dialType");
110 dialSrcInfo_.videoState = (VideoStateType)extras.GetIntValue("videoState");
111 dialSrcInfo_.bundleName = extras.GetStringValue("bundleName");
112 extras_.Clear();
113 extras_ = extras;
114 }
115 if (callRequestHandlerServicePtr_ == nullptr) {
116 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
117 return TELEPHONY_ERR_LOCAL_PTR_NULL;
118 }
119 ret = callRequestHandlerServicePtr_->DialCall();
120 if (ret != TELEPHONY_SUCCESS) {
121 TELEPHONY_LOGE("DialCall failed!");
122 return ret;
123 }
124 return TELEPHONY_SUCCESS;
125 }
126
AnswerCall(int32_t callId,int32_t videoState)127 int32_t CallControlManager::AnswerCall(int32_t callId, int32_t videoState)
128 {
129 int32_t ret = AnswerCallPolicy(callId, videoState);
130 if (ret != TELEPHONY_SUCCESS) {
131 TELEPHONY_LOGE("AnswerCallPolicy failed!");
132 return ret;
133 }
134 if (callRequestHandlerServicePtr_ == nullptr) {
135 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
136 return TELEPHONY_ERR_LOCAL_PTR_NULL;
137 }
138 ret = callRequestHandlerServicePtr_->AnswerCall(callId, videoState);
139 if (ret != TELEPHONY_SUCCESS) {
140 TELEPHONY_LOGE("AnswerCall failed!");
141 return ret;
142 }
143 return TELEPHONY_SUCCESS;
144 }
145
RejectCall(int32_t callId,bool rejectWithMessage,std::u16string textMessage)146 int32_t CallControlManager::RejectCall(int32_t callId, bool rejectWithMessage, std::u16string textMessage)
147 {
148 if (callRequestHandlerServicePtr_ == nullptr) {
149 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
150 return TELEPHONY_ERR_LOCAL_PTR_NULL;
151 }
152 int32_t ret = RejectCallPolicy(callId);
153 if (ret != TELEPHONY_SUCCESS) {
154 TELEPHONY_LOGE("RejectCallPolicy failed!");
155 return ret;
156 }
157 std::string messageStr(Str16ToStr8(textMessage));
158 ret = callRequestHandlerServicePtr_->RejectCall(callId, rejectWithMessage, messageStr);
159 if (ret != TELEPHONY_SUCCESS) {
160 TELEPHONY_LOGE("RejectCall failed!");
161 return ret;
162 }
163 return TELEPHONY_SUCCESS;
164 }
165
HangUpCall(int32_t callId)166 int32_t CallControlManager::HangUpCall(int32_t callId)
167 {
168 if (callRequestHandlerServicePtr_ == nullptr) {
169 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
170 return TELEPHONY_ERR_LOCAL_PTR_NULL;
171 }
172 int32_t ret = HangUpPolicy(callId);
173 if (ret != TELEPHONY_SUCCESS) {
174 TELEPHONY_LOGE("HangUpPolicy failed!");
175 return ret;
176 }
177 ret = callRequestHandlerServicePtr_->HangUpCall(callId);
178 if (ret != TELEPHONY_SUCCESS) {
179 TELEPHONY_LOGE("HangUpCall failed!");
180 return ret;
181 }
182 return TELEPHONY_SUCCESS;
183 }
184
GetCallState()185 int32_t CallControlManager::GetCallState()
186 {
187 CallStateToApp callState = CallStateToApp::CALL_STATE_UNKNOWN;
188 if (!HasCallExist()) {
189 callState = CallStateToApp::CALL_STATE_IDLE;
190 } else {
191 callState = CallStateToApp::CALL_STATE_OFFHOOK;
192 if (HasRingingCall()) {
193 callState = CallStateToApp::CALL_STATE_RINGING;
194 }
195 }
196 return static_cast<int32_t>(callState);
197 }
198
HoldCall(int32_t callId)199 int32_t CallControlManager::HoldCall(int32_t callId)
200 {
201 int32_t ret = HoldCallPolicy(callId);
202 if (ret != TELEPHONY_SUCCESS) {
203 TELEPHONY_LOGE("HoldCall failed!");
204 return ret;
205 }
206 if (callRequestHandlerServicePtr_ == nullptr) {
207 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
208 return TELEPHONY_ERR_LOCAL_PTR_NULL;
209 }
210 ret = callRequestHandlerServicePtr_->HoldCall(callId);
211 if (ret != TELEPHONY_SUCCESS) {
212 TELEPHONY_LOGE("HoldCall failed!");
213 return ret;
214 }
215 return TELEPHONY_SUCCESS;
216 }
217
UnHoldCall(const int32_t callId)218 int32_t CallControlManager::UnHoldCall(const int32_t callId)
219 {
220 int32_t ret = UnHoldCallPolicy(callId);
221 if (ret != TELEPHONY_SUCCESS) {
222 TELEPHONY_LOGE("UnHoldCall failed!");
223 return ret;
224 }
225 if (callRequestHandlerServicePtr_ == nullptr) {
226 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
227 return TELEPHONY_ERR_LOCAL_PTR_NULL;
228 }
229 ret = callRequestHandlerServicePtr_->UnHoldCall(callId);
230 if (ret != TELEPHONY_SUCCESS) {
231 TELEPHONY_LOGE("UnHoldCall failed!");
232 return ret;
233 }
234 return TELEPHONY_SUCCESS;
235 }
236
237 // swap two calls state, turn active call into holding, and turn holding call into active
SwitchCall(int32_t callId)238 int32_t CallControlManager::SwitchCall(int32_t callId)
239 {
240 int32_t ret = SwitchCallPolicy(callId);
241 if (ret != TELEPHONY_SUCCESS) {
242 TELEPHONY_LOGE("SwitchCall failed!");
243 return ret;
244 }
245 if (callRequestHandlerServicePtr_ == nullptr) {
246 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
247 return TELEPHONY_ERR_LOCAL_PTR_NULL;
248 }
249 ret = callRequestHandlerServicePtr_->SwitchCall(callId);
250 if (ret != TELEPHONY_SUCCESS) {
251 TELEPHONY_LOGE("SwitchCall failed!");
252 return ret;
253 }
254 return TELEPHONY_SUCCESS;
255 }
256
HasCall()257 bool CallControlManager::HasCall()
258 {
259 return HasCallExist();
260 }
261
IsNewCallAllowed()262 bool CallControlManager::IsNewCallAllowed()
263 {
264 return IsNewCallAllowedCreate();
265 }
266
IsRinging()267 bool CallControlManager::IsRinging()
268 {
269 return HasRingingCall();
270 }
271
HasEmergency()272 bool CallControlManager::HasEmergency()
273 {
274 return HasEmergencyCall();
275 }
276
NotifyNewCallCreated(sptr<CallBase> & callObjectPtr)277 bool CallControlManager::NotifyNewCallCreated(sptr<CallBase> &callObjectPtr)
278 {
279 if (callObjectPtr == nullptr) {
280 TELEPHONY_LOGE("callObjectPtr is null!");
281 return false;
282 }
283 if (callStateListenerPtr_ != nullptr) {
284 callStateListenerPtr_->NewCallCreated(callObjectPtr);
285 }
286 return true;
287 }
288
NotifyCallDestroyed(int32_t cause)289 bool CallControlManager::NotifyCallDestroyed(int32_t cause)
290 {
291 if (callStateListenerPtr_ != nullptr) {
292 callStateListenerPtr_->CallDestroyed(cause);
293 return true;
294 }
295 return false;
296 }
297
NotifyCallStateUpdated(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)298 bool CallControlManager::NotifyCallStateUpdated(
299 sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
300 {
301 if (callObjectPtr == nullptr) {
302 TELEPHONY_LOGE("callObjectPtr is null!");
303 return false;
304 }
305 if (callStateListenerPtr_ != nullptr) {
306 callStateListenerPtr_->CallStateUpdated(callObjectPtr, priorState, nextState);
307 TELEPHONY_LOGI("NotifyCallStateUpdated priorState:%{public}d,nextState:%{public}d", priorState, nextState);
308 return true;
309 }
310 return false;
311 }
312
NotifyIncomingCallAnswered(sptr<CallBase> & callObjectPtr)313 bool CallControlManager::NotifyIncomingCallAnswered(sptr<CallBase> &callObjectPtr)
314 {
315 if (callObjectPtr == nullptr) {
316 TELEPHONY_LOGE("callObjectPtr is null!");
317 return false;
318 }
319 if (callStateListenerPtr_ != nullptr) {
320 callStateListenerPtr_->IncomingCallActivated(callObjectPtr);
321 return true;
322 }
323 return false;
324 }
325
NotifyIncomingCallRejected(sptr<CallBase> & callObjectPtr,bool isSendSms,std::string content)326 bool CallControlManager::NotifyIncomingCallRejected(
327 sptr<CallBase> &callObjectPtr, bool isSendSms, std::string content)
328 {
329 if (callObjectPtr == nullptr) {
330 TELEPHONY_LOGE("callObjectPtr is null!");
331 return false;
332 }
333 if (callStateListenerPtr_ != nullptr) {
334 callStateListenerPtr_->IncomingCallHungUp(callObjectPtr, isSendSms, content);
335 return true;
336 }
337 return false;
338 }
339
NotifyCallEventUpdated(CallEventInfo & info)340 bool CallControlManager::NotifyCallEventUpdated(CallEventInfo &info)
341 {
342 if (callStateListenerPtr_ != nullptr) {
343 callStateListenerPtr_->CallEventUpdated(info);
344 return true;
345 }
346 return false;
347 }
348
StartDtmf(int32_t callId,char str)349 int32_t CallControlManager::StartDtmf(int32_t callId, char str)
350 {
351 sptr<CallBase> call = GetOneCallObject(callId);
352 if (call == nullptr) {
353 return TELEPHONY_ERR_LOCAL_PTR_NULL;
354 }
355 if (!call->IsAliveState()) {
356 return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
357 }
358
359 int32_t ret = call->StartDtmf(str);
360 if (ret != TELEPHONY_SUCCESS) {
361 TELEPHONY_LOGE("StartDtmf failed, return:%{public}d", ret);
362 }
363 return ret;
364 }
365
StopDtmf(int32_t callId)366 int32_t CallControlManager::StopDtmf(int32_t callId)
367 {
368 sptr<CallBase> call = GetOneCallObject(callId);
369 if (call == nullptr) {
370 return TELEPHONY_ERR_LOCAL_PTR_NULL;
371 }
372 if (!call->IsAliveState()) {
373 return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
374 }
375
376 int32_t ret = call->StopDtmf();
377 if (ret != TELEPHONY_SUCCESS) {
378 TELEPHONY_LOGE("StopDtmf failed, return:%{public}d", ret);
379 }
380 return ret;
381 }
382
GetCallWaiting(int32_t slotId)383 int32_t CallControlManager::GetCallWaiting(int32_t slotId)
384 {
385 int32_t ret = CallPolicy::GetCallWaitingPolicy(slotId);
386 if (ret != TELEPHONY_SUCCESS) {
387 TELEPHONY_LOGE("GetCallWaiting failed!");
388 return ret;
389 }
390 if (callSettingManagerPtr_ != nullptr) {
391 return callSettingManagerPtr_->GetCallWaiting(slotId);
392 } else {
393 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
394 return TELEPHONY_ERR_LOCAL_PTR_NULL;
395 }
396 }
397
SetCallWaiting(int32_t slotId,bool activate)398 int32_t CallControlManager::SetCallWaiting(int32_t slotId, bool activate)
399 {
400 int32_t ret = CallPolicy::SetCallWaitingPolicy(slotId);
401 if (ret != TELEPHONY_SUCCESS) {
402 TELEPHONY_LOGE("SetCallWaiting failed!");
403 return ret;
404 }
405 if (callSettingManagerPtr_ != nullptr) {
406 return callSettingManagerPtr_->SetCallWaiting(slotId, activate);
407 } else {
408 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
409 return TELEPHONY_ERR_LOCAL_PTR_NULL;
410 }
411 }
412
GetCallRestriction(int32_t slotId,CallRestrictionType type)413 int32_t CallControlManager::GetCallRestriction(int32_t slotId, CallRestrictionType type)
414 {
415 int32_t ret = CallPolicy::GetCallRestrictionPolicy(slotId);
416 if (ret != TELEPHONY_SUCCESS) {
417 TELEPHONY_LOGE("GetCallRestriction failed!");
418 return ret;
419 }
420 if (callSettingManagerPtr_ != nullptr) {
421 return callSettingManagerPtr_->GetCallRestriction(slotId, type);
422 } else {
423 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
424 return TELEPHONY_ERR_LOCAL_PTR_NULL;
425 }
426 }
427
SetCallRestriction(int32_t slotId,CallRestrictionInfo & info)428 int32_t CallControlManager::SetCallRestriction(int32_t slotId, CallRestrictionInfo &info)
429 {
430 int32_t ret = CallPolicy::SetCallRestrictionPolicy(slotId);
431 if (ret != TELEPHONY_SUCCESS) {
432 TELEPHONY_LOGE("SetCallRestriction failed!");
433 return ret;
434 }
435 if (callSettingManagerPtr_ != nullptr) {
436 return callSettingManagerPtr_->SetCallRestriction(slotId, info);
437 } else {
438 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
439 return TELEPHONY_ERR_LOCAL_PTR_NULL;
440 }
441 }
442
GetCallTransferInfo(int32_t slotId,CallTransferType type)443 int32_t CallControlManager::GetCallTransferInfo(int32_t slotId, CallTransferType type)
444 {
445 int32_t ret = CallPolicy::GetCallTransferInfoPolicy(slotId);
446 if (ret != TELEPHONY_SUCCESS) {
447 TELEPHONY_LOGE("GetCallTransferInfo failed!");
448 return ret;
449 }
450 if (callSettingManagerPtr_ != nullptr) {
451 return callSettingManagerPtr_->GetCallTransferInfo(slotId, type);
452 } else {
453 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
454 return TELEPHONY_ERR_LOCAL_PTR_NULL;
455 }
456 }
457
SetCallTransferInfo(int32_t slotId,CallTransferInfo & info)458 int32_t CallControlManager::SetCallTransferInfo(int32_t slotId, CallTransferInfo &info)
459 {
460 int32_t ret = CallPolicy::SetCallTransferInfoPolicy(slotId);
461 if (ret != TELEPHONY_SUCCESS) {
462 TELEPHONY_LOGE("SetCallTransferInfo failed!");
463 return ret;
464 }
465 if (callSettingManagerPtr_ != nullptr) {
466 return callSettingManagerPtr_->SetCallTransferInfo(slotId, info);
467 } else {
468 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
469 return TELEPHONY_ERR_LOCAL_PTR_NULL;
470 }
471 }
472
SetCallPreferenceMode(int32_t slotId,int32_t mode)473 int32_t CallControlManager::SetCallPreferenceMode(int32_t slotId, int32_t mode)
474 {
475 int32_t ret = CallPolicy::SetCallPreferenceModePolicy(slotId);
476 if (ret != TELEPHONY_SUCCESS) {
477 TELEPHONY_LOGE("SetCallPreferenceMode failed!");
478 return ret;
479 }
480 if (callSettingManagerPtr_ != nullptr) {
481 return callSettingManagerPtr_->SetCallPreferenceMode(slotId, mode);
482 } else {
483 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
484 return TELEPHONY_ERR_LOCAL_PTR_NULL;
485 }
486 }
487
488 /**
489 * start a telephone conference by merging three-way calls,steps as follows:
490 * 1.A call B: A<---->B,set holding
491 * 2.A call C: A<---->C, active
492 * 3.A initial merge request by CombineConference
493 * @param mainCallId:active call id
494 */
CombineConference(int32_t mainCallId)495 int32_t CallControlManager::CombineConference(int32_t mainCallId)
496 {
497 sptr<CallBase> mainCall = GetOneCallObject(mainCallId);
498 if (mainCall == nullptr) {
499 TELEPHONY_LOGE("GetOneCallObject failed, mainCallId:%{public}d", mainCallId);
500 return CALL_ERR_INVALID_CALLID;
501 }
502 if (mainCall->GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) {
503 TELEPHONY_LOGE("mainCall state should be active ");
504 return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
505 }
506 if (!CallObjectManager::IsCallExist(mainCall->GetCallType(), TelCallState::CALL_STATUS_HOLDING)) {
507 TELEPHONY_LOGE("callType:%{public}d,callState:CALL_STATUS_HOLDING is not exist!", mainCall->GetCallType());
508 return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
509 }
510 int32_t ret = mainCall->CanCombineConference();
511 if (ret != TELEPHONY_SUCCESS) {
512 TELEPHONY_LOGE("CanCombineConference failed");
513 return ret;
514 }
515 if (callRequestHandlerServicePtr_ == nullptr) {
516 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
517 return TELEPHONY_ERR_LOCAL_PTR_NULL;
518 }
519 ret = callRequestHandlerServicePtr_->CombineConference(mainCallId);
520 if (ret != TELEPHONY_SUCCESS) {
521 TELEPHONY_LOGE("CombineConference failed!");
522 }
523 return ret;
524 }
525
SeparateConference(int32_t callId)526 int32_t CallControlManager::SeparateConference(int32_t callId)
527 {
528 sptr<CallBase> call = GetOneCallObject(callId);
529 if (call == nullptr) {
530 TELEPHONY_LOGE("GetOneCallObject failed, callId:%{public}d", callId);
531 return CALL_ERR_INVALID_CALLID;
532 }
533 int32_t ret = call->CanSeparateConference();
534 if (ret != TELEPHONY_SUCCESS) {
535 TELEPHONY_LOGE("CanSeparateConference failed");
536 return ret;
537 }
538 if (callRequestHandlerServicePtr_ == nullptr) {
539 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
540 return TELEPHONY_ERR_LOCAL_PTR_NULL;
541 }
542 ret = callRequestHandlerServicePtr_->SeparateConference(callId);
543 if (ret != TELEPHONY_SUCCESS) {
544 TELEPHONY_LOGE("CombineConference failed!");
545 return ret;
546 }
547 return TELEPHONY_SUCCESS;
548 }
549
GetMainCallId(int32_t callId)550 int32_t CallControlManager::GetMainCallId(int32_t callId)
551 {
552 sptr<CallBase> call = GetOneCallObject(callId);
553 if (call == nullptr) {
554 TELEPHONY_LOGE("GetOneCallObject failed! callId:%{public}d", callId);
555 return TELEPHONY_ERROR;
556 }
557 return call->GetMainCallId();
558 }
559
GetSubCallIdList(int32_t callId)560 std::vector<std::u16string> CallControlManager::GetSubCallIdList(int32_t callId)
561 {
562 sptr<CallBase> call = GetOneCallObject(callId);
563 if (call == nullptr) {
564 return std::vector<std::u16string>();
565 }
566 return call->GetSubCallIdList();
567 }
568
GetCallIdListForConference(int32_t callId)569 std::vector<std::u16string> CallControlManager::GetCallIdListForConference(int32_t callId)
570 {
571 sptr<CallBase> call = GetOneCallObject(callId);
572 if (call == nullptr) {
573 return std::vector<std::u16string>();
574 }
575 return call->GetCallIdListForConference();
576 }
577
GetImsConfig(int32_t slotId,ImsConfigItem item)578 int32_t CallControlManager::GetImsConfig(int32_t slotId, ImsConfigItem item)
579 {
580 int32_t ret = CallPolicy::GetImsConfigPolicy(slotId);
581 if (ret != TELEPHONY_SUCCESS) {
582 TELEPHONY_LOGE("GetImsConfig failed!");
583 return ret;
584 }
585 if (callSettingManagerPtr_ != nullptr) {
586 return callSettingManagerPtr_->GetImsConfig(slotId, item);
587 } else {
588 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
589 return TELEPHONY_ERR_LOCAL_PTR_NULL;
590 }
591 }
592
SetImsConfig(int32_t slotId,ImsConfigItem item,std::u16string & value)593 int32_t CallControlManager::SetImsConfig(int32_t slotId, ImsConfigItem item, std::u16string &value)
594 {
595 int32_t ret = CallPolicy::SetImsConfigPolicy(slotId);
596 if (ret != TELEPHONY_SUCCESS) {
597 TELEPHONY_LOGE("SetImsConfig failed!");
598 return ret;
599 }
600 if (callSettingManagerPtr_ != nullptr) {
601 return callSettingManagerPtr_->SetImsConfig(slotId, item, value);
602 } else {
603 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
604 return TELEPHONY_ERR_LOCAL_PTR_NULL;
605 }
606 }
607
GetImsFeatureValue(int32_t slotId,FeatureType type)608 int32_t CallControlManager::GetImsFeatureValue(int32_t slotId, FeatureType type)
609 {
610 int32_t ret = CallPolicy::GetImsFeatureValuePolicy(slotId);
611 if (ret != TELEPHONY_SUCCESS) {
612 TELEPHONY_LOGE("GetImsFeatureValue failed!");
613 return ret;
614 }
615 if (callSettingManagerPtr_ != nullptr) {
616 return callSettingManagerPtr_->GetImsFeatureValue(slotId, type);
617 } else {
618 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
619 return TELEPHONY_ERR_LOCAL_PTR_NULL;
620 }
621 }
622
SetImsFeatureValue(int32_t slotId,FeatureType type,int32_t value)623 int32_t CallControlManager::SetImsFeatureValue(int32_t slotId, FeatureType type, int32_t value)
624 {
625 int32_t ret = CallPolicy::SetImsFeatureValuePolicy(slotId);
626 if (ret != TELEPHONY_SUCCESS) {
627 TELEPHONY_LOGE("SetImsFeatureValue failed!");
628 return ret;
629 }
630 if (callSettingManagerPtr_ != nullptr) {
631 return callSettingManagerPtr_->SetImsFeatureValue(slotId, type, value);
632 } else {
633 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
634 return TELEPHONY_ERR_LOCAL_PTR_NULL;
635 }
636 }
637
EnableImsSwitch(int32_t slotId)638 int32_t CallControlManager::EnableImsSwitch(int32_t slotId)
639 {
640 int32_t ret = CallPolicy::EnableVoLtePolicy(slotId);
641 if (ret != TELEPHONY_SUCCESS) {
642 TELEPHONY_LOGE("EnableImsSwitch failed!");
643 return ret;
644 }
645 if (callSettingManagerPtr_ != nullptr) {
646 return callSettingManagerPtr_->EnableImsSwitch(slotId);
647 } else {
648 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
649 return TELEPHONY_ERR_LOCAL_PTR_NULL;
650 }
651 }
652
DisableImsSwitch(int32_t slotId)653 int32_t CallControlManager::DisableImsSwitch(int32_t slotId)
654 {
655 int32_t ret = CallPolicy::DisableVoLtePolicy(slotId);
656 if (ret != TELEPHONY_SUCCESS) {
657 TELEPHONY_LOGE("DisableImsSwitch failed!");
658 return ret;
659 }
660 if (callSettingManagerPtr_ != nullptr) {
661 return callSettingManagerPtr_->DisableImsSwitch(slotId);
662 } else {
663 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
664 return TELEPHONY_ERR_LOCAL_PTR_NULL;
665 }
666 }
667
IsImsSwitchEnabled(int32_t slotId)668 int32_t CallControlManager::IsImsSwitchEnabled(int32_t slotId)
669 {
670 int32_t ret = CallPolicy::IsVoLteEnabledPolicy(slotId);
671 if (ret != TELEPHONY_SUCCESS) {
672 TELEPHONY_LOGE("IsImsSwitchEnabled failed!");
673 return ret;
674 }
675 if (callSettingManagerPtr_ != nullptr) {
676 return callSettingManagerPtr_->IsImsSwitchEnabled(slotId);
677 } else {
678 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
679 return TELEPHONY_ERR_LOCAL_PTR_NULL;
680 }
681 }
682
SetLteEnhanceMode(int32_t slotId,bool value)683 int32_t CallControlManager::SetLteEnhanceMode(int32_t slotId, bool value)
684 {
685 int32_t ret = CallPolicy::SetLteEnhanceModePolicy(slotId);
686 if (ret != TELEPHONY_SUCCESS) {
687 TELEPHONY_LOGE("SetLteEnhanceMode failed!");
688 return ret;
689 }
690 if (callSettingManagerPtr_ != nullptr) {
691 return callSettingManagerPtr_->SetLteEnhanceMode(slotId, value);
692 } else {
693 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
694 return TELEPHONY_ERR_LOCAL_PTR_NULL;
695 }
696 }
697
GetLteEnhanceMode(int32_t slotId)698 int32_t CallControlManager::GetLteEnhanceMode(int32_t slotId)
699 {
700 int32_t ret = CallPolicy::GetLteEnhanceModePolicy(slotId);
701 if (ret != TELEPHONY_SUCCESS) {
702 TELEPHONY_LOGE("GetLteEnhanceMode failed!");
703 return ret;
704 }
705 if (callSettingManagerPtr_ != nullptr) {
706 return callSettingManagerPtr_->GetLteEnhanceMode(slotId);
707 } else {
708 TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
709 return TELEPHONY_ERR_LOCAL_PTR_NULL;
710 }
711 }
712
UpdateImsCallMode(int32_t callId,ImsCallMode mode)713 int32_t CallControlManager::UpdateImsCallMode(int32_t callId, ImsCallMode mode)
714 {
715 int32_t ret = TELEPHONY_ERR_FAIL;
716 ret = UpdateCallMediaModePolicy(callId, mode);
717 if (ret != TELEPHONY_SUCCESS) {
718 TELEPHONY_LOGE("check prerequisites failed !");
719 return ret;
720 }
721 if (callRequestHandlerServicePtr_ == nullptr) {
722 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
723 return TELEPHONY_ERR_LOCAL_PTR_NULL;
724 }
725 ret = callRequestHandlerServicePtr_->UpdateImsCallMode(callId, mode);
726 if (ret != TELEPHONY_SUCCESS) {
727 TELEPHONY_LOGE("UpdateImsCallMode failed!");
728 return ret;
729 }
730 return TELEPHONY_SUCCESS;
731 }
732
StartRtt(int32_t callId,std::u16string & msg)733 int32_t CallControlManager::StartRtt(int32_t callId, std::u16string &msg)
734 {
735 int32_t ret = CallPolicy::StartRttPolicy(callId);
736 if (ret != TELEPHONY_SUCCESS) {
737 TELEPHONY_LOGE("NO IMS call,can not StartRtt!");
738 return ret;
739 }
740 if (callRequestHandlerServicePtr_ == nullptr) {
741 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
742 return TELEPHONY_ERR_LOCAL_PTR_NULL;
743 }
744 ret = callRequestHandlerServicePtr_->StartRtt(callId, msg);
745 if (ret != TELEPHONY_SUCCESS) {
746 TELEPHONY_LOGE("StartRtt failed!");
747 return ret;
748 }
749 return TELEPHONY_SUCCESS;
750 }
751
StopRtt(int32_t callId)752 int32_t CallControlManager::StopRtt(int32_t callId)
753 {
754 int32_t ret = CallPolicy::StopRttPolicy(callId);
755 if (ret != TELEPHONY_SUCCESS) {
756 TELEPHONY_LOGE("NO IMS call,no need StopRtt!");
757 return ret;
758 }
759 if (callRequestHandlerServicePtr_ == nullptr) {
760 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
761 return TELEPHONY_ERR_LOCAL_PTR_NULL;
762 }
763 ret = callRequestHandlerServicePtr_->StopRtt(callId);
764 if (ret != TELEPHONY_SUCCESS) {
765 TELEPHONY_LOGE("StopRtt failed!");
766 return ret;
767 }
768 return TELEPHONY_SUCCESS;
769 }
770
JoinConference(int32_t callId,std::vector<std::u16string> & numberList)771 int32_t CallControlManager::JoinConference(int32_t callId, std::vector<std::u16string> &numberList)
772 {
773 if (callRequestHandlerServicePtr_ == nullptr) {
774 TELEPHONY_LOGE("callRequestHandlerServicePtr_ is nullptr!");
775 return TELEPHONY_ERR_LOCAL_PTR_NULL;
776 }
777 std::vector<std::string> phoneNumberList(numberList.size());
778 for (size_t index = 0; index < numberList.size(); ++index) {
779 phoneNumberList[index] = Str16ToStr8(numberList[index]);
780 }
781 int32_t ret = CallPolicy::InviteToConferencePolicy(callId, phoneNumberList);
782 if (ret != TELEPHONY_SUCCESS) {
783 TELEPHONY_LOGE("check InviteToConference Policy failed!");
784 return ret;
785 }
786 ret = callRequestHandlerServicePtr_->JoinConference(callId, phoneNumberList);
787 if (ret != TELEPHONY_SUCCESS) {
788 TELEPHONY_LOGE("JoinConference failed!");
789 return ret;
790 }
791 return TELEPHONY_SUCCESS;
792 }
793
SetMuted(bool isMute)794 int32_t CallControlManager::SetMuted(bool isMute)
795 {
796 return DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(isMute);
797 }
798
MuteRinger()799 int32_t CallControlManager::MuteRinger()
800 {
801 return DelayedSingleton<AudioControlManager>::GetInstance()->MuteRinger();
802 }
803
SetAudioDevice(AudioDevice deviceType)804 int32_t CallControlManager::SetAudioDevice(AudioDevice deviceType)
805 {
806 return DelayedSingleton<AudioControlManager>::GetInstance()->SetAudioDevice(deviceType);
807 }
808
ControlCamera(std::u16string cameraId,int32_t callingUid,int32_t callingPid)809 int32_t CallControlManager::ControlCamera(std::u16string cameraId, int32_t callingUid, int32_t callingPid)
810 {
811 return DelayedSingleton<VideoControlManager>::GetInstance()->ControlCamera(cameraId, callingUid, callingPid);
812 }
813
SetPreviewWindow(VideoWindow & window)814 int32_t CallControlManager::SetPreviewWindow(VideoWindow &window)
815 {
816 return DelayedSingleton<VideoControlManager>::GetInstance()->SetPreviewWindow(window);
817 }
818
SetDisplayWindow(VideoWindow & window)819 int32_t CallControlManager::SetDisplayWindow(VideoWindow &window)
820 {
821 return DelayedSingleton<VideoControlManager>::GetInstance()->SetDisplayWindow(window);
822 }
823
SetCameraZoom(float zoomRatio)824 int32_t CallControlManager::SetCameraZoom(float zoomRatio)
825 {
826 return DelayedSingleton<VideoControlManager>::GetInstance()->SetCameraZoom(zoomRatio);
827 }
828
SetPausePicture(std::u16string path)829 int32_t CallControlManager::SetPausePicture(std::u16string path)
830 {
831 return DelayedSingleton<VideoControlManager>::GetInstance()->SetPausePicture(path);
832 }
833
SetDeviceDirection(int32_t rotation)834 int32_t CallControlManager::SetDeviceDirection(int32_t rotation)
835 {
836 return DelayedSingleton<VideoControlManager>::GetInstance()->SetDeviceDirection(rotation);
837 }
838
IsEmergencyPhoneNumber(std::u16string & number,int32_t slotId,int32_t & errorCode)839 bool CallControlManager::IsEmergencyPhoneNumber(std::u16string &number, int32_t slotId, int32_t &errorCode)
840 {
841 if (IsValidSlotId(slotId)) {
842 errorCode = CALL_ERR_INVALID_SLOT_ID;
843 return false;
844 }
845 return DelayedSingleton<CallNumberUtils>::GetInstance()->CheckNumberIsEmergency(
846 Str16ToStr8(number), slotId, errorCode);
847 }
848
FormatPhoneNumber(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)849 int32_t CallControlManager::FormatPhoneNumber(
850 std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
851 {
852 std::string tmpStr("");
853 int32_t ret = DelayedSingleton<CallNumberUtils>::GetInstance()->FormatPhoneNumber(
854 Str16ToStr8(number), Str16ToStr8(countryCode), tmpStr);
855 formatNumber = Str8ToStr16(tmpStr);
856 return ret;
857 }
858
FormatPhoneNumberToE164(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)859 int32_t CallControlManager::FormatPhoneNumberToE164(
860 std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
861 {
862 std::string tmpStr("");
863 int32_t ret = DelayedSingleton<CallNumberUtils>::GetInstance()->FormatPhoneNumberToE164(
864 Str16ToStr8(number), Str16ToStr8(countryCode), tmpStr);
865 formatNumber = Str8ToStr16(tmpStr);
866 return ret;
867 }
868
GetDialParaInfo(DialParaInfo & info)869 void CallControlManager::GetDialParaInfo(DialParaInfo &info)
870 {
871 std::lock_guard<std::mutex> lock(mutex_);
872 info = dialSrcInfo_;
873 }
874
GetDialParaInfo(DialParaInfo & info,AppExecFwk::PacMap & extras)875 void CallControlManager::GetDialParaInfo(DialParaInfo &info, AppExecFwk::PacMap &extras)
876 {
877 std::lock_guard<std::mutex> lock(mutex_);
878 info = dialSrcInfo_;
879 extras = extras_;
880 }
881
CallStateObserve()882 void CallControlManager::CallStateObserve()
883 {
884 if (callStateListenerPtr_ == nullptr) {
885 TELEPHONY_LOGE("callStateListenerPtr_ is null");
886 return;
887 }
888 std::unique_ptr<RejectCallSms> hangUpSmsPtr = std::make_unique<RejectCallSms>();
889 if (hangUpSmsPtr == nullptr) {
890 TELEPHONY_LOGE("hangUpSmsPtr is null");
891 return;
892 }
893 std::unique_ptr<CallStateBroadcast> callStateBroadcastPtr = std::make_unique<CallStateBroadcast>();
894 if (callStateBroadcastPtr == nullptr) {
895 TELEPHONY_LOGE("callStateBroadcastPtr is null");
896 return;
897 }
898 std::unique_ptr<CallStateReportProxy> callStateReportPtr = std::make_unique<CallStateReportProxy>();
899 if (callStateReportPtr == nullptr) {
900 TELEPHONY_LOGE("CallStateReportProxy is nullptr!");
901 return;
902 }
903 callStateListenerPtr_->AddOneObserver(DelayedSingleton<CallAbilityReportProxy>::GetInstance().get());
904 callStateListenerPtr_->AddOneObserver(callStateReportPtr.release());
905 callStateListenerPtr_->AddOneObserver(DelayedSingleton<AudioControlManager>::GetInstance().get());
906 callStateListenerPtr_->AddOneObserver(hangUpSmsPtr.release());
907 callStateListenerPtr_->AddOneObserver(callStateBroadcastPtr.release());
908 callStateListenerPtr_->AddOneObserver(missedCallNotification_.release());
909 callStateListenerPtr_->AddOneObserver(DelayedSingleton<CallRecordsManager>::GetInstance().get());
910 }
911
NumberLegalityCheck(std::string & number)912 int32_t CallControlManager::NumberLegalityCheck(std::string &number)
913 {
914 if (number.empty()) {
915 TELEPHONY_LOGE("phone number is NULL!");
916 return CALL_ERR_PHONE_NUMBER_EMPTY;
917 }
918 if (number.length() > kMaxNumberLen) {
919 TELEPHONY_LOGE(
920 "the number length exceeds limit,len:%{public}zu,maxLen:%{public}d", number.length(), kMaxNumberLen);
921 return CALL_ERR_NUMBER_OUT_OF_RANGE;
922 }
923 return TELEPHONY_SUCCESS;
924 }
925
BroadcastSubscriber()926 int32_t CallControlManager::BroadcastSubscriber()
927 {
928 EventFwk::MatchingSkills matchingSkills;
929 matchingSkills.AddEvent(SIM_STATE_UPDATE_ACTION);
930 EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
931 std::shared_ptr<CallBroadcastSubscriber> subscriberPtr =
932 std::make_shared<CallBroadcastSubscriber>(subscriberInfo);
933 if (subscriberPtr != nullptr) {
934 bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberPtr);
935 if (!subscribeResult) {
936 TELEPHONY_LOGW("SubscribeCommonEvent failed");
937 return TELEPHONY_ERR_SUBSCRIBE_BROADCAST_FAIL;
938 }
939 }
940 return TELEPHONY_SUCCESS;
941 }
942
943 #ifdef ABILITY_MEDIA_SUPPORT
onButtonDealing(HeadsetButtonService::ButtonEvent type)944 bool CallControlManager::onButtonDealing(HeadsetButtonService::ButtonEvent type)
945 {
946 bool isRingState = false;
947 sptr<CallBase> call = nullptr;
948
949 if ((call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING)) != nullptr) {
950 isRingState = true;
951 } else if (((call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING)) != nullptr) ||
952 ((call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE)) != nullptr) ||
953 ((call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD)) != nullptr)) {
954 isRingState = false;
955 } else {
956 return false;
957 }
958
959 switch (type) {
960 case HeadsetButtonService::SHORT_PRESS_EVENT:
961 if (isRingState) {
962 call->HangUpCall();
963 } else {
964 call->AnswerCall(0);
965 }
966 break;
967 case HeadsetButtonService::LONG_PRESS_EVENT:
968 if (isRingState) {
969 std::string str = "";
970 call->RejectCall(false, str);
971 } else {
972 DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(true);
973 }
974 break;
975 default:
976 return false;
977 }
978 return true;
979 }
980 #endif
981 } // namespace Telephony
982 } // namespace OHOS
983