• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2022 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 "audio_control_manager.h"
22 #include "bluetooth_call_manager.h"
23 #include "call_ability_report_proxy.h"
24 #include "call_manager_errors.h"
25 #include "call_manager_hisysevent.h"
26 #include "call_number_utils.h"
27 #include "call_records_manager.h"
28 #include "call_state_report_proxy.h"
29 #include "cellular_call_connection.h"
30 #include "common_type.h"
31 #include "ims_call.h"
32 #include "iservice_registry.h"
33 #include "reject_call_sms.h"
34 #include "telephony_log_wrapper.h"
35 #include "video_control_manager.h"
36 
37 namespace OHOS {
38 namespace Telephony {
39 using namespace OHOS::EventFwk;
CallControlManager()40 CallControlManager::CallControlManager()
41     : callStateListenerPtr_(nullptr), CallRequestHandlerPtr_(nullptr), incomingCallWakeup_(nullptr),
42       missedCallNotification_(nullptr), callSettingManagerPtr_(nullptr)
43 {
44     dialSrcInfo_.callId = ERR_ID;
45     dialSrcInfo_.number = "";
46     extras_.Clear();
47     dialSrcInfo_.isDialing = false;
48 }
49 
~CallControlManager()50 CallControlManager::~CallControlManager()
51 {
52     if (statusChangeListener_ != nullptr) {
53         auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
54         if (samgrProxy != nullptr) {
55             samgrProxy->UnSubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, statusChangeListener_);
56             statusChangeListener_ = nullptr;
57         }
58     }
59 }
60 
Init()61 bool CallControlManager::Init()
62 {
63     callStateListenerPtr_ = std::make_unique<CallStateListener>();
64     if (callStateListenerPtr_ == nullptr) {
65         TELEPHONY_LOGE("callStateListenerPtr_ is null");
66         return false;
67     }
68     CallRequestHandlerPtr_ = std::make_unique<CallRequestHandler>();
69     if (CallRequestHandlerPtr_ == nullptr) {
70         TELEPHONY_LOGE("CallRequestHandlerPtr_ is null");
71         return false;
72     }
73     CallRequestHandlerPtr_->Init();
74     incomingCallWakeup_ = std::make_shared<IncomingCallWakeup>();
75     if (incomingCallWakeup_ == nullptr) {
76         TELEPHONY_LOGE("incomingCallWakeup_ is null");
77         return false;
78     }
79     missedCallNotification_ = std::make_shared<MissedCallNotification>();
80     if (missedCallNotification_ == nullptr) {
81         TELEPHONY_LOGE("missedCallNotification_ is null");
82         return false;
83     }
84     callSettingManagerPtr_ = std::make_unique<CallSettingManager>();
85     if (callSettingManagerPtr_ == nullptr) {
86         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
87         return false;
88     }
89     if (BroadcastSubscriber() != TELEPHONY_SUCCESS) {
90         TELEPHONY_LOGE("BroadcastSubscriber failed!");
91         return false;
92     }
93     DelayedSingleton<AudioControlManager>::GetInstance()->Init();
94     CallStateObserve();
95     return true;
96 }
97 
DialCall(std::u16string & number,AppExecFwk::PacMap & extras)98 int32_t CallControlManager::DialCall(std::u16string &number, AppExecFwk::PacMap &extras)
99 {
100     sptr<CallBase> callObjectPtr = nullptr;
101     std::string accountNumber(Str16ToStr8(number));
102     int32_t ret = NumberLegalityCheck(accountNumber);
103     if (ret != TELEPHONY_SUCCESS) {
104         TELEPHONY_LOGE("Invalid number!");
105         return ret;
106     }
107     bool isEcc = false;
108     ret = DelayedSingleton<CallNumberUtils>::GetInstance()->CheckNumberIsEmergency(
109         accountNumber, extras.GetIntValue("accountId"), isEcc);
110     if (ret != TELEPHONY_SUCCESS) {
111         TELEPHONY_LOGE("check number is emergency result:%{public}d", ret);
112         return ret;
113     }
114     if (isEcc) {
115         extras.PutIntValue("dialScene", (int32_t)DialScene::CALL_EMERGENCY);
116     } else {
117         extras.PutIntValue("dialScene", (int32_t)DialScene::CALL_NORMAL);
118     }
119     ret = DialPolicy(number, extras, isEcc);
120     if (ret != TELEPHONY_SUCCESS) {
121         TELEPHONY_LOGE("dial policy result:%{public}d", ret);
122         return ret;
123     }
124     // temporarily save dial information
125     {
126         std::lock_guard<std::mutex> lock(mutex_);
127         dialSrcInfo_.callId = ERR_ID;
128         dialSrcInfo_.number = accountNumber;
129         dialSrcInfo_.isDialing = true;
130         dialSrcInfo_.isEcc = isEcc;
131         dialSrcInfo_.callType = (CallType)extras.GetIntValue("callType");
132         dialSrcInfo_.accountId = extras.GetIntValue("accountId");
133         dialSrcInfo_.dialType = (DialType)extras.GetIntValue("dialType");
134         dialSrcInfo_.videoState = (VideoStateType)extras.GetIntValue("videoState");
135         dialSrcInfo_.bundleName = extras.GetStringValue("bundleName");
136         extras_.Clear();
137         extras_ = extras;
138     }
139     if (CallRequestHandlerPtr_ == nullptr) {
140         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
141         return TELEPHONY_ERR_LOCAL_PTR_NULL;
142     }
143     ret = CallRequestHandlerPtr_->DialCall();
144     if (ret != TELEPHONY_SUCCESS) {
145         TELEPHONY_LOGE("DialCall failed!");
146         return ret;
147     }
148     return TELEPHONY_SUCCESS;
149 }
150 
AnswerCall(int32_t callId,int32_t videoState)151 int32_t CallControlManager::AnswerCall(int32_t callId, int32_t videoState)
152 {
153     if (callId == INVALID_CALLID) {
154         sptr<CallBase> call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
155         if (call == nullptr) {
156             TELEPHONY_LOGE("call is nullptr");
157             CallManagerHisysevent::WriteAnswerCallFaultEvent(
158                 INVALID_PARAMETER, callId, videoState, TELEPHONY_ERR_LOCAL_PTR_NULL, "call is nullptr");
159             return TELEPHONY_ERROR;
160         }
161         callId = call->GetCallID();
162     }
163 
164     int32_t ret = AnswerCallPolicy(callId, videoState);
165     if (ret != TELEPHONY_SUCCESS) {
166         TELEPHONY_LOGE("AnswerCallPolicy failed!");
167         CallManagerHisysevent::WriteAnswerCallFaultEvent(
168             INVALID_PARAMETER, callId, videoState, ret, "AnswerCallPolicy failed");
169         return ret;
170     }
171     if (CallRequestHandlerPtr_ == nullptr) {
172         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
173         return TELEPHONY_ERR_LOCAL_PTR_NULL;
174     }
175     ret = CallRequestHandlerPtr_->AnswerCall(callId, videoState);
176     if (ret != TELEPHONY_SUCCESS) {
177         TELEPHONY_LOGE("AnswerCall failed!");
178         return ret;
179     }
180     return TELEPHONY_SUCCESS;
181 }
182 
RejectCall(int32_t callId,bool rejectWithMessage,std::u16string textMessage)183 int32_t CallControlManager::RejectCall(int32_t callId, bool rejectWithMessage, std::u16string textMessage)
184 {
185     if (CallRequestHandlerPtr_ == nullptr) {
186         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
187         return TELEPHONY_ERR_LOCAL_PTR_NULL;
188     }
189 
190     if (callId == INVALID_CALLID) {
191         sptr<CallBase> call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
192         if (call == nullptr) {
193             TELEPHONY_LOGE("call is nullptr");
194             CallManagerHisysevent::WriteHangUpFaultEvent(
195                 INVALID_PARAMETER, callId, TELEPHONY_ERR_LOCAL_PTR_NULL, "Reject call is nullptr");
196             return TELEPHONY_ERROR;
197         }
198         callId = call->GetCallID();
199     }
200 
201     int32_t ret = RejectCallPolicy(callId);
202     if (ret != TELEPHONY_SUCCESS) {
203         TELEPHONY_LOGE("RejectCallPolicy failed!");
204         CallManagerHisysevent::WriteHangUpFaultEvent(INVALID_PARAMETER, callId, ret, "Reject RejectCallPolicy failed");
205         return ret;
206     }
207     std::string messageStr(Str16ToStr8(textMessage));
208     ret = CallRequestHandlerPtr_->RejectCall(callId, rejectWithMessage, messageStr);
209     if (ret != TELEPHONY_SUCCESS) {
210         TELEPHONY_LOGE("RejectCall failed!");
211         return ret;
212     }
213     return TELEPHONY_SUCCESS;
214 }
215 
HangUpCall(int32_t callId)216 int32_t CallControlManager::HangUpCall(int32_t callId)
217 {
218     if (callId == INVALID_CALLID) {
219         std::vector<CallRunningState> callRunningStateVec;
220         callRunningStateVec.push_back(CallRunningState::CALL_RUNNING_STATE_ACTIVE);
221         callRunningStateVec.push_back(CallRunningState::CALL_RUNNING_STATE_DIALING);
222         callRunningStateVec.push_back(CallRunningState::CALL_RUNNING_STATE_CONNECTING);
223 
224         for (auto &state : callRunningStateVec) {
225             sptr<CallBase> call = GetOneCallObject(state);
226             if (call != nullptr) {
227                 callId = call->GetCallID();
228                 break;
229             }
230         }
231 
232         if (callId == INVALID_CALLID) {
233             TELEPHONY_LOGE("callId is INVALID_CALLID!");
234             CallManagerHisysevent::WriteHangUpFaultEvent(
235                 INVALID_PARAMETER, callId, TELEPHONY_ERR_LOCAL_PTR_NULL, "HangUp callId is INVALID_CALLID");
236             return TELEPHONY_ERROR;
237         }
238     }
239 
240     if (CallRequestHandlerPtr_ == nullptr) {
241         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
242         return TELEPHONY_ERR_LOCAL_PTR_NULL;
243     }
244     int32_t ret = HangUpPolicy(callId);
245     if (ret != TELEPHONY_SUCCESS) {
246         TELEPHONY_LOGE("HangUpPolicy failed!");
247         CallManagerHisysevent::WriteHangUpFaultEvent(INVALID_PARAMETER, callId, ret, "HangUp HangUpPolicy failed");
248         return ret;
249     }
250     ret = CallRequestHandlerPtr_->HangUpCall(callId);
251     if (ret != TELEPHONY_SUCCESS) {
252         TELEPHONY_LOGE("HangUpCall failed!");
253         return ret;
254     }
255     return TELEPHONY_SUCCESS;
256 }
257 
GetCallState()258 int32_t CallControlManager::GetCallState()
259 {
260     CallStateToApp callState = CallStateToApp::CALL_STATE_UNKNOWN;
261     if (!HasCallExist()) {
262         callState = CallStateToApp::CALL_STATE_IDLE;
263     } else {
264         callState = CallStateToApp::CALL_STATE_OFFHOOK;
265         bool enabled = false;
266         if ((HasRingingCall(enabled) == TELEPHONY_SUCCESS) && enabled) {
267             callState = CallStateToApp::CALL_STATE_RINGING;
268         }
269     }
270     return static_cast<int32_t>(callState);
271 }
272 
HoldCall(int32_t callId)273 int32_t CallControlManager::HoldCall(int32_t callId)
274 {
275     int32_t ret = HoldCallPolicy(callId);
276     if (ret != TELEPHONY_SUCCESS) {
277         TELEPHONY_LOGE("HoldCall failed!");
278         return ret;
279     }
280     if (CallRequestHandlerPtr_ == nullptr) {
281         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
282         return TELEPHONY_ERR_LOCAL_PTR_NULL;
283     }
284     ret = CallRequestHandlerPtr_->HoldCall(callId);
285     if (ret != TELEPHONY_SUCCESS) {
286         TELEPHONY_LOGE("HoldCall failed!");
287         return ret;
288     }
289     return TELEPHONY_SUCCESS;
290 }
291 
UnHoldCall(const int32_t callId)292 int32_t CallControlManager::UnHoldCall(const int32_t callId)
293 {
294     int32_t ret = UnHoldCallPolicy(callId);
295     if (ret != TELEPHONY_SUCCESS) {
296         TELEPHONY_LOGE("UnHoldCall failed!");
297         return ret;
298     }
299     if (CallRequestHandlerPtr_ == nullptr) {
300         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
301         return TELEPHONY_ERR_LOCAL_PTR_NULL;
302     }
303     ret = CallRequestHandlerPtr_->UnHoldCall(callId);
304     if (ret != TELEPHONY_SUCCESS) {
305         TELEPHONY_LOGE("UnHoldCall failed!");
306         return ret;
307     }
308     return TELEPHONY_SUCCESS;
309 }
310 
311 // swap two calls state, turn active call into holding, and turn holding call into active
SwitchCall(int32_t callId)312 int32_t CallControlManager::SwitchCall(int32_t callId)
313 {
314     int32_t ret = SwitchCallPolicy(callId);
315     if (ret != TELEPHONY_SUCCESS) {
316         TELEPHONY_LOGE("SwitchCall failed!");
317         return ret;
318     }
319     if (CallRequestHandlerPtr_ == nullptr) {
320         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
321         return TELEPHONY_ERR_LOCAL_PTR_NULL;
322     }
323     ret = CallRequestHandlerPtr_->SwitchCall(callId);
324     if (ret != TELEPHONY_SUCCESS) {
325         TELEPHONY_LOGE("SwitchCall failed!");
326         return ret;
327     }
328     return TELEPHONY_SUCCESS;
329 }
330 
HasCall()331 bool CallControlManager::HasCall()
332 {
333     return HasCallExist();
334 }
335 
IsNewCallAllowed(bool & enabled)336 int32_t CallControlManager::IsNewCallAllowed(bool &enabled)
337 {
338     return IsNewCallAllowedCreate(enabled);
339 }
340 
IsRinging(bool & enabled)341 int32_t CallControlManager::IsRinging(bool &enabled)
342 {
343     return HasRingingCall(enabled);
344 }
345 
HasEmergency(bool & enabled)346 int32_t CallControlManager::HasEmergency(bool &enabled)
347 {
348     return HasEmergencyCall(enabled);
349 }
350 
NotifyNewCallCreated(sptr<CallBase> & callObjectPtr)351 bool CallControlManager::NotifyNewCallCreated(sptr<CallBase> &callObjectPtr)
352 {
353     if (callObjectPtr == nullptr) {
354         TELEPHONY_LOGE("callObjectPtr is null!");
355         return false;
356     }
357     if (callStateListenerPtr_ != nullptr) {
358         callStateListenerPtr_->NewCallCreated(callObjectPtr);
359     }
360     return true;
361 }
362 
NotifyCallDestroyed(const DisconnectedDetails & details)363 bool CallControlManager::NotifyCallDestroyed(const DisconnectedDetails &details)
364 {
365     if (callStateListenerPtr_ != nullptr) {
366         callStateListenerPtr_->CallDestroyed(details);
367         return true;
368     }
369     return false;
370 }
371 
NotifyCallStateUpdated(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)372 bool CallControlManager::NotifyCallStateUpdated(
373     sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
374 {
375     if (callObjectPtr == nullptr) {
376         TELEPHONY_LOGE("callObjectPtr is null!");
377         return false;
378     }
379     if (callStateListenerPtr_ != nullptr) {
380         callStateListenerPtr_->CallStateUpdated(callObjectPtr, priorState, nextState);
381         TELEPHONY_LOGI("NotifyCallStateUpdated priorState:%{public}d,nextState:%{public}d", priorState, nextState);
382         return true;
383     }
384     return false;
385 }
386 
NotifyIncomingCallAnswered(sptr<CallBase> & callObjectPtr)387 bool CallControlManager::NotifyIncomingCallAnswered(sptr<CallBase> &callObjectPtr)
388 {
389     if (callObjectPtr == nullptr) {
390         TELEPHONY_LOGE("callObjectPtr is null!");
391         return false;
392     }
393     if (callStateListenerPtr_ != nullptr) {
394         callStateListenerPtr_->IncomingCallActivated(callObjectPtr);
395         return true;
396     }
397     return false;
398 }
399 
NotifyIncomingCallRejected(sptr<CallBase> & callObjectPtr,bool isSendSms,std::string content)400 bool CallControlManager::NotifyIncomingCallRejected(
401     sptr<CallBase> &callObjectPtr, bool isSendSms, std::string content)
402 {
403     if (callObjectPtr == nullptr) {
404         TELEPHONY_LOGE("callObjectPtr is null!");
405         return false;
406     }
407     if (callStateListenerPtr_ != nullptr) {
408         callStateListenerPtr_->IncomingCallHungUp(callObjectPtr, isSendSms, content);
409         return true;
410     }
411     return false;
412 }
413 
NotifyCallEventUpdated(CallEventInfo & info)414 bool CallControlManager::NotifyCallEventUpdated(CallEventInfo &info)
415 {
416     if (callStateListenerPtr_ != nullptr) {
417         callStateListenerPtr_->CallEventUpdated(info);
418         return true;
419     }
420     return false;
421 }
422 
StartDtmf(int32_t callId,char str)423 int32_t CallControlManager::StartDtmf(int32_t callId, char str)
424 {
425     sptr<CallBase> call = GetOneCallObject(callId);
426     if (call == nullptr) {
427         return TELEPHONY_ERR_ARGUMENT_INVALID;
428     }
429     if (!call->IsAliveState()) {
430         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
431     }
432 
433     int32_t ret = call->StartDtmf(str);
434     if (ret != TELEPHONY_SUCCESS) {
435         TELEPHONY_LOGE("StartDtmf failed, return:%{public}d", ret);
436     }
437     DelayedSingleton<AudioControlManager>::GetInstance()->PlayDtmfTone(str);
438     return ret;
439 }
440 
StopDtmf(int32_t callId)441 int32_t CallControlManager::StopDtmf(int32_t callId)
442 {
443     sptr<CallBase> call = GetOneCallObject(callId);
444     if (call == nullptr) {
445         return TELEPHONY_ERR_ARGUMENT_INVALID;
446     }
447     if (!call->IsAliveState()) {
448         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
449     }
450 
451     int32_t ret = call->StopDtmf();
452     if (ret != TELEPHONY_SUCCESS) {
453         TELEPHONY_LOGE("StopDtmf failed, return:%{public}d", ret);
454     }
455     DelayedSingleton<AudioControlManager>::GetInstance()->StopDtmfTone();
456     return ret;
457 }
458 
PostDialProceed(int32_t callId,bool proceed)459 int32_t CallControlManager::PostDialProceed(int32_t callId, bool proceed)
460 {
461     sptr<CallBase> call = GetOneCallObject(callId);
462     if (call == nullptr) {
463         return TELEPHONY_ERR_ARGUMENT_INVALID;
464     }
465     if (!call->IsAliveState()) {
466         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
467     }
468 
469     int32_t ret = call->PostDialProceed(proceed);
470     if (ret != TELEPHONY_SUCCESS) {
471         TELEPHONY_LOGE("PostDialProceed failed, return:%{public}d", ret);
472     }
473     return ret;
474 }
475 
GetCallWaiting(int32_t slotId)476 int32_t CallControlManager::GetCallWaiting(int32_t slotId)
477 {
478     int32_t ret = CallPolicy::GetCallWaitingPolicy(slotId);
479     if (ret != TELEPHONY_SUCCESS) {
480         TELEPHONY_LOGE("GetCallWaiting failed!");
481         return ret;
482     }
483     if (callSettingManagerPtr_ != nullptr) {
484         return callSettingManagerPtr_->GetCallWaiting(slotId);
485     } else {
486         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
487         return TELEPHONY_ERR_LOCAL_PTR_NULL;
488     }
489 }
490 
SetCallWaiting(int32_t slotId,bool activate)491 int32_t CallControlManager::SetCallWaiting(int32_t slotId, bool activate)
492 {
493     int32_t ret = CallPolicy::SetCallWaitingPolicy(slotId);
494     if (ret != TELEPHONY_SUCCESS) {
495         TELEPHONY_LOGE("SetCallWaiting failed!");
496         return ret;
497     }
498     if (callSettingManagerPtr_ != nullptr) {
499         return callSettingManagerPtr_->SetCallWaiting(slotId, activate);
500     } else {
501         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
502         return TELEPHONY_ERR_LOCAL_PTR_NULL;
503     }
504 }
505 
GetCallRestriction(int32_t slotId,CallRestrictionType type)506 int32_t CallControlManager::GetCallRestriction(int32_t slotId, CallRestrictionType type)
507 {
508     int32_t ret = CallPolicy::GetCallRestrictionPolicy(slotId);
509     if (ret != TELEPHONY_SUCCESS) {
510         TELEPHONY_LOGE("GetCallRestriction failed!");
511         return ret;
512     }
513     if (callSettingManagerPtr_ != nullptr) {
514         return callSettingManagerPtr_->GetCallRestriction(slotId, type);
515     } else {
516         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
517         return TELEPHONY_ERR_LOCAL_PTR_NULL;
518     }
519 }
520 
SetCallRestriction(int32_t slotId,CallRestrictionInfo & info)521 int32_t CallControlManager::SetCallRestriction(int32_t slotId, CallRestrictionInfo &info)
522 {
523     int32_t ret = CallPolicy::SetCallRestrictionPolicy(slotId);
524     if (ret != TELEPHONY_SUCCESS) {
525         TELEPHONY_LOGE("SetCallRestriction failed!");
526         return ret;
527     }
528     if (callSettingManagerPtr_ != nullptr) {
529         return callSettingManagerPtr_->SetCallRestriction(slotId, info);
530     } else {
531         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
532         return TELEPHONY_ERR_LOCAL_PTR_NULL;
533     }
534 }
535 
SetCallRestrictionPassword(int32_t slotId,CallRestrictionType fac,const char * oldPassword,const char * newPassword)536 int32_t CallControlManager::SetCallRestrictionPassword(
537     int32_t slotId, CallRestrictionType fac, const char *oldPassword, const char *newPassword)
538 {
539     int32_t ret = CallPolicy::SetCallRestrictionPolicy(slotId);
540     if (ret != TELEPHONY_SUCCESS) {
541         TELEPHONY_LOGE("policy check failed!");
542         return ret;
543     }
544     if (callSettingManagerPtr_ != nullptr) {
545         return callSettingManagerPtr_->SetCallRestrictionPassword(slotId, fac, oldPassword, newPassword);
546     } else {
547         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
548         return TELEPHONY_ERR_LOCAL_PTR_NULL;
549     }
550 }
551 
GetCallTransferInfo(int32_t slotId,CallTransferType type)552 int32_t CallControlManager::GetCallTransferInfo(int32_t slotId, CallTransferType type)
553 {
554     int32_t ret = CallPolicy::GetCallTransferInfoPolicy(slotId);
555     if (ret != TELEPHONY_SUCCESS) {
556         TELEPHONY_LOGE("GetCallTransferInfo failed!");
557         return ret;
558     }
559     if (callSettingManagerPtr_ != nullptr) {
560         return callSettingManagerPtr_->GetCallTransferInfo(slotId, type);
561     } else {
562         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
563         return TELEPHONY_ERR_LOCAL_PTR_NULL;
564     }
565 }
566 
SetCallTransferInfo(int32_t slotId,CallTransferInfo & info)567 int32_t CallControlManager::SetCallTransferInfo(int32_t slotId, CallTransferInfo &info)
568 {
569     int32_t ret = CallPolicy::SetCallTransferInfoPolicy(slotId);
570     if (ret != TELEPHONY_SUCCESS) {
571         TELEPHONY_LOGE("SetCallTransferInfo failed!");
572         return ret;
573     }
574     if (callSettingManagerPtr_ != nullptr) {
575         return callSettingManagerPtr_->SetCallTransferInfo(slotId, info);
576     } else {
577         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
578         return TELEPHONY_ERR_LOCAL_PTR_NULL;
579     }
580 }
581 
CanSetCallTransferTime(int32_t slotId,bool & result)582 int32_t CallControlManager::CanSetCallTransferTime(int32_t slotId, bool &result)
583 {
584     int32_t ret = CallPolicy::SetCallTransferInfoPolicy(slotId);
585     if (ret != TELEPHONY_SUCCESS) {
586         TELEPHONY_LOGE("[slot%{public}d] failed!", slotId);
587         return ret;
588     }
589     if (callSettingManagerPtr_ != nullptr) {
590         return callSettingManagerPtr_->CanSetCallTransferTime(slotId, result);
591     } else {
592         TELEPHONY_LOGE("[slot%{public}d]  callSettingManagerPtr_ is nullptr!", slotId);
593         return TELEPHONY_ERR_LOCAL_PTR_NULL;
594     }
595 }
596 
SetCallPreferenceMode(int32_t slotId,int32_t mode)597 int32_t CallControlManager::SetCallPreferenceMode(int32_t slotId, int32_t mode)
598 {
599     int32_t ret = CallPolicy::SetCallPreferenceModePolicy(slotId);
600     if (ret != TELEPHONY_SUCCESS) {
601         TELEPHONY_LOGE("SetCallPreferenceMode failed!");
602         return ret;
603     }
604     if (callSettingManagerPtr_ != nullptr) {
605         return callSettingManagerPtr_->SetCallPreferenceMode(slotId, mode);
606     } else {
607         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
608         return TELEPHONY_ERR_LOCAL_PTR_NULL;
609     }
610 }
611 
612 /**
613  * start a telephone conference by merging three-way calls,steps as follows:
614  * 1.A call B: A<---->B,set holding
615  * 2.A call C: A<---->C, active
616  * 3.A initial merge request by CombineConference
617  * @param mainCallId:active call id
618  */
CombineConference(int32_t mainCallId)619 int32_t CallControlManager::CombineConference(int32_t mainCallId)
620 {
621     sptr<CallBase> mainCall = GetOneCallObject(mainCallId);
622     if (mainCall == nullptr) {
623         TELEPHONY_LOGE("GetOneCallObject failed, mainCallId:%{public}d", mainCallId);
624         return TELEPHONY_ERR_ARGUMENT_INVALID;
625     }
626     if (mainCall->GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) {
627         TELEPHONY_LOGE("mainCall state should be active ");
628         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
629     }
630     if (!CallObjectManager::IsCallExist(mainCall->GetCallType(), TelCallState::CALL_STATUS_HOLDING)) {
631         TELEPHONY_LOGE("callType:%{public}d,callState:CALL_STATUS_HOLDING is not exist!", mainCall->GetCallType());
632         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
633     }
634     int32_t ret = mainCall->CanCombineConference();
635     if (ret != TELEPHONY_SUCCESS) {
636         TELEPHONY_LOGE("CanCombineConference failed");
637         return ret;
638     }
639     if (CallRequestHandlerPtr_ == nullptr) {
640         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
641         return TELEPHONY_ERR_LOCAL_PTR_NULL;
642     }
643     ret = CallRequestHandlerPtr_->CombineConference(mainCallId);
644     if (ret != TELEPHONY_SUCCESS) {
645         TELEPHONY_LOGE("CombineConference failed!");
646     }
647     return ret;
648 }
649 
SeparateConference(int32_t callId)650 int32_t CallControlManager::SeparateConference(int32_t callId)
651 {
652     sptr<CallBase> call = GetOneCallObject(callId);
653     if (call == nullptr) {
654         TELEPHONY_LOGE("GetOneCallObject failed, callId:%{public}d", callId);
655         return TELEPHONY_ERR_ARGUMENT_INVALID;
656     }
657     int32_t ret = call->CanSeparateConference();
658     if (ret != TELEPHONY_SUCCESS) {
659         TELEPHONY_LOGE("CanSeparateConference failed");
660         return ret;
661     }
662     if (CallRequestHandlerPtr_ == nullptr) {
663         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
664         return TELEPHONY_ERR_LOCAL_PTR_NULL;
665     }
666     ret = CallRequestHandlerPtr_->SeparateConference(callId);
667     if (ret != TELEPHONY_SUCCESS) {
668         TELEPHONY_LOGE("SeparateConference failed!");
669         return ret;
670     }
671     return TELEPHONY_SUCCESS;
672 }
673 
KickOutFromConference(int32_t callId)674 int32_t CallControlManager::KickOutFromConference(int32_t callId)
675 {
676     sptr<CallBase> call = GetOneCallObject(callId);
677     if (call == nullptr) {
678         TELEPHONY_LOGE("GetOneCallObject failed, callId:%{public}d", callId);
679         return TELEPHONY_ERR_ARGUMENT_INVALID;
680     }
681     int32_t ret = call->CanKickOutFromConference();
682     if (ret != TELEPHONY_SUCCESS) {
683         TELEPHONY_LOGE("CanKickOutFromConference failed");
684         return ret;
685     }
686     if (CallRequestHandlerPtr_ == nullptr) {
687         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
688         return TELEPHONY_ERR_LOCAL_PTR_NULL;
689     }
690     ret = CallRequestHandlerPtr_->KickOutFromConference(callId);
691     if (ret != TELEPHONY_SUCCESS) {
692         TELEPHONY_LOGE("KickOutFromConference failed!");
693         return ret;
694     }
695     return TELEPHONY_SUCCESS;
696 }
697 
GetMainCallId(int32_t callId,int32_t & mainCallId)698 int32_t CallControlManager::GetMainCallId(int32_t callId, int32_t &mainCallId)
699 {
700     sptr<CallBase> call = GetOneCallObject(callId);
701     if (call == nullptr) {
702         TELEPHONY_LOGE("GetMainCallId failed! callId:%{public}d", callId);
703         return TELEPHONY_ERR_ARGUMENT_INVALID;
704     }
705     return call->GetMainCallId(mainCallId);
706 }
707 
GetSubCallIdList(int32_t callId,std::vector<std::u16string> & callIdList)708 int32_t CallControlManager::GetSubCallIdList(int32_t callId, std::vector<std::u16string> &callIdList)
709 {
710     sptr<CallBase> call = GetOneCallObject(callId);
711     if (call == nullptr) {
712         TELEPHONY_LOGE("GetSubCallIdList failed! callId:%{public}d", callId);
713         return TELEPHONY_ERR_ARGUMENT_INVALID;
714     }
715     return call->GetSubCallIdList(callIdList);
716 }
717 
GetCallIdListForConference(int32_t callId,std::vector<std::u16string> & callIdList)718 int32_t CallControlManager::GetCallIdListForConference(int32_t callId, std::vector<std::u16string> &callIdList)
719 {
720     sptr<CallBase> call = GetOneCallObject(callId);
721     if (call == nullptr) {
722         TELEPHONY_LOGE("GetCallIdListForConference failed! callId:%{public}d", callId);
723         return TELEPHONY_ERR_ARGUMENT_INVALID;
724     }
725     return call->GetCallIdListForConference(callIdList);
726 }
727 
GetImsConfig(int32_t slotId,ImsConfigItem item)728 int32_t CallControlManager::GetImsConfig(int32_t slotId, ImsConfigItem item)
729 {
730     int32_t ret = CallPolicy::GetImsConfigPolicy(slotId);
731     if (ret != TELEPHONY_SUCCESS) {
732         TELEPHONY_LOGE("GetImsConfig failed!");
733         return ret;
734     }
735     if (callSettingManagerPtr_ != nullptr) {
736         return callSettingManagerPtr_->GetImsConfig(slotId, item);
737     } else {
738         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
739         return TELEPHONY_ERR_LOCAL_PTR_NULL;
740     }
741 }
742 
SetImsConfig(int32_t slotId,ImsConfigItem item,std::u16string & value)743 int32_t CallControlManager::SetImsConfig(int32_t slotId, ImsConfigItem item, std::u16string &value)
744 {
745     int32_t ret = CallPolicy::SetImsConfigPolicy(slotId);
746     if (ret != TELEPHONY_SUCCESS) {
747         TELEPHONY_LOGE("SetImsConfig failed!");
748         return ret;
749     }
750     if (callSettingManagerPtr_ != nullptr) {
751         return callSettingManagerPtr_->SetImsConfig(slotId, item, value);
752     } else {
753         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
754         return TELEPHONY_ERR_LOCAL_PTR_NULL;
755     }
756 }
757 
GetImsFeatureValue(int32_t slotId,FeatureType type)758 int32_t CallControlManager::GetImsFeatureValue(int32_t slotId, FeatureType type)
759 {
760     int32_t ret = CallPolicy::GetImsFeatureValuePolicy(slotId);
761     if (ret != TELEPHONY_SUCCESS) {
762         TELEPHONY_LOGE("GetImsFeatureValue failed!");
763         return ret;
764     }
765     if (callSettingManagerPtr_ != nullptr) {
766         return callSettingManagerPtr_->GetImsFeatureValue(slotId, type);
767     } else {
768         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
769         return TELEPHONY_ERR_LOCAL_PTR_NULL;
770     }
771 }
772 
SetImsFeatureValue(int32_t slotId,FeatureType type,int32_t value)773 int32_t CallControlManager::SetImsFeatureValue(int32_t slotId, FeatureType type, int32_t value)
774 {
775     int32_t ret = CallPolicy::SetImsFeatureValuePolicy(slotId);
776     if (ret != TELEPHONY_SUCCESS) {
777         TELEPHONY_LOGE("SetImsFeatureValue failed!");
778         return ret;
779     }
780     if (callSettingManagerPtr_ != nullptr) {
781         return callSettingManagerPtr_->SetImsFeatureValue(slotId, type, value);
782     } else {
783         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
784         return TELEPHONY_ERR_LOCAL_PTR_NULL;
785     }
786 }
787 
EnableImsSwitch(int32_t slotId)788 int32_t CallControlManager::EnableImsSwitch(int32_t slotId)
789 {
790     int32_t ret = CallPolicy::EnableVoLtePolicy(slotId);
791     if (ret != TELEPHONY_SUCCESS) {
792         TELEPHONY_LOGE("EnableImsSwitch failed!");
793         return ret;
794     }
795     if (callSettingManagerPtr_ != nullptr) {
796         return callSettingManagerPtr_->EnableImsSwitch(slotId);
797     } else {
798         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
799         return TELEPHONY_ERR_LOCAL_PTR_NULL;
800     }
801 }
802 
DisableImsSwitch(int32_t slotId)803 int32_t CallControlManager::DisableImsSwitch(int32_t slotId)
804 {
805     int32_t ret = CallPolicy::DisableVoLtePolicy(slotId);
806     if (ret != TELEPHONY_SUCCESS) {
807         TELEPHONY_LOGE("DisableImsSwitch failed!");
808         return ret;
809     }
810     if (callSettingManagerPtr_ != nullptr) {
811         return callSettingManagerPtr_->DisableImsSwitch(slotId);
812     } else {
813         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
814         return TELEPHONY_ERR_LOCAL_PTR_NULL;
815     }
816 }
817 
IsImsSwitchEnabled(int32_t slotId,bool & enabled)818 int32_t CallControlManager::IsImsSwitchEnabled(int32_t slotId, bool &enabled)
819 {
820     int32_t ret = CallPolicy::IsVoLteEnabledPolicy(slotId);
821     if (ret != TELEPHONY_SUCCESS) {
822         TELEPHONY_LOGE("IsImsSwitchEnabled failed!");
823         return ret;
824     }
825     if (callSettingManagerPtr_ != nullptr) {
826         return callSettingManagerPtr_->IsImsSwitchEnabled(slotId, enabled);
827     } else {
828         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
829         return TELEPHONY_ERR_LOCAL_PTR_NULL;
830     }
831 }
832 
SetVoNRState(int32_t slotId,int32_t state)833 int32_t CallControlManager::SetVoNRState(int32_t slotId, int32_t state)
834 {
835     int32_t ret = CallPolicy::VoNRStatePolicy(slotId, state);
836     if (ret != TELEPHONY_SUCCESS) {
837         TELEPHONY_LOGE("SetVoNRState failed!");
838         return ret;
839     }
840     if (callSettingManagerPtr_ != nullptr) {
841         return callSettingManagerPtr_->SetVoNRState(slotId, state);
842     } else {
843         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
844         return TELEPHONY_ERR_LOCAL_PTR_NULL;
845     }
846 }
847 
GetVoNRState(int32_t slotId,int32_t & state)848 int32_t CallControlManager::GetVoNRState(int32_t slotId, int32_t &state)
849 {
850     int32_t ret = CallPolicy::IsValidSlotId(slotId);
851     if (ret != TELEPHONY_SUCCESS) {
852         TELEPHONY_LOGE("SetVoNRState failed!");
853         return ret;
854     }
855     if (callSettingManagerPtr_ != nullptr) {
856         ret = callSettingManagerPtr_->GetVoNRState(slotId, state);
857         if (ret == TELEPHONY_SUCCESS) {
858             ret = CallPolicy::VoNRStatePolicy(slotId, state);
859         }
860         return ret;
861     } else {
862         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
863         return TELEPHONY_ERR_LOCAL_PTR_NULL;
864     }
865 }
866 
UpdateImsCallMode(int32_t callId,ImsCallMode mode)867 int32_t CallControlManager::UpdateImsCallMode(int32_t callId, ImsCallMode mode)
868 {
869     int32_t ret = TELEPHONY_ERR_FAIL;
870     ret = UpdateCallMediaModePolicy(callId, mode);
871     if (ret != TELEPHONY_SUCCESS) {
872         TELEPHONY_LOGE("check prerequisites failed !");
873         return ret;
874     }
875     if (CallRequestHandlerPtr_ == nullptr) {
876         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
877         return TELEPHONY_ERR_LOCAL_PTR_NULL;
878     }
879     ret = CallRequestHandlerPtr_->UpdateImsCallMode(callId, mode);
880     if (ret != TELEPHONY_SUCCESS) {
881         TELEPHONY_LOGE("UpdateImsCallMode failed!");
882         return ret;
883     }
884     return TELEPHONY_SUCCESS;
885 }
886 
StartRtt(int32_t callId,std::u16string & msg)887 int32_t CallControlManager::StartRtt(int32_t callId, std::u16string &msg)
888 {
889     int32_t ret = CallPolicy::StartRttPolicy(callId);
890     if (ret != TELEPHONY_SUCCESS) {
891         TELEPHONY_LOGE("NO IMS call,can not StartRtt!");
892         return ret;
893     }
894     if (CallRequestHandlerPtr_ == nullptr) {
895         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
896         return TELEPHONY_ERR_LOCAL_PTR_NULL;
897     }
898     ret = CallRequestHandlerPtr_->StartRtt(callId, msg);
899     if (ret != TELEPHONY_SUCCESS) {
900         TELEPHONY_LOGE("StartRtt failed!");
901         return ret;
902     }
903     return TELEPHONY_SUCCESS;
904 }
905 
StopRtt(int32_t callId)906 int32_t CallControlManager::StopRtt(int32_t callId)
907 {
908     int32_t ret = CallPolicy::StopRttPolicy(callId);
909     if (ret != TELEPHONY_SUCCESS) {
910         TELEPHONY_LOGE("NO IMS call,no need StopRtt!");
911         return ret;
912     }
913     if (CallRequestHandlerPtr_ == nullptr) {
914         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
915         return TELEPHONY_ERR_LOCAL_PTR_NULL;
916     }
917     ret = CallRequestHandlerPtr_->StopRtt(callId);
918     if (ret != TELEPHONY_SUCCESS) {
919         TELEPHONY_LOGE("StopRtt failed!");
920         return ret;
921     }
922     return TELEPHONY_SUCCESS;
923 }
924 
JoinConference(int32_t callId,std::vector<std::u16string> & numberList)925 int32_t CallControlManager::JoinConference(int32_t callId, std::vector<std::u16string> &numberList)
926 {
927     if (CallRequestHandlerPtr_ == nullptr) {
928         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
929         return TELEPHONY_ERR_LOCAL_PTR_NULL;
930     }
931     std::vector<std::string> phoneNumberList(numberList.size());
932     for (size_t index = 0; index < numberList.size(); ++index) {
933         phoneNumberList[index] = Str16ToStr8(numberList[index]);
934     }
935     int32_t ret = CallPolicy::InviteToConferencePolicy(callId, phoneNumberList);
936     if (ret != TELEPHONY_SUCCESS) {
937         TELEPHONY_LOGE("check InviteToConference Policy failed!");
938         return ret;
939     }
940     ret = CallRequestHandlerPtr_->JoinConference(callId, phoneNumberList);
941     if (ret != TELEPHONY_SUCCESS) {
942         TELEPHONY_LOGE("JoinConference failed!");
943         return ret;
944     }
945     return TELEPHONY_SUCCESS;
946 }
947 
SetMuted(bool isMute)948 int32_t CallControlManager::SetMuted(bool isMute)
949 {
950     sptr<CallBase> call = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE);
951     if (call == nullptr) {
952         return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
953     }
954 
955     if (call->GetCallType() == CallType::TYPE_IMS
956         || call->GetCallType() == CallType::TYPE_CS) {
957         TELEPHONY_LOGI("SetMute by ims or cs");
958         call->SetMute(isMute, call->GetSlotId());
959     }
960 
961     return DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(isMute);
962 }
963 
MuteRinger()964 int32_t CallControlManager::MuteRinger()
965 {
966     return DelayedSingleton<AudioControlManager>::GetInstance()->MuteRinger();
967 }
968 
SetAudioDevice(const AudioDevice & audioDevice)969 int32_t CallControlManager::SetAudioDevice(const AudioDevice &audioDevice)
970 {
971     return DelayedSingleton<AudioControlManager>::GetInstance()->SetAudioDevice(audioDevice);
972 }
973 
ControlCamera(std::u16string cameraId,int32_t callingUid,int32_t callingPid)974 int32_t CallControlManager::ControlCamera(std::u16string cameraId, int32_t callingUid, int32_t callingPid)
975 {
976     return DelayedSingleton<VideoControlManager>::GetInstance()->ControlCamera(cameraId, callingUid, callingPid);
977 }
978 
SetPreviewWindow(VideoWindow & window)979 int32_t CallControlManager::SetPreviewWindow(VideoWindow &window)
980 {
981     return DelayedSingleton<VideoControlManager>::GetInstance()->SetPreviewWindow(window);
982 }
983 
SetDisplayWindow(VideoWindow & window)984 int32_t CallControlManager::SetDisplayWindow(VideoWindow &window)
985 {
986     return DelayedSingleton<VideoControlManager>::GetInstance()->SetDisplayWindow(window);
987 }
988 
SetCameraZoom(float zoomRatio)989 int32_t CallControlManager::SetCameraZoom(float zoomRatio)
990 {
991     return DelayedSingleton<VideoControlManager>::GetInstance()->SetCameraZoom(zoomRatio);
992 }
993 
SetPausePicture(std::u16string path)994 int32_t CallControlManager::SetPausePicture(std::u16string path)
995 {
996     return DelayedSingleton<VideoControlManager>::GetInstance()->SetPausePicture(path);
997 }
998 
SetDeviceDirection(int32_t rotation)999 int32_t CallControlManager::SetDeviceDirection(int32_t rotation)
1000 {
1001     return DelayedSingleton<VideoControlManager>::GetInstance()->SetDeviceDirection(rotation);
1002 }
1003 
IsEmergencyPhoneNumber(std::u16string & number,int32_t slotId,bool & enabled)1004 int32_t CallControlManager::IsEmergencyPhoneNumber(std::u16string &number, int32_t slotId, bool &enabled)
1005 {
1006     if (IsValidSlotId(slotId)) {
1007         return CALL_ERR_INVALID_SLOT_ID;
1008     }
1009     return DelayedSingleton<CallNumberUtils>::GetInstance()->CheckNumberIsEmergency(
1010         Str16ToStr8(number), slotId, enabled);
1011 }
1012 
FormatPhoneNumber(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)1013 int32_t CallControlManager::FormatPhoneNumber(
1014     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
1015 {
1016     std::string tmpStr("");
1017     int32_t ret = DelayedSingleton<CallNumberUtils>::GetInstance()->FormatPhoneNumber(
1018         Str16ToStr8(number), Str16ToStr8(countryCode), tmpStr);
1019     formatNumber = Str8ToStr16(tmpStr);
1020     return ret;
1021 }
1022 
FormatPhoneNumberToE164(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)1023 int32_t CallControlManager::FormatPhoneNumberToE164(
1024     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
1025 {
1026     std::string tmpStr("");
1027     int32_t ret = DelayedSingleton<CallNumberUtils>::GetInstance()->FormatPhoneNumberToE164(
1028         Str16ToStr8(number), Str16ToStr8(countryCode), tmpStr);
1029     formatNumber = Str8ToStr16(tmpStr);
1030     return ret;
1031 }
1032 
CloseUnFinishedUssd(int32_t slotId)1033 int32_t CallControlManager::CloseUnFinishedUssd(int32_t slotId)
1034 {
1035     int32_t ret = CallPolicy::CloseUnFinishedUssdPolicy(slotId);
1036     if (ret != TELEPHONY_SUCCESS) {
1037         TELEPHONY_LOGE("CloseUnFinishedUssd failed!");
1038         return ret;
1039     }
1040     if (callSettingManagerPtr_ != nullptr) {
1041         return callSettingManagerPtr_->CloseUnFinishedUssd(slotId);
1042     } else {
1043         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1044         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1045     }
1046 }
1047 
GetDialParaInfo(DialParaInfo & info)1048 void CallControlManager::GetDialParaInfo(DialParaInfo &info)
1049 {
1050     std::lock_guard<std::mutex> lock(mutex_);
1051     info = dialSrcInfo_;
1052 }
1053 
GetDialParaInfo(DialParaInfo & info,AppExecFwk::PacMap & extras)1054 void CallControlManager::GetDialParaInfo(DialParaInfo &info, AppExecFwk::PacMap &extras)
1055 {
1056     std::lock_guard<std::mutex> lock(mutex_);
1057     info = dialSrcInfo_;
1058     extras = extras_;
1059 }
1060 
RemoveMissedIncomingCallNotification()1061 int32_t CallControlManager::RemoveMissedIncomingCallNotification()
1062 {
1063     int32_t ret = DelayedSingleton<CallRecordsManager>::GetInstance()->RemoveMissedIncomingCallNotification();
1064     if (ret != TELEPHONY_SUCCESS) {
1065         TELEPHONY_LOGE("RemoveMissedIncomingCallNotification failed!");
1066         return ret;
1067     }
1068     return TELEPHONY_SUCCESS;
1069 }
1070 
CallStateObserve()1071 void CallControlManager::CallStateObserve()
1072 {
1073     if (callStateListenerPtr_ == nullptr) {
1074         TELEPHONY_LOGE("callStateListenerPtr_ is null");
1075         return;
1076     }
1077     std::shared_ptr<RejectCallSms> hangUpSmsPtr = std::make_shared<RejectCallSms>();
1078     if (hangUpSmsPtr == nullptr) {
1079         TELEPHONY_LOGE("hangUpSmsPtr is null");
1080         return;
1081     }
1082     std::shared_ptr<CallStateReportProxy> callStateReportPtr = std::make_shared<CallStateReportProxy>();
1083     if (callStateReportPtr == nullptr) {
1084         TELEPHONY_LOGE("CallStateReportProxy is nullptr!");
1085         return;
1086     }
1087     callStateListenerPtr_->AddOneObserver(DelayedSingleton<CallAbilityReportProxy>::GetInstance());
1088     callStateListenerPtr_->AddOneObserver(callStateReportPtr);
1089     callStateListenerPtr_->AddOneObserver(DelayedSingleton<AudioControlManager>::GetInstance());
1090     callStateListenerPtr_->AddOneObserver(hangUpSmsPtr);
1091     callStateListenerPtr_->AddOneObserver(missedCallNotification_);
1092     callStateListenerPtr_->AddOneObserver(incomingCallWakeup_);
1093     callStateListenerPtr_->AddOneObserver(DelayedSingleton<CallRecordsManager>::GetInstance());
1094 }
1095 
NumberLegalityCheck(std::string & number)1096 int32_t CallControlManager::NumberLegalityCheck(std::string &number)
1097 {
1098     if (number.empty()) {
1099         TELEPHONY_LOGE("phone number is NULL!");
1100         return CALL_ERR_PHONE_NUMBER_EMPTY;
1101     }
1102     if (number.length() > kMaxNumberLen) {
1103         TELEPHONY_LOGE(
1104             "the number length exceeds limit,len:%{public}zu,maxLen:%{public}d", number.length(), kMaxNumberLen);
1105         return CALL_ERR_NUMBER_OUT_OF_RANGE;
1106     }
1107     return TELEPHONY_SUCCESS;
1108 }
1109 
SystemAbilityListener(std::shared_ptr<CallBroadcastSubscriber> subscriberPtr)1110 CallControlManager::SystemAbilityListener::SystemAbilityListener(std::shared_ptr<CallBroadcastSubscriber> subscriberPtr)
1111     : subscriberPtr_(subscriberPtr)
1112 {}
1113 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1114 void CallControlManager::SystemAbilityListener::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
1115 {
1116     if (systemAbilityId != COMMON_EVENT_SERVICE_ID) {
1117         TELEPHONY_LOGE("systemAbilityId is not COMMON_EVENT_SERVICE_ID");
1118         return;
1119     }
1120 
1121     if (subscriberPtr_ == nullptr) {
1122         TELEPHONY_LOGE("CallControlManager::OnAddSystemAbility subscriberPtr is nullptr");
1123         return;
1124     }
1125 
1126     bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberPtr_);
1127     TELEPHONY_LOGI("CallControlManager::OnAddSystemAbility subscribeResult = %{public}d", subscribeResult);
1128 }
1129 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1130 void CallControlManager::SystemAbilityListener::OnRemoveSystemAbility(
1131     int32_t systemAbilityId, const std::string &deviceId)
1132 {
1133     if (systemAbilityId != COMMON_EVENT_SERVICE_ID) {
1134         TELEPHONY_LOGE("systemAbilityId is not COMMON_EVENT_SERVICE_ID");
1135         return;
1136     }
1137 
1138     if (subscriberPtr_ == nullptr) {
1139         TELEPHONY_LOGE("CallControlManager::OnRemoveSystemAbility subscriberPtr is nullptr");
1140         return;
1141     }
1142 
1143     bool subscribeResult = EventFwk::CommonEventManager::UnSubscribeCommonEvent(subscriberPtr_);
1144     TELEPHONY_LOGI("CallControlManager::OnRemoveSystemAbility subscribeResult = %{public}d", subscribeResult);
1145 }
1146 
BroadcastSubscriber()1147 int32_t CallControlManager::BroadcastSubscriber()
1148 {
1149     EventFwk::MatchingSkills matchingSkills;
1150     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED);
1151     EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
1152     subscriberInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1153     std::shared_ptr<CallBroadcastSubscriber> subscriberPtr = std::make_shared<CallBroadcastSubscriber>(subscriberInfo);
1154     if (subscriberPtr == nullptr) {
1155         TELEPHONY_LOGE("CallControlManager::BroadcastSubscriber subscriberPtr is nullptr");
1156         return TELEPHONY_ERROR;
1157     }
1158     // if SubscribeCommonEvent fail, register statusChangeListener to SubscribeCommonEvent again
1159     auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1160     if (samgrProxy == nullptr) {
1161         TELEPHONY_LOGE("samgrProxy is nullptr");
1162         return TELEPHONY_ERROR;
1163     }
1164 
1165     statusChangeListener_ = new (std::nothrow) SystemAbilityListener(subscriberPtr);
1166     if (statusChangeListener_ == nullptr) {
1167         TELEPHONY_LOGE("statusChangeListener_ is nullptr");
1168         return TELEPHONY_ERROR;
1169     }
1170 
1171     int32_t ret = samgrProxy->SubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, statusChangeListener_);
1172     TELEPHONY_LOGI("CallControlManager::BroadcastSubscriber ret: %{public}d", ret);
1173     return TELEPHONY_SUCCESS;
1174 }
1175 
1176 #ifdef ABILITY_MEDIA_SUPPORT
onButtonDealing(HeadsetButtonService::ButtonEvent type)1177 bool CallControlManager::onButtonDealing(HeadsetButtonService::ButtonEvent type)
1178 {
1179     bool isRingState = false;
1180     sptr<CallBase> call = nullptr;
1181 
1182     if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING) != nullptr) {
1183         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
1184         isRingState = true;
1185     } else if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING) != nullptr) {
1186         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING);
1187     } else if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE) != nullptr) {
1188         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE);
1189     } else if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD) != nullptr) {
1190         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD);
1191     } else {
1192         return false;
1193     }
1194 
1195     switch (type) {
1196         case HeadsetButtonService::SHORT_PRESS_EVENT:
1197             if (isRingState) {
1198                 call->HangUpCall();
1199             } else {
1200                 call->AnswerCall(0);
1201             }
1202             break;
1203         case HeadsetButtonService::LONG_PRESS_EVENT:
1204             if (isRingState) {
1205                 std::string str = "";
1206                 call->RejectCall(false, str);
1207             } else {
1208                 DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(true);
1209             }
1210             break;
1211         default:
1212             return false;
1213     }
1214     return true;
1215 }
1216 #endif
1217 } // namespace Telephony
1218 } // namespace OHOS
1219