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