• 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_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