• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2024 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 #include "cpp/task_ext.h"
18 #include <cstdint>
19 #include <securec.h>
20 #include "csignal"
21 #include <string_ex.h>
22 
23 #include "app_mgr_interface.h"
24 #include "audio_control_manager.h"
25 #include "bluetooth_call_manager.h"
26 #include "call_ability_report_proxy.h"
27 #include "call_connect_ability.h"
28 #include "call_dialog.h"
29 #include "call_manager_errors.h"
30 #include "call_manager_hisysevent.h"
31 #include "call_number_utils.h"
32 #include "call_records_manager.h"
33 #include "call_request_event_handler_helper.h"
34 #include "call_state_report_proxy.h"
35 #include "cellular_call_connection.h"
36 #include "common_type.h"
37 #include "ims_call.h"
38 #include "iservice_registry.h"
39 #include "reject_call_sms.h"
40 #include "report_call_info_handler.h"
41 #include "satellite_call_control.h"
42 #include "telephony_log_wrapper.h"
43 #include "video_control_manager.h"
44 #include "audio_device_manager.h"
45 #include "distributed_call_manager.h"
46 #include "call_superprivacy_control_manager.h"
47 #include "distributed_communication_manager.h"
48 #include "call_voice_assistant_manager.h"
49 #include "interoperable_communication_manager.h"
50 
51 namespace OHOS {
52 namespace Telephony {
53 bool CallControlManager::alarmSeted = false;
54 constexpr int32_t CRS_TYPE = 2;
55 const uint64_t DISCONNECT_DELAY_TIME = 1000000;
56 static const int32_t SATCOMM_UID = 1096;
57 using namespace OHOS::EventFwk;
CallControlManager()58 CallControlManager::CallControlManager()
59     : callStateListenerPtr_(nullptr), CallRequestHandlerPtr_(nullptr), incomingCallWakeup_(nullptr),
60       missedCallNotification_(nullptr), callSettingManagerPtr_(nullptr)
61 {
62     dialSrcInfo_.callId = ERR_ID;
63     dialSrcInfo_.number = "";
64     extras_.Clear();
65     dialSrcInfo_.isDialing = false;
66 }
67 
~CallControlManager()68 CallControlManager::~CallControlManager()
69 {}
70 
Init()71 bool CallControlManager::Init()
72 {
73     callStateListenerPtr_ = std::make_unique<CallStateListener>();
74     if (callStateListenerPtr_ == nullptr) {
75         TELEPHONY_LOGE("callStateListenerPtr_ is null");
76         return false;
77     }
78     CallRequestHandlerPtr_ = std::make_unique<CallRequestHandler>();
79     if (CallRequestHandlerPtr_ == nullptr) {
80         TELEPHONY_LOGE("CallRequestHandlerPtr_ is null");
81         return false;
82     }
83     CallRequestHandlerPtr_->Init();
84     incomingCallWakeup_ = std::make_shared<IncomingCallWakeup>();
85     if (incomingCallWakeup_ == nullptr) {
86         TELEPHONY_LOGE("incomingCallWakeup_ is null");
87         return false;
88     }
89     missedCallNotification_ = std::make_shared<MissedCallNotification>();
90     if (missedCallNotification_ == nullptr) {
91         TELEPHONY_LOGE("missedCallNotification_ is null");
92         return false;
93     }
94     callSettingManagerPtr_ = std::make_unique<CallSettingManager>();
95     if (callSettingManagerPtr_ == nullptr) {
96         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
97         return false;
98     }
99     if (SubscriberSaStateChange() != TELEPHONY_SUCCESS) {
100         TELEPHONY_LOGE("SubscriberSaStateChange failed!");
101     }
102     DelayedSingleton<AudioControlManager>::GetInstance()->Init();
103     CallStateObserve();
104     DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->RegisterSuperPrivacyMode();
105     DelayedSingleton<CallStateReportProxy>::GetInstance()->UpdateCallStateForVoIPOrRestart();
106     return true;
107 }
108 
UnInit()109 void CallControlManager::UnInit()
110 {
111     if (statusChangeListener_ != nullptr) {
112         auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
113         if (samgrProxy != nullptr) {
114             samgrProxy->UnSubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, statusChangeListener_);
115             statusChangeListener_ = nullptr;
116         }
117     }
118     {
119         std::lock_guard<std::mutex> lock(voipMutex_);
120         if (appMgrProxy != nullptr && appStateObserver != nullptr) {
121             appMgrProxy->UnregisterApplicationStateObserver(appStateObserver);
122             appMgrProxy = nullptr;
123             appStateObserver = nullptr;
124         }
125     }
126     DelayedSingleton<AudioControlManager>::GetInstance()->UnInit();
127 }
128 
ReportPhoneUEInSuperPrivacy(const std::string & eventName)129 void CallControlManager::ReportPhoneUEInSuperPrivacy(const std::string &eventName)
130 {
131     if (DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->GetCurrentIsSuperPrivacyMode()) {
132         CallManagerHisysevent::HiWriteBehaviorEventPhoneUE(
133             eventName, PNAMEID_KEY, KEY_CALL_MANAGER, PVERSIONID_KEY, "");
134     }
135 }
136 
DialCall(std::u16string & number,AppExecFwk::PacMap & extras)137 int32_t CallControlManager::DialCall(std::u16string &number, AppExecFwk::PacMap &extras)
138 {
139     sptr<CallBase> callObjectPtr = nullptr;
140     std::string accountNumber(Str16ToStr8(number));
141     int32_t ret = NumberLegalityCheck(accountNumber);
142     if (ret != TELEPHONY_SUCCESS) {
143         TELEPHONY_LOGE("Invalid number!");
144         return ret;
145     }
146     bool isEcc = false;
147     std::string newPhoneNum =
148         DelayedSingleton<CallNumberUtils>::GetInstance()->RemoveSeparatorsPhoneNumber(accountNumber);
149     DelayedSingleton<CallNumberUtils>::GetInstance()->CheckNumberIsEmergency(
150         newPhoneNum, extras.GetIntValue("accountId"), isEcc);
151     if (isEcc) {
152         extras.PutIntValue("dialScene", (int32_t)DialScene::CALL_EMERGENCY);
153     }
154     ret = DelayedSingleton<SatelliteCallControl>::GetInstance()->IsSatelliteSwitchEnable();
155     if (ret == TELEPHONY_SUCCESS) {
156         ret = DelayedSingleton<SatelliteCallControl>::GetInstance()->IsAllowedSatelliteDialCall();
157         if (ret != TELEPHONY_SUCCESS) {
158             return ret;
159         } else {
160             extras.PutIntValue("callType", (int32_t)CallType::TYPE_SATELLITE);
161         }
162     }
163     ReportPhoneUEInSuperPrivacy(CALL_DIAL_IN_SUPER_PRIVACY);
164     int32_t dialType = extras.GetIntValue("dialType");
165     if (dialType == (int32_t)DialType::DIAL_BLUETOOTH_TYPE) {
166         extras.PutIntValue("callType", (int32_t)CallType::TYPE_BLUETOOTH);
167     }
168     ret = CanDial(number, extras, isEcc);
169     if (ret != TELEPHONY_SUCCESS) {
170         TELEPHONY_LOGE("can dial policy result:%{public}d", ret);
171         return ret;
172     }
173     SetCallTypeExtras(extras);
174     // temporarily save dial information
175     PackageDialInformation(extras, newPhoneNum, isEcc);
176     if (CallRequestHandlerPtr_ == nullptr) {
177         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
178         return TELEPHONY_ERR_LOCAL_PTR_NULL;
179     }
180     ret = CallRequestHandlerPtr_->DialCall();
181     if (ret != TELEPHONY_SUCCESS) {
182         TELEPHONY_LOGE("DialCall failed!");
183         return ret;
184     }
185     return TELEPHONY_SUCCESS;
186 }
187 
SetCallTypeExtras(AppExecFwk::PacMap & extras)188 void CallControlManager::SetCallTypeExtras(AppExecFwk::PacMap &extras)
189 {
190     int32_t dialType = extras.GetIntValue("dialType");
191     if (dialType == (int32_t)DialType::DIAL_CARRIER_TYPE || dialType == (int32_t)DialType::DIAL_VOICE_MAIL_TYPE) {
192         if (!IsSupportVideoCall(extras)) {
193             extras.PutIntValue("videoState", (int32_t)VideoStateType::TYPE_VOICE);
194         }
195         VideoStateType videoState = (VideoStateType)extras.GetIntValue("videoState");
196         if (videoState == VideoStateType::TYPE_VIDEO) {
197             extras.PutIntValue("callType", (int32_t)CallType::TYPE_IMS);
198         }
199     }
200 }
201 
CanDial(std::u16string & number,AppExecFwk::PacMap & extras,bool isEcc)202 int32_t CallControlManager::CanDial(std::u16string &number, AppExecFwk::PacMap &extras, bool isEcc)
203 {
204     int32_t ret = DialPolicy(number, extras, isEcc);
205     if (ret != TELEPHONY_SUCCESS) {
206         TELEPHONY_LOGE("dial policy result:%{public}d", ret);
207         return ret;
208     }
209     ret = CanDialMulityCall(extras, isEcc);
210     if (ret != TELEPHONY_SUCCESS) {
211         TELEPHONY_LOGE("dial policy result:%{public}d", ret);
212         return ret;
213     }
214     return TELEPHONY_SUCCESS;
215 }
216 
PackageDialInformation(AppExecFwk::PacMap & extras,std::string accountNumber,bool isEcc)217 void CallControlManager::PackageDialInformation(AppExecFwk::PacMap &extras, std::string accountNumber, bool isEcc)
218 {
219     std::lock_guard<std::mutex> lock(mutex_);
220     dialSrcInfo_.callId = ERR_ID;
221     dialSrcInfo_.number = accountNumber;
222     dialSrcInfo_.isDialing = true;
223     dialSrcInfo_.isEcc = isEcc;
224     dialSrcInfo_.callType = (CallType)extras.GetIntValue("callType");
225     dialSrcInfo_.accountId = extras.GetIntValue("accountId");
226     dialSrcInfo_.dialType = (DialType)extras.GetIntValue("dialType");
227     dialSrcInfo_.videoState = (VideoStateType)extras.GetIntValue("videoState");
228     dialSrcInfo_.originalCallType = (int32_t)extras.GetIntValue("videoState");
229     dialSrcInfo_.bundleName = extras.GetStringValue("bundleName");
230     extras_.Clear();
231     extras_ = extras;
232 }
233 
AnswerCall(int32_t callId,int32_t videoState)234 int32_t CallControlManager::AnswerCall(int32_t callId, int32_t videoState)
235 {
236 #ifdef NOT_SUPPORT_MULTICALL
237     if (HangUpFirstCall(callId)) {
238         return TELEPHONY_SUCCESS;
239     }
240 #endif
241     sptr<CallBase> call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
242     if (call == nullptr) {
243         TELEPHONY_LOGE("call is nullptr");
244         CallManagerHisysevent::WriteAnswerCallFaultEvent(
245             INVALID_PARAMETER, callId, videoState, TELEPHONY_ERR_LOCAL_PTR_NULL, "call is nullptr");
246         return TELEPHONY_ERR_LOCAL_PTR_NULL;
247     }
248     if (callId == INVALID_CALLID) {
249         callId = call->GetCallID();
250     }
251     call = GetOneCallObject(callId);
252     if (call == nullptr) {
253         TELEPHONY_LOGE("call is nullptr");
254         return TELEPHONY_ERR_LOCAL_PTR_NULL;
255     }
256     if (call->GetCrsType() == CRS_TYPE && static_cast<VideoStateType>(videoState) != VideoStateType::TYPE_VIDEO) {
257         DelayedSingleton<AudioProxy>::GetInstance()->SetSpeakerDevActive(false);
258     }
259     ReportPhoneUEInSuperPrivacy(CALL_ANSWER_IN_SUPER_PRIVACY);
260     if (CurrentIsSuperPrivacyMode(callId, videoState)) {
261         return TELEPHONY_SUCCESS;
262     }
263     call->SetAnsweredCall(true);
264     AnswerHandlerForSatelliteOrVideoCall(call, videoState);
265     TELEPHONY_LOGI("report answered state");
266     NotifyCallStateUpdated(call, TelCallState::CALL_STATUS_INCOMING, TelCallState::CALL_STATUS_ANSWERED);
267     CarrierAndVoipConflictProcess(callId, TelCallState::CALL_STATUS_ANSWERED);
268     if (VoIPCallState_ != CallStateToApp::CALL_STATE_IDLE && call->GetCallType() != CallType::TYPE_VOIP) {
269         TELEPHONY_LOGW("VoIP call is active, waiting for VoIP to disconnect");
270         AnsweredCallQueue_.hasCall = true;
271         AnsweredCallQueue_.callId = callId;
272         AnsweredCallQueue_.videoState = videoState;
273         return TELEPHONY_SUCCESS;
274     }
275     int32_t ret = AnswerCallPolicy(callId, videoState);
276     if (ret != TELEPHONY_SUCCESS) {
277         TELEPHONY_LOGE("AnswerCallPolicy failed!");
278         if (IsVoipCallExist()) {
279             sendEventToVoip(CallAbilityEventId::EVENT_ANSWER_VOIP_CALL);
280             return TELEPHONY_SUCCESS;
281         }
282         CallManagerHisysevent::WriteAnswerCallFaultEvent(
283             INVALID_PARAMETER, callId, videoState, ret, "AnswerCallPolicy failed");
284         return ret;
285     }
286     return HandlerAnswerCall(callId, videoState);
287 }
288 
HandlerAnswerCall(int32_t callId,int32_t videoState)289 int32_t CallControlManager::HandlerAnswerCall(int32_t callId, int32_t videoState)
290 {
291     if (CallRequestHandlerPtr_ == nullptr) {
292         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
293         return TELEPHONY_ERR_LOCAL_PTR_NULL;
294     }
295     int ret = CallRequestHandlerPtr_->AnswerCall(callId, videoState);
296     if (ret != TELEPHONY_SUCCESS) {
297         TELEPHONY_LOGE("AnswerCall failed!");
298         return ret;
299     }
300     return TELEPHONY_SUCCESS;
301 }
CurrentIsSuperPrivacyMode(int32_t callId,int32_t videoState)302 bool CallControlManager::CurrentIsSuperPrivacyMode(int32_t callId, int32_t videoState)
303 {
304     bool currentIsSuperPrivacyMode = DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->
305         GetCurrentIsSuperPrivacyMode();
306     TELEPHONY_LOGI("call policy answer currentIsSuperPrivacyMode:%{public}d", currentIsSuperPrivacyMode);
307     if (currentIsSuperPrivacyMode) {
308         DelayedSingleton<AudioControlManager>::GetInstance()->MuteRinger();
309         DelayedSingleton<CallDialog>::GetInstance()->DialogConnectAnswerPrivpacyModeExtension("SUPER_PRIVACY_MODE",
310             callId, videoState, true);
311         return true;
312     }
313     return false;
314 }
315 
AnswerHandlerForSatelliteOrVideoCall(sptr<CallBase> & call,int32_t videoState)316 void CallControlManager::AnswerHandlerForSatelliteOrVideoCall(sptr<CallBase> &call, int32_t videoState)
317 {
318     if (call == nullptr) {
319         TELEPHONY_LOGE("call is nullptr");
320         return;
321     }
322     if (call->GetCallType() == CallType::TYPE_IMS && videoState != static_cast<int32_t>(call->GetVideoStateType())) {
323         call->SetVideoStateType(static_cast<VideoStateType>(videoState));
324         sptr<IMSCall> imsCall = reinterpret_cast<IMSCall *>(call.GetRefPtr());
325         imsCall->InitVideoCall();
326         TELEPHONY_LOGI("videoState has changed");
327     }
328     if (call->GetCallType() == CallType::TYPE_SATELLITE) {
329         sptr<CallBase> foregroundSatelliteCall =
330             CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE);
331         if (foregroundSatelliteCall != nullptr) {
332             CallRequestHandlerPtr_->HangUpCall(foregroundSatelliteCall->GetCallID());
333         }
334     }
335 }
336 
CarrierAndVoipConflictProcess(int32_t callId,TelCallState callState)337 int32_t CallControlManager::CarrierAndVoipConflictProcess(int32_t callId, TelCallState callState)
338 {
339     if (callState != TelCallState::CALL_STATUS_ANSWERED) {
340         TELEPHONY_LOGI("voip calls should be handled with only when a carrier call is answered");
341         return TELEPHONY_SUCCESS;
342     }
343     sptr<CallBase> call = GetOneCallObject(callId);
344     if (call == nullptr) {
345         TELEPHONY_LOGE("CarrierAndVoipConflictProcess, call is nullptr!");
346         return TELEPHONY_ERR_LOCAL_PTR_NULL;
347     }
348     if (call->GetCallType() == CallType::TYPE_CS ||
349         call->GetCallType() == CallType::TYPE_IMS ||
350         call->GetCallType() == CallType::TYPE_SATELLITE) {
351         std::list<int32_t> voipCallIdList;
352         int32_t ret = GetVoipCallList(voipCallIdList);
353         if (ret != TELEPHONY_SUCCESS) {
354             TELEPHONY_LOGE("GetVoipCallList failed!");
355             return ret;
356         }
357         for (auto voipCallId : voipCallIdList) {
358             sptr<CallBase> voipCall = GetOneCallObject(voipCallId);
359             TelCallState voipCallState = voipCall->GetTelCallState();
360             if (voipCallState == TelCallState::CALL_STATUS_INCOMING) {
361                 TELEPHONY_LOGI("the system is rejecting a voip call, callId = %{public}d", voipCall->GetCallID());
362                 ret = RejectCall(voipCallId, true, u"CarrierAndVoipConflictProcess");
363             } else if (voipCallState == TelCallState::CALL_STATUS_DIALING) {
364                 TELEPHONY_LOGI("the system is hanging up a voip call, callId = %{public}d", voipCall->GetCallID());
365                 ret = HangUpCall(voipCallId);
366             }
367             if (ret != TELEPHONY_SUCCESS) {
368                 TELEPHONY_LOGE("CarrierAndVoipConflictProcess failed!");
369                 return ret;
370             }
371         }
372         return TELEPHONY_SUCCESS;
373     }
374     return TELEPHONY_SUCCESS;
375 }
376 
RejectCall(int32_t callId,bool rejectWithMessage,std::u16string textMessage)377 int32_t CallControlManager::RejectCall(int32_t callId, bool rejectWithMessage, std::u16string textMessage)
378 {
379     if (CallRequestHandlerPtr_ == nullptr) {
380         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
381         return TELEPHONY_ERR_LOCAL_PTR_NULL;
382     }
383 
384     if (callId == INVALID_CALLID) {
385         sptr<CallBase> call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
386         if (call == nullptr) {
387             TELEPHONY_LOGE("call is nullptr");
388             CallManagerHisysevent::WriteHangUpFaultEvent(
389                 INVALID_PARAMETER, callId, TELEPHONY_ERR_LOCAL_PTR_NULL, "Reject call is nullptr");
390             return TELEPHONY_ERR_LOCAL_PTR_NULL;
391         }
392         callId = call->GetCallID();
393     }
394 
395     int32_t ret = RejectCallPolicy(callId);
396     if (ret != TELEPHONY_SUCCESS) {
397         TELEPHONY_LOGE("RejectCallPolicy failed!");
398         if (callId >= VOIP_CALL_MINIMUM && IsVoipCallExist()) {
399             sendEventToVoip(CallAbilityEventId::EVENT_REJECT_VOIP_CALL);
400             return TELEPHONY_SUCCESS;
401         }
402         CallManagerHisysevent::WriteHangUpFaultEvent(INVALID_PARAMETER, callId, ret, "Reject RejectCallPolicy failed");
403         return ret;
404     }
405     std::string messageStr(Str16ToStr8(textMessage));
406     ret = CallRequestHandlerPtr_->RejectCall(callId, rejectWithMessage, messageStr);
407     if (ret != TELEPHONY_SUCCESS) {
408         TELEPHONY_LOGE("RejectCall failed!");
409         return ret;
410     }
411     ReportPhoneUEInSuperPrivacy(CALL_REJECT_IN_SUPER_PRIVACY);
412     return TELEPHONY_SUCCESS;
413 }
414 
HangUpCall(int32_t callId)415 int32_t CallControlManager::HangUpCall(int32_t callId)
416 {
417     if (callId == INVALID_CALLID) {
418         std::vector<CallRunningState> callRunningStateVec;
419         callRunningStateVec.push_back(CallRunningState::CALL_RUNNING_STATE_ACTIVE);
420         callRunningStateVec.push_back(CallRunningState::CALL_RUNNING_STATE_DIALING);
421         callRunningStateVec.push_back(CallRunningState::CALL_RUNNING_STATE_CONNECTING);
422         callRunningStateVec.push_back(CallRunningState::CALL_RUNNING_STATE_HOLD);
423 
424         for (auto &state : callRunningStateVec) {
425             sptr<CallBase> call = GetOneCallObject(state);
426             if (call != nullptr) {
427                 callId = call->GetCallID();
428                 break;
429             }
430         }
431 
432         if (callId == INVALID_CALLID) {
433             TELEPHONY_LOGE("callId is INVALID_CALLID!");
434             CallManagerHisysevent::WriteHangUpFaultEvent(
435                 INVALID_PARAMETER, callId, TELEPHONY_ERR_LOCAL_PTR_NULL, "HangUp callId is INVALID_CALLID");
436             return TELEPHONY_ERR_ARGUMENT_INVALID;
437         }
438     }
439 
440     if (CallRequestHandlerPtr_ == nullptr) {
441         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
442         return TELEPHONY_ERR_LOCAL_PTR_NULL;
443     }
444     int32_t ret = HangUpPolicy(callId);
445     if (ret != TELEPHONY_SUCCESS) {
446         TELEPHONY_LOGE("HangUpPolicy failed!");
447         if (callId >= VOIP_CALL_MINIMUM && IsVoipCallExist()) {
448             sendEventToVoip(CallAbilityEventId::EVENT_HANGUP_VOIP_CALL);
449             return TELEPHONY_SUCCESS;
450         }
451         CallManagerHisysevent::WriteHangUpFaultEvent(INVALID_PARAMETER, callId, ret, "HangUp HangUpPolicy failed");
452         return ret;
453     }
454     auto callRequestEventHandler = DelayedSingleton<CallRequestEventHandlerHelper>::GetInstance();
455     if (callRequestEventHandler->HasPendingMo(callId)) {
456         callRequestEventHandler->SetPendingMo(false, -1);
457         callRequestEventHandler->SetPendingHangup(true, callId);
458         TELEPHONY_LOGI("HangUpCall before dialingHandle,hangup after CLCC");
459         return TELEPHONY_SUCCESS;
460     }
461     ret = CallRequestHandlerPtr_->HangUpCall(callId);
462     if (ret != TELEPHONY_SUCCESS) {
463         TELEPHONY_LOGE("HangUpCall failed!");
464         return ret;
465     }
466     return TELEPHONY_SUCCESS;
467 }
468 
sendEventToVoip(CallAbilityEventId eventId)469 void CallControlManager::sendEventToVoip(CallAbilityEventId eventId)
470 {
471     CallEventInfo eventInfo;
472     (void)memset_s(&eventInfo, sizeof(CallEventInfo), 0, sizeof(CallEventInfo));
473     eventInfo.eventId = eventId;
474     NotifyCallEventUpdated(eventInfo);
475 }
476 
GetCallState()477 int32_t CallControlManager::GetCallState()
478 {
479     CallStateToApp callState = CallStateToApp::CALL_STATE_UNKNOWN;
480     if (!HasCellularCallExist() && (VoIPCallState_ == CallStateToApp::CALL_STATE_IDLE ||
481         VoIPCallState_ == CallStateToApp::CALL_STATE_UNKNOWN)) {
482         callState = CallStateToApp::CALL_STATE_IDLE;
483     } else {
484         callState = CallStateToApp::CALL_STATE_OFFHOOK;
485         bool hasRingingCall = false;
486         if ((HasRingingCall(hasRingingCall) == TELEPHONY_SUCCESS && hasRingingCall) ||
487             VoIPCallState_ == CallStateToApp::CALL_STATE_RINGING) {
488             callState = CallStateToApp::CALL_STATE_RINGING;
489         }
490     }
491     return static_cast<int32_t>(callState);
492 }
493 
HoldCall(int32_t callId)494 int32_t CallControlManager::HoldCall(int32_t callId)
495 {
496     int32_t ret = HoldCallPolicy(callId);
497     if (ret != TELEPHONY_SUCCESS) {
498         TELEPHONY_LOGE("HoldCall failed!");
499         return ret;
500     }
501     if (CallRequestHandlerPtr_ == nullptr) {
502         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
503         return TELEPHONY_ERR_LOCAL_PTR_NULL;
504     }
505     ret = CallRequestHandlerPtr_->HoldCall(callId);
506     if (ret != TELEPHONY_SUCCESS) {
507         TELEPHONY_LOGE("HoldCall failed!");
508         return ret;
509     }
510     return TELEPHONY_SUCCESS;
511 }
512 
UnHoldCall(const int32_t callId)513 int32_t CallControlManager::UnHoldCall(const int32_t callId)
514 {
515     int32_t ret = UnHoldCallPolicy(callId);
516     if (ret != TELEPHONY_SUCCESS) {
517         TELEPHONY_LOGE("UnHoldCall failed!");
518         return ret;
519     }
520     if (CallRequestHandlerPtr_ == nullptr) {
521         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
522         return TELEPHONY_ERR_LOCAL_PTR_NULL;
523     }
524     ret = CallRequestHandlerPtr_->UnHoldCall(callId);
525     if (ret != TELEPHONY_SUCCESS) {
526         TELEPHONY_LOGE("UnHoldCall failed!");
527         return ret;
528     }
529     return TELEPHONY_SUCCESS;
530 }
531 
532 // swap two calls state, turn active call into holding, and turn holding call into active
SwitchCall(int32_t callId)533 int32_t CallControlManager::SwitchCall(int32_t callId)
534 {
535     int32_t ret = SwitchCallPolicy(callId);
536     if (ret != TELEPHONY_SUCCESS) {
537         TELEPHONY_LOGE("SwitchCall failed!");
538         return ret;
539     }
540     if (CallRequestHandlerPtr_ == nullptr) {
541         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
542         return TELEPHONY_ERR_LOCAL_PTR_NULL;
543     }
544     ret = CallRequestHandlerPtr_->SwitchCall(callId);
545     if (ret != TELEPHONY_SUCCESS) {
546         TELEPHONY_LOGE("SwitchCall failed!");
547         return ret;
548     }
549     return TELEPHONY_SUCCESS;
550 }
551 
HasCall()552 bool CallControlManager::HasCall()
553 {
554     if (VoIPCallState_ == CallStateToApp::CALL_STATE_ANSWERED ||
555         VoIPCallState_ == CallStateToApp::CALL_STATE_OFFHOOK ||
556         VoIPCallState_ == CallStateToApp::CALL_STATE_RINGING ||
557         HasCellularCallExist()) {
558         return true;
559     }
560     return false;
561 }
562 
HasVoipCall()563 bool CallControlManager::HasVoipCall()
564 {
565     return HasVoipCallExist();
566 }
567 
IsNewCallAllowed(bool & enabled)568 int32_t CallControlManager::IsNewCallAllowed(bool &enabled)
569 {
570     return IsNewCallAllowedCreate(enabled);
571 }
572 
IsRinging(bool & enabled)573 int32_t CallControlManager::IsRinging(bool &enabled)
574 {
575     return HasRingingCall(enabled);
576 }
577 
HasEmergency(bool & enabled)578 int32_t CallControlManager::HasEmergency(bool &enabled)
579 {
580     return HasEmergencyCall(enabled);
581 }
582 
NotifyNewCallCreated(sptr<CallBase> & callObjectPtr)583 bool CallControlManager::NotifyNewCallCreated(sptr<CallBase> &callObjectPtr)
584 {
585     if (callObjectPtr == nullptr) {
586         TELEPHONY_LOGE("callObjectPtr is null!");
587         return false;
588     }
589     if (callStateListenerPtr_ != nullptr) {
590         callStateListenerPtr_->NewCallCreated(callObjectPtr);
591     }
592     return true;
593 }
594 
NotifyCallDestroyed(const DisconnectedDetails & details)595 bool CallControlManager::NotifyCallDestroyed(const DisconnectedDetails &details)
596 {
597     if (callStateListenerPtr_ != nullptr) {
598         callStateListenerPtr_->CallDestroyed(details);
599         return true;
600     }
601     return false;
602 }
603 
NotifyCallStateUpdated(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)604 bool CallControlManager::NotifyCallStateUpdated(
605     sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
606 {
607     if (callObjectPtr == nullptr) {
608         TELEPHONY_LOGE("callObjectPtr is null!");
609         return false;
610     }
611     if (callStateListenerPtr_ != nullptr) {
612         TELEPHONY_LOGI("NotifyCallStateUpdated priorState:%{public}d,nextState:%{public}d", priorState, nextState);
613         callStateListenerPtr_->CallStateUpdated(callObjectPtr, priorState, nextState);
614         if (callObjectPtr->GetCallType() == CallType::TYPE_VOIP) {
615             return true;
616         }
617         if ((priorState == TelCallState::CALL_STATUS_DIALING && nextState == TelCallState::CALL_STATUS_ALERTING) ||
618             (priorState == TelCallState::CALL_STATUS_DIALING && nextState == TelCallState::CALL_STATUS_ACTIVE) ||
619             (priorState == TelCallState::CALL_STATUS_INCOMING && nextState == TelCallState::CALL_STATUS_ACTIVE)) {
620             TELEPHONY_LOGI("call is actived, now check and switch call to distributed audio device");
621             DelayedSingleton<AudioDeviceManager>::GetInstance()->CheckAndSwitchDistributedAudioDevice();
622         } else if ((priorState == TelCallState::CALL_STATUS_ACTIVE &&
623             nextState == TelCallState::CALL_STATUS_DISCONNECTED) ||
624             (priorState == TelCallState::CALL_STATUS_DISCONNECTING &&
625             nextState == TelCallState::CALL_STATUS_DISCONNECTED)) {
626             bool hasHoldCall = false;
627             if ((HasHoldCall(hasHoldCall) == TELEPHONY_SUCCESS) && !hasHoldCall) {
628                 TELEPHONY_LOGI("call is disconnected, clear distributed call state");
629                 DelayedSingleton<AudioDeviceManager>::GetInstance()->OnActivedCallDisconnected();
630             }
631         } else if (priorState == TelCallState::CALL_STATUS_WAITING &&
632             nextState == TelCallState::CALL_STATUS_ACTIVE) {
633             if (DelayedSingleton<DistributedCallManager>::GetInstance()->IsDCallDeviceSwitchedOn()) {
634                 TELEPHONY_LOGI("answer multi-line call, need switch again.");
635                 DelayedSingleton<AudioDeviceManager>::GetInstance()->CheckAndSwitchDistributedAudioDevice();
636             }
637         }
638         return true;
639     }
640     return false;
641 }
642 
NotifyVoipCallStateUpdated(CallAttributeInfo info,TelCallState priorState,TelCallState nextState)643 bool CallControlManager::NotifyVoipCallStateUpdated(
644     CallAttributeInfo info, TelCallState priorState, TelCallState nextState)
645 {
646     if (callStateListenerPtr_ != nullptr) {
647         TELEPHONY_LOGI("NotifyVoipStateUpdated priorState:%{public}d,nextState:%{public}d", priorState, nextState);
648         callStateListenerPtr_->MeeTimeStateUpdated(info, priorState, nextState);
649         return true;
650     }
651     return false;
652 }
653 
NotifyIncomingCallAnswered(sptr<CallBase> & callObjectPtr)654 bool CallControlManager::NotifyIncomingCallAnswered(sptr<CallBase> &callObjectPtr)
655 {
656     if (callObjectPtr == nullptr) {
657         TELEPHONY_LOGE("callObjectPtr is null!");
658         return false;
659     }
660     if (callStateListenerPtr_ != nullptr) {
661         callStateListenerPtr_->IncomingCallActivated(callObjectPtr);
662         return true;
663     }
664     return false;
665 }
666 
NotifyIncomingCallRejected(sptr<CallBase> & callObjectPtr,bool isSendSms,std::string content)667 bool CallControlManager::NotifyIncomingCallRejected(
668     sptr<CallBase> &callObjectPtr, bool isSendSms, std::string content)
669 {
670     if (callObjectPtr == nullptr) {
671         TELEPHONY_LOGE("callObjectPtr is null!");
672         return false;
673     }
674     if (callStateListenerPtr_ != nullptr) {
675         callStateListenerPtr_->IncomingCallHungUp(callObjectPtr, isSendSms, content);
676         return true;
677     }
678     return false;
679 }
680 
NotifyCallEventUpdated(CallEventInfo & info)681 bool CallControlManager::NotifyCallEventUpdated(CallEventInfo &info)
682 {
683     if (callStateListenerPtr_ != nullptr) {
684         callStateListenerPtr_->CallEventUpdated(info);
685         return true;
686     }
687     return false;
688 }
689 
StartDtmf(int32_t callId,char str)690 int32_t CallControlManager::StartDtmf(int32_t callId, char str)
691 {
692     sptr<CallBase> call = GetOneCallObject(callId);
693     if (call == nullptr) {
694         return TELEPHONY_ERR_ARGUMENT_INVALID;
695     }
696     if (!call->IsAliveState()) {
697         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
698     }
699 
700     int32_t ret = call->StartDtmf(str);
701     if (ret != TELEPHONY_SUCCESS) {
702         TELEPHONY_LOGE("StartDtmf failed, return:%{public}d", ret);
703     }
704     ffrt::submit([str]() {
705         DelayedSingleton<AudioControlManager>::GetInstance()->PlayDtmfTone(str);
706     });
707     return ret;
708 }
709 
StopDtmf(int32_t callId)710 int32_t CallControlManager::StopDtmf(int32_t callId)
711 {
712     sptr<CallBase> call = GetOneCallObject(callId);
713     if (call == nullptr) {
714         return TELEPHONY_ERR_ARGUMENT_INVALID;
715     }
716     if (!call->IsAliveState()) {
717         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
718     }
719 
720     int32_t ret = call->StopDtmf();
721     if (ret != TELEPHONY_SUCCESS) {
722         TELEPHONY_LOGE("StopDtmf failed, return:%{public}d", ret);
723     }
724     DelayedSingleton<AudioControlManager>::GetInstance()->StopDtmfTone();
725     return ret;
726 }
727 
PostDialProceed(int32_t callId,bool proceed)728 int32_t CallControlManager::PostDialProceed(int32_t callId, bool proceed)
729 {
730     sptr<CallBase> call = GetOneCallObject(callId);
731     if (call == nullptr) {
732         return TELEPHONY_ERR_ARGUMENT_INVALID;
733     }
734     if (!call->IsAliveState()) {
735         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
736     }
737 
738     int32_t ret = call->PostDialProceed(proceed);
739     if (ret != TELEPHONY_SUCCESS) {
740         TELEPHONY_LOGE("PostDialProceed failed, return:%{public}d", ret);
741     }
742     return ret;
743 }
744 
GetCallWaiting(int32_t slotId)745 int32_t CallControlManager::GetCallWaiting(int32_t slotId)
746 {
747     int32_t ret = CallPolicy::GetCallWaitingPolicy(slotId);
748     if (ret != TELEPHONY_SUCCESS) {
749         TELEPHONY_LOGE("GetCallWaiting failed!");
750         return ret;
751     }
752     if (callSettingManagerPtr_ != nullptr) {
753         return callSettingManagerPtr_->GetCallWaiting(slotId);
754     } else {
755         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
756         return TELEPHONY_ERR_LOCAL_PTR_NULL;
757     }
758 }
759 
SetCallWaiting(int32_t slotId,bool activate)760 int32_t CallControlManager::SetCallWaiting(int32_t slotId, bool activate)
761 {
762     int32_t ret = CallPolicy::SetCallWaitingPolicy(slotId);
763     if (ret != TELEPHONY_SUCCESS) {
764         TELEPHONY_LOGE("SetCallWaiting failed!");
765         return ret;
766     }
767     if (callSettingManagerPtr_ != nullptr) {
768         return callSettingManagerPtr_->SetCallWaiting(slotId, activate);
769     } else {
770         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
771         return TELEPHONY_ERR_LOCAL_PTR_NULL;
772     }
773 }
774 
GetCallRestriction(int32_t slotId,CallRestrictionType type)775 int32_t CallControlManager::GetCallRestriction(int32_t slotId, CallRestrictionType type)
776 {
777     int32_t ret = CallPolicy::GetCallRestrictionPolicy(slotId);
778     if (ret != TELEPHONY_SUCCESS) {
779         TELEPHONY_LOGE("GetCallRestriction failed!");
780         return ret;
781     }
782     if (callSettingManagerPtr_ != nullptr) {
783         return callSettingManagerPtr_->GetCallRestriction(slotId, type);
784     } else {
785         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
786         return TELEPHONY_ERR_LOCAL_PTR_NULL;
787     }
788 }
789 
SetCallRestriction(int32_t slotId,CallRestrictionInfo & info)790 int32_t CallControlManager::SetCallRestriction(int32_t slotId, CallRestrictionInfo &info)
791 {
792     int32_t ret = CallPolicy::SetCallRestrictionPolicy(slotId);
793     if (ret != TELEPHONY_SUCCESS) {
794         TELEPHONY_LOGE("SetCallRestriction failed!");
795         return ret;
796     }
797     if (callSettingManagerPtr_ != nullptr) {
798         return callSettingManagerPtr_->SetCallRestriction(slotId, info);
799     } else {
800         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
801         return TELEPHONY_ERR_LOCAL_PTR_NULL;
802     }
803 }
804 
SetCallRestrictionPassword(int32_t slotId,CallRestrictionType fac,const char * oldPassword,const char * newPassword)805 int32_t CallControlManager::SetCallRestrictionPassword(
806     int32_t slotId, CallRestrictionType fac, const char *oldPassword, const char *newPassword)
807 {
808     int32_t ret = CallPolicy::SetCallRestrictionPolicy(slotId);
809     if (ret != TELEPHONY_SUCCESS) {
810         TELEPHONY_LOGE("policy check failed!");
811         return ret;
812     }
813     if (callSettingManagerPtr_ != nullptr) {
814         return callSettingManagerPtr_->SetCallRestrictionPassword(slotId, fac, oldPassword, newPassword);
815     } else {
816         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
817         return TELEPHONY_ERR_LOCAL_PTR_NULL;
818     }
819 }
820 
GetCallTransferInfo(int32_t slotId,CallTransferType type)821 int32_t CallControlManager::GetCallTransferInfo(int32_t slotId, CallTransferType type)
822 {
823     int32_t ret = CallPolicy::GetCallTransferInfoPolicy(slotId);
824     if (ret != TELEPHONY_SUCCESS) {
825         TELEPHONY_LOGE("GetCallTransferInfo failed!");
826         return ret;
827     }
828     if (callSettingManagerPtr_ != nullptr) {
829         return callSettingManagerPtr_->GetCallTransferInfo(slotId, type);
830     } else {
831         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
832         return TELEPHONY_ERR_LOCAL_PTR_NULL;
833     }
834 }
835 
SetCallTransferInfo(int32_t slotId,CallTransferInfo & info)836 int32_t CallControlManager::SetCallTransferInfo(int32_t slotId, CallTransferInfo &info)
837 {
838     int32_t ret = CallPolicy::SetCallTransferInfoPolicy(slotId);
839     if (ret != TELEPHONY_SUCCESS) {
840         TELEPHONY_LOGE("SetCallTransferInfo failed!");
841         return ret;
842     }
843     if (callSettingManagerPtr_ != nullptr) {
844         return callSettingManagerPtr_->SetCallTransferInfo(slotId, info);
845     } else {
846         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
847         return TELEPHONY_ERR_LOCAL_PTR_NULL;
848     }
849 }
850 
CanSetCallTransferTime(int32_t slotId,bool & result)851 int32_t CallControlManager::CanSetCallTransferTime(int32_t slotId, bool &result)
852 {
853     int32_t ret = CallPolicy::SetCallTransferInfoPolicy(slotId);
854     if (ret != TELEPHONY_SUCCESS) {
855         TELEPHONY_LOGE("[slot%{public}d] failed!", slotId);
856         return ret;
857     }
858     if (callSettingManagerPtr_ != nullptr) {
859         return callSettingManagerPtr_->CanSetCallTransferTime(slotId, result);
860     } else {
861         TELEPHONY_LOGE("[slot%{public}d]  callSettingManagerPtr_ is nullptr!", slotId);
862         return TELEPHONY_ERR_LOCAL_PTR_NULL;
863     }
864 }
865 
SetCallPreferenceMode(int32_t slotId,int32_t mode)866 int32_t CallControlManager::SetCallPreferenceMode(int32_t slotId, int32_t mode)
867 {
868     int32_t ret = CallPolicy::SetCallPreferenceModePolicy(slotId);
869     if (ret != TELEPHONY_SUCCESS) {
870         TELEPHONY_LOGE("SetCallPreferenceMode failed!");
871         return ret;
872     }
873     if (callSettingManagerPtr_ != nullptr) {
874         return callSettingManagerPtr_->SetCallPreferenceMode(slotId, mode);
875     } else {
876         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
877         return TELEPHONY_ERR_LOCAL_PTR_NULL;
878     }
879 }
880 
881 /**
882  * start a telephone conference by merging three-way calls,steps as follows:
883  * 1.A call B: A<---->B,set holding
884  * 2.A call C: A<---->C, active
885  * 3.A initial merge request by CombineConference
886  * @param mainCallId:active call id
887  */
CombineConference(int32_t mainCallId)888 int32_t CallControlManager::CombineConference(int32_t mainCallId)
889 {
890     sptr<CallBase> mainCall = GetOneCallObject(mainCallId);
891     if (mainCall == nullptr) {
892         TELEPHONY_LOGE("GetOneCallObject failed, mainCallId:%{public}d", mainCallId);
893         return TELEPHONY_ERR_ARGUMENT_INVALID;
894     }
895     if (mainCall->GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) {
896         TELEPHONY_LOGE("mainCall state should be active ");
897         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
898     }
899     if (!CallObjectManager::IsCallExist(mainCall->GetCallType(), TelCallState::CALL_STATUS_HOLDING)) {
900         TELEPHONY_LOGE("callType:%{public}d,callState:CALL_STATUS_HOLDING is not exist!", mainCall->GetCallType());
901         return CALL_ERR_CALL_STATE_MISMATCH_OPERATION;
902     }
903     int32_t ret = mainCall->CanCombineConference();
904     if (ret != TELEPHONY_SUCCESS) {
905         TELEPHONY_LOGE("CanCombineConference failed");
906         return ret;
907     }
908     if (CallRequestHandlerPtr_ == nullptr) {
909         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
910         return TELEPHONY_ERR_LOCAL_PTR_NULL;
911     }
912     ret = CallRequestHandlerPtr_->CombineConference(mainCallId);
913     if (ret != TELEPHONY_SUCCESS) {
914         TELEPHONY_LOGE("CombineConference failed!");
915     }
916     return ret;
917 }
918 
SeparateConference(int32_t callId)919 int32_t CallControlManager::SeparateConference(int32_t callId)
920 {
921     sptr<CallBase> call = GetOneCallObject(callId);
922     if (call == nullptr) {
923         TELEPHONY_LOGE("GetOneCallObject failed, callId:%{public}d", callId);
924         return TELEPHONY_ERR_ARGUMENT_INVALID;
925     }
926     int32_t ret = call->CanSeparateConference();
927     if (ret != TELEPHONY_SUCCESS) {
928         TELEPHONY_LOGE("CanSeparateConference failed");
929         return ret;
930     }
931     if (CallRequestHandlerPtr_ == nullptr) {
932         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
933         return TELEPHONY_ERR_LOCAL_PTR_NULL;
934     }
935     ret = CallRequestHandlerPtr_->SeparateConference(callId);
936     if (ret != TELEPHONY_SUCCESS) {
937         TELEPHONY_LOGE("SeparateConference failed!");
938         return ret;
939     }
940     return TELEPHONY_SUCCESS;
941 }
942 
KickOutFromConference(int32_t callId)943 int32_t CallControlManager::KickOutFromConference(int32_t callId)
944 {
945     sptr<CallBase> call = GetOneCallObject(callId);
946     if (call == nullptr) {
947         TELEPHONY_LOGE("GetOneCallObject failed, callId:%{public}d", callId);
948         return TELEPHONY_ERR_ARGUMENT_INVALID;
949     }
950     int32_t ret = call->CanKickOutFromConference();
951     if (ret != TELEPHONY_SUCCESS) {
952         TELEPHONY_LOGE("CanKickOutFromConference failed");
953         return ret;
954     }
955     if (CallRequestHandlerPtr_ == nullptr) {
956         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
957         return TELEPHONY_ERR_LOCAL_PTR_NULL;
958     }
959     ret = CallRequestHandlerPtr_->KickOutFromConference(callId);
960     if (ret != TELEPHONY_SUCCESS) {
961         TELEPHONY_LOGE("KickOutFromConference failed!");
962         return ret;
963     }
964     return TELEPHONY_SUCCESS;
965 }
966 
GetMainCallId(int32_t callId,int32_t & mainCallId)967 int32_t CallControlManager::GetMainCallId(int32_t callId, int32_t &mainCallId)
968 {
969     sptr<CallBase> call = GetOneCallObject(callId);
970     if (call == nullptr) {
971         TELEPHONY_LOGE("GetMainCallId failed! callId:%{public}d", callId);
972         return TELEPHONY_ERR_ARGUMENT_INVALID;
973     }
974     return call->GetMainCallId(mainCallId);
975 }
976 
GetSubCallIdList(int32_t callId,std::vector<std::u16string> & callIdList)977 int32_t CallControlManager::GetSubCallIdList(int32_t callId, std::vector<std::u16string> &callIdList)
978 {
979     sptr<CallBase> call = GetOneCallObject(callId);
980     if (call == nullptr) {
981         TELEPHONY_LOGE("GetSubCallIdList failed! callId:%{public}d", callId);
982         return TELEPHONY_ERR_ARGUMENT_INVALID;
983     }
984     return call->GetSubCallIdList(callIdList);
985 }
986 
GetCallIdListForConference(int32_t callId,std::vector<std::u16string> & callIdList)987 int32_t CallControlManager::GetCallIdListForConference(int32_t callId, std::vector<std::u16string> &callIdList)
988 {
989     sptr<CallBase> call = GetOneCallObject(callId);
990     if (call == nullptr) {
991         TELEPHONY_LOGE("GetCallIdListForConference failed! callId:%{public}d", callId);
992         return TELEPHONY_ERR_ARGUMENT_INVALID;
993     }
994     return call->GetCallIdListForConference(callIdList);
995 }
996 
GetImsConfig(int32_t slotId,ImsConfigItem item)997 int32_t CallControlManager::GetImsConfig(int32_t slotId, ImsConfigItem item)
998 {
999     int32_t ret = CallPolicy::GetImsConfigPolicy(slotId);
1000     if (ret != TELEPHONY_SUCCESS) {
1001         TELEPHONY_LOGE("GetImsConfig failed!");
1002         return ret;
1003     }
1004     if (callSettingManagerPtr_ != nullptr) {
1005         return callSettingManagerPtr_->GetImsConfig(slotId, item);
1006     } else {
1007         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1008         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1009     }
1010 }
1011 
SetImsConfig(int32_t slotId,ImsConfigItem item,std::u16string & value)1012 int32_t CallControlManager::SetImsConfig(int32_t slotId, ImsConfigItem item, std::u16string &value)
1013 {
1014     int32_t ret = CallPolicy::SetImsConfigPolicy(slotId);
1015     if (ret != TELEPHONY_SUCCESS) {
1016         TELEPHONY_LOGE("SetImsConfig failed!");
1017         return ret;
1018     }
1019     if (callSettingManagerPtr_ != nullptr) {
1020         return callSettingManagerPtr_->SetImsConfig(slotId, item, value);
1021     } else {
1022         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1023         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1024     }
1025 }
1026 
GetImsFeatureValue(int32_t slotId,FeatureType type)1027 int32_t CallControlManager::GetImsFeatureValue(int32_t slotId, FeatureType type)
1028 {
1029     int32_t ret = CallPolicy::GetImsFeatureValuePolicy(slotId);
1030     if (ret != TELEPHONY_SUCCESS) {
1031         TELEPHONY_LOGE("GetImsFeatureValue failed!");
1032         return ret;
1033     }
1034     if (callSettingManagerPtr_ != nullptr) {
1035         return callSettingManagerPtr_->GetImsFeatureValue(slotId, type);
1036     } else {
1037         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1038         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1039     }
1040 }
1041 
SetImsFeatureValue(int32_t slotId,FeatureType type,int32_t value)1042 int32_t CallControlManager::SetImsFeatureValue(int32_t slotId, FeatureType type, int32_t value)
1043 {
1044     int32_t ret = CallPolicy::SetImsFeatureValuePolicy(slotId);
1045     if (ret != TELEPHONY_SUCCESS) {
1046         TELEPHONY_LOGE("SetImsFeatureValue failed!");
1047         return ret;
1048     }
1049     if (callSettingManagerPtr_ != nullptr) {
1050         return callSettingManagerPtr_->SetImsFeatureValue(slotId, type, value);
1051     } else {
1052         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1053         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1054     }
1055 }
1056 
EnableImsSwitch(int32_t slotId)1057 int32_t CallControlManager::EnableImsSwitch(int32_t slotId)
1058 {
1059     int32_t ret = CallPolicy::EnableVoLtePolicy(slotId);
1060     if (ret != TELEPHONY_SUCCESS) {
1061         TELEPHONY_LOGE("EnableImsSwitch failed!");
1062         return ret;
1063     }
1064     if (callSettingManagerPtr_ != nullptr) {
1065         return callSettingManagerPtr_->EnableImsSwitch(slotId);
1066     } else {
1067         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1068         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1069     }
1070 }
1071 
DisableImsSwitch(int32_t slotId)1072 int32_t CallControlManager::DisableImsSwitch(int32_t slotId)
1073 {
1074     int32_t ret = CallPolicy::DisableVoLtePolicy(slotId);
1075     if (ret != TELEPHONY_SUCCESS) {
1076         TELEPHONY_LOGE("DisableImsSwitch failed!");
1077         return ret;
1078     }
1079     if (callSettingManagerPtr_ != nullptr) {
1080         return callSettingManagerPtr_->DisableImsSwitch(slotId);
1081     } else {
1082         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1083         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1084     }
1085 }
1086 
IsImsSwitchEnabled(int32_t slotId,bool & enabled)1087 int32_t CallControlManager::IsImsSwitchEnabled(int32_t slotId, bool &enabled)
1088 {
1089     int32_t ret = CallPolicy::IsVoLteEnabledPolicy(slotId);
1090     if (ret != TELEPHONY_SUCCESS) {
1091         TELEPHONY_LOGE("IsImsSwitchEnabled failed!");
1092         return ret;
1093     }
1094     if (callSettingManagerPtr_ != nullptr) {
1095         return callSettingManagerPtr_->IsImsSwitchEnabled(slotId, enabled);
1096     } else {
1097         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1098         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1099     }
1100 }
1101 
SetVoNRState(int32_t slotId,int32_t state)1102 int32_t CallControlManager::SetVoNRState(int32_t slotId, int32_t state)
1103 {
1104     int32_t ret = CallPolicy::VoNRStatePolicy(slotId, state);
1105     if (ret != TELEPHONY_SUCCESS) {
1106         TELEPHONY_LOGE("SetVoNRState failed!");
1107         return ret;
1108     }
1109     if (callSettingManagerPtr_ != nullptr) {
1110         return callSettingManagerPtr_->SetVoNRState(slotId, state);
1111     } else {
1112         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1113         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1114     }
1115 }
1116 
GetVoNRState(int32_t slotId,int32_t & state)1117 int32_t CallControlManager::GetVoNRState(int32_t slotId, int32_t &state)
1118 {
1119     int32_t ret = CallPolicy::IsValidSlotId(slotId);
1120     if (ret != TELEPHONY_SUCCESS) {
1121         TELEPHONY_LOGE("SetVoNRState failed!");
1122         return ret;
1123     }
1124     if (callSettingManagerPtr_ != nullptr) {
1125         ret = callSettingManagerPtr_->GetVoNRState(slotId, state);
1126         if (ret == TELEPHONY_SUCCESS) {
1127             ret = CallPolicy::VoNRStatePolicy(slotId, state);
1128         }
1129         return ret;
1130     } else {
1131         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1132         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1133     }
1134 }
1135 
UpdateImsCallMode(int32_t callId,ImsCallMode mode)1136 int32_t CallControlManager::UpdateImsCallMode(int32_t callId, ImsCallMode mode)
1137 {
1138     return TELEPHONY_SUCCESS;
1139 }
1140 
StartRtt(int32_t callId,std::u16string & msg)1141 int32_t CallControlManager::StartRtt(int32_t callId, std::u16string &msg)
1142 {
1143     int32_t ret = CallPolicy::StartRttPolicy(callId);
1144     if (ret != TELEPHONY_SUCCESS) {
1145         TELEPHONY_LOGE("NO IMS call,can not StartRtt!");
1146         return ret;
1147     }
1148     if (CallRequestHandlerPtr_ == nullptr) {
1149         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
1150         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1151     }
1152     ret = CallRequestHandlerPtr_->StartRtt(callId, msg);
1153     if (ret != TELEPHONY_SUCCESS) {
1154         TELEPHONY_LOGE("StartRtt failed!");
1155         return ret;
1156     }
1157     return TELEPHONY_SUCCESS;
1158 }
1159 
StopRtt(int32_t callId)1160 int32_t CallControlManager::StopRtt(int32_t callId)
1161 {
1162     int32_t ret = CallPolicy::StopRttPolicy(callId);
1163     if (ret != TELEPHONY_SUCCESS) {
1164         TELEPHONY_LOGE("NO IMS call,no need StopRtt!");
1165         return ret;
1166     }
1167     if (CallRequestHandlerPtr_ == nullptr) {
1168         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
1169         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1170     }
1171     ret = CallRequestHandlerPtr_->StopRtt(callId);
1172     if (ret != TELEPHONY_SUCCESS) {
1173         TELEPHONY_LOGE("StopRtt failed!");
1174         return ret;
1175     }
1176     return TELEPHONY_SUCCESS;
1177 }
1178 
JoinConference(int32_t callId,std::vector<std::u16string> & numberList)1179 int32_t CallControlManager::JoinConference(int32_t callId, std::vector<std::u16string> &numberList)
1180 {
1181     if (CallRequestHandlerPtr_ == nullptr) {
1182         TELEPHONY_LOGE("CallRequestHandlerPtr_ is nullptr!");
1183         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1184     }
1185     std::vector<std::string> phoneNumberList(numberList.size());
1186     for (size_t index = 0; index < numberList.size(); ++index) {
1187         phoneNumberList[index] = Str16ToStr8(numberList[index]);
1188     }
1189     int32_t ret = CallPolicy::InviteToConferencePolicy(callId, phoneNumberList);
1190     if (ret != TELEPHONY_SUCCESS) {
1191         TELEPHONY_LOGE("check InviteToConference Policy failed!");
1192         return ret;
1193     }
1194     ret = CallRequestHandlerPtr_->JoinConference(callId, phoneNumberList);
1195     if (ret != TELEPHONY_SUCCESS) {
1196         TELEPHONY_LOGE("JoinConference failed!");
1197         return ret;
1198     }
1199     return TELEPHONY_SUCCESS;
1200 }
1201 
SetMuted(bool isMute)1202 int32_t CallControlManager::SetMuted(bool isMute)
1203 {
1204     sptr<CallBase> call = CallObjectManager::GetAudioLiveCall();
1205     if (call == nullptr) {
1206         return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
1207     }
1208 
1209     if (call->GetCallType() == CallType::TYPE_VOIP) {
1210         TELEPHONY_LOGI("SetMute by voip");
1211         return call->SetMute(isMute, call->GetSlotId());
1212     }
1213     if (call->GetCallType() == CallType::TYPE_IMS
1214         || call->GetCallType() == CallType::TYPE_CS) {
1215         TELEPHONY_LOGI("SetMute by ims or cs,isMute = %{public}d", isMute);
1216         call->SetMute(isMute, call->GetSlotId());
1217     }
1218 
1219     return DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(isMute);
1220 }
1221 
MuteRinger()1222 int32_t CallControlManager::MuteRinger()
1223 {
1224     CallVoiceAssistantManager::GetInstance()->MuteRinger();
1225     return DelayedSingleton<AudioControlManager>::GetInstance()->MuteRinger();
1226 }
1227 
SetAudioDevice(const AudioDevice & audioDevice)1228 int32_t CallControlManager::SetAudioDevice(const AudioDevice &audioDevice)
1229 {
1230     return DelayedSingleton<AudioControlManager>::GetInstance()->SetAudioDevice(audioDevice, true);
1231 }
1232 
ControlCamera(std::u16string cameraId,int32_t callingUid,int32_t callingPid)1233 int32_t CallControlManager::ControlCamera(std::u16string cameraId, int32_t callingUid, int32_t callingPid)
1234 {
1235     return TELEPHONY_SUCCESS;
1236 }
1237 
SetPreviewWindow(VideoWindow & window)1238 int32_t CallControlManager::SetPreviewWindow(VideoWindow &window)
1239 {
1240     return TELEPHONY_SUCCESS;
1241 }
1242 
SetDisplayWindow(VideoWindow & window)1243 int32_t CallControlManager::SetDisplayWindow(VideoWindow &window)
1244 {
1245     return TELEPHONY_SUCCESS;
1246 }
1247 
SetCameraZoom(float zoomRatio)1248 int32_t CallControlManager::SetCameraZoom(float zoomRatio)
1249 {
1250     return TELEPHONY_SUCCESS;
1251 }
1252 
SetPausePicture(std::u16string path)1253 int32_t CallControlManager::SetPausePicture(std::u16string path)
1254 {
1255     return TELEPHONY_SUCCESS;
1256 }
1257 
SetDeviceDirection(int32_t rotation)1258 int32_t CallControlManager::SetDeviceDirection(int32_t rotation)
1259 {
1260     return TELEPHONY_SUCCESS;
1261 }
1262 
IsEmergencyPhoneNumber(std::u16string & number,int32_t slotId,bool & enabled)1263 int32_t CallControlManager::IsEmergencyPhoneNumber(std::u16string &number, int32_t slotId, bool &enabled)
1264 {
1265     if (IsValidSlotId(slotId)) {
1266         return CALL_ERR_INVALID_SLOT_ID;
1267     }
1268     return DelayedSingleton<CallNumberUtils>::GetInstance()->CheckNumberIsEmergency(
1269         Str16ToStr8(number), slotId, enabled);
1270 }
1271 
FormatPhoneNumber(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)1272 int32_t CallControlManager::FormatPhoneNumber(
1273     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
1274 {
1275     std::string tmpStr("");
1276     int32_t ret = DelayedSingleton<CallNumberUtils>::GetInstance()->FormatPhoneNumber(
1277         Str16ToStr8(number), Str16ToStr8(countryCode), tmpStr);
1278     formatNumber = Str8ToStr16(tmpStr);
1279     return ret;
1280 }
1281 
FormatPhoneNumberToE164(std::u16string & number,std::u16string & countryCode,std::u16string & formatNumber)1282 int32_t CallControlManager::FormatPhoneNumberToE164(
1283     std::u16string &number, std::u16string &countryCode, std::u16string &formatNumber)
1284 {
1285     std::string tmpStr("");
1286     int32_t ret = DelayedSingleton<CallNumberUtils>::GetInstance()->FormatPhoneNumberToE164(
1287         Str16ToStr8(number), Str16ToStr8(countryCode), tmpStr);
1288     formatNumber = Str8ToStr16(tmpStr);
1289     return ret;
1290 }
1291 
CloseUnFinishedUssd(int32_t slotId)1292 int32_t CallControlManager::CloseUnFinishedUssd(int32_t slotId)
1293 {
1294     int32_t ret = CallPolicy::CloseUnFinishedUssdPolicy(slotId);
1295     if (ret != TELEPHONY_SUCCESS) {
1296         TELEPHONY_LOGE("CloseUnFinishedUssd failed!");
1297         return ret;
1298     }
1299     if (callSettingManagerPtr_ != nullptr) {
1300         return callSettingManagerPtr_->CloseUnFinishedUssd(slotId);
1301     } else {
1302         TELEPHONY_LOGE("callSettingManagerPtr_ is nullptr!");
1303         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1304     }
1305 }
1306 
GetDialParaInfo(DialParaInfo & info)1307 void CallControlManager::GetDialParaInfo(DialParaInfo &info)
1308 {
1309     std::lock_guard<std::mutex> lock(mutex_);
1310     info = dialSrcInfo_;
1311 }
1312 
GetDialParaInfo(DialParaInfo & info,AppExecFwk::PacMap & extras)1313 void CallControlManager::GetDialParaInfo(DialParaInfo &info, AppExecFwk::PacMap &extras)
1314 {
1315     std::lock_guard<std::mutex> lock(mutex_);
1316     info = dialSrcInfo_;
1317     extras = extras_;
1318 }
1319 
handler()1320 void CallControlManager::handler()
1321 {
1322     alarmSeted = false;
1323     TELEPHONY_LOGE("handle DisconnectAbility");
1324     if (!CallObjectManager::HasCallExist()) {
1325         DelayedSingleton<CallConnectAbility>::GetInstance()->DisconnectAbility();
1326     }
1327 }
1328 
cancel(ffrt::task_handle & handle)1329 bool CallControlManager::cancel(ffrt::task_handle &handle)
1330 {
1331     if (handle != nullptr) {
1332         TELEPHONY_LOGI("skip disconnect ability task");
1333         int ret = ffrt::skip(handle);
1334         if (ret != TELEPHONY_SUCCESS) {
1335             TELEPHONY_LOGE("skip task failed, ret = %{public}d", ret);
1336             return false;
1337         }
1338     }
1339     return true;
1340 }
1341 
ConnectCallUiService(bool shouldConnect)1342 void CallControlManager::ConnectCallUiService(bool shouldConnect)
1343 {
1344     if (shouldConnect) {
1345         if (alarmSeted) {
1346             if (!cancel(disconnectHandle)) {
1347                 return;
1348             }
1349             alarmSeted = false;
1350         }
1351         DelayedSingleton<CallConnectAbility>::GetInstance()->ConnectAbility();
1352         shouldDisconnect = false;
1353     } else {
1354         shouldDisconnect = true;
1355         if (!alarmSeted) {
1356             TELEPHONY_LOGI("submit delay disconnect ability");
1357             disconnectHandle = ffrt::submit_h([&]() {
1358                 handler();
1359             }, {}, {}, ffrt::task_attr().delay(DISCONNECT_DELAY_TIME));
1360             alarmSeted = true;
1361         }  else {
1362             if (!cancel(disconnectHandle)) {
1363                 return;
1364             }
1365             TELEPHONY_LOGI("submit delay disconnect ability");
1366             disconnectHandle = ffrt::submit_h([&]() {
1367                 handler();
1368             }, {}, {}, ffrt::task_attr().delay(DISCONNECT_DELAY_TIME));
1369         }
1370     }
1371 }
1372 
ShouldDisconnectService()1373 bool CallControlManager::ShouldDisconnectService()
1374 {
1375     return shouldDisconnect;
1376 }
1377 
RemoveMissedIncomingCallNotification()1378 int32_t CallControlManager::RemoveMissedIncomingCallNotification()
1379 {
1380     int32_t ret = DelayedSingleton<CallRecordsManager>::GetInstance()->RemoveMissedIncomingCallNotification();
1381     if (ret != TELEPHONY_SUCCESS) {
1382         TELEPHONY_LOGE("RemoveMissedIncomingCallNotification failed!");
1383         return ret;
1384     }
1385     return TELEPHONY_SUCCESS;
1386 }
1387 
SetVoIPCallState(int32_t state)1388 int32_t CallControlManager::SetVoIPCallState(int32_t state)
1389 {
1390     TELEPHONY_LOGI("VoIP state is %{public}d", state);
1391     VoIPCallState_ = (CallStateToApp)state;
1392     std::string identity = IPCSkeleton::ResetCallingIdentity();
1393     DelayedSingleton<CallStateReportProxy>::GetInstance()->UpdateCallStateForVoIPOrRestart();
1394     CallVoiceAssistantManager::GetInstance()->UpdateVoipCallState(state);
1395     if (VoIPCallState_ == CallStateToApp::CALL_STATE_IDLE ||
1396         VoIPCallState_ == CallStateToApp::CALL_STATE_UNKNOWN) {
1397         std::lock_guard<std::mutex> lock(voipMutex_);
1398         if (appMgrProxy != nullptr && appStateObserver != nullptr) {
1399             appMgrProxy->UnregisterApplicationStateObserver(appStateObserver);
1400             appMgrProxy = nullptr;
1401             appStateObserver = nullptr;
1402         }
1403     } else {
1404         AppStateObserver();
1405     }
1406     IPCSkeleton::SetCallingIdentity(identity);
1407     if (VoIPCallState_ == CallStateToApp::CALL_STATE_ANSWERED) {
1408         TELEPHONY_LOGI("VoIP answered the call, should hangup all calls");
1409         std::list<sptr<CallBase>> allCallList = CallObjectManager::GetAllCallList();
1410         for (auto call : allCallList) {
1411             int32_t ret = HangUpCall(call->GetCallID());
1412             if (ret != TELEPHONY_SUCCESS) {
1413                 return ret;
1414             }
1415         }
1416     }
1417     if (VoIPCallState_ == CallStateToApp::CALL_STATE_OFFHOOK) {
1418         HangUpVoipCall();
1419     }
1420     if (VoIPCallState_ == CallStateToApp::CALL_STATE_IDLE) {
1421             TELEPHONY_LOGI("VoIP call state is not active");
1422             if (AnsweredCallQueue_.hasCall) {
1423                 AnsweredCallQueue_.hasCall = false;
1424                 return AnswerCall(AnsweredCallQueue_.callId, AnsweredCallQueue_.videoState);
1425         }
1426     }
1427     return TELEPHONY_SUCCESS;
1428 }
1429 
SetVoIPCallInfo(int32_t callId,int32_t state,std::string phoneNumber)1430 int32_t CallControlManager::SetVoIPCallInfo(int32_t callId, int32_t state, std::string phoneNumber)
1431 {
1432     if (!IsSupportSetVoipInfo()) {
1433         TELEPHONY_LOGE("SetVoIPCallState is not support");
1434         return TELEPHONY_ERROR;
1435     }
1436     if (callId == ILLEGAL_CALLID) {
1437         TELEPHONY_LOGE("The calling is dead and need the call list cleared");
1438         ClearVoipList();
1439         return TELEPHONY_ERROR;
1440     }
1441     int32_t numActive = GetCallNum(TelCallState::CALL_STATUS_ACTIVE, true);
1442     int32_t numHeld = GetCallNum(TelCallState::CALL_STATUS_HOLDING, true);
1443     switch (state) {
1444         case (int32_t)TelCallState::CALL_STATUS_IDLE: {
1445             HandleVoipConnected(numActive, callId);
1446             break;
1447         }
1448         case (int32_t)TelCallState::CALL_STATUS_INCOMING: {
1449             HandleVoipIncoming(numActive, callId, phoneNumber);
1450             break;
1451         }
1452         case (int32_t)TelCallState::CALL_STATUS_DISCONNECTED: {
1453             return HandleVoipDisconnected(numActive, numHeld, callId,
1454                 state, phoneNumber);
1455         }
1456         case (int32_t)TelCallState::CALL_STATUS_ALERTING: {
1457             HandleVoipAlerting(callId, phoneNumber);
1458             break;
1459         }
1460         default:
1461             break;
1462     }
1463     SetVoipCallInfoInner(callId, state, phoneNumber);
1464     TELEPHONY_LOGI("SetVoIPCallInfo,numActive:%{public}d,numHeld:%{public}d,callState:%{public}d", numActive, numHeld,
1465         state);
1466     return DelayedSingleton<BluetoothCallManager>::GetInstance()->
1467         SendBtCallState(numActive, numHeld, state, phoneNumber);
1468 }
1469 
IsSupportSetVoipInfo()1470 bool CallControlManager::IsSupportSetVoipInfo()
1471 {
1472     std::string readSetVoipCallInfo = system::GetParameter(KEY_CONST_TELEPHONY_READ_SET_VOIP_CALL_INFO, "");
1473     if (readSetVoipCallInfo.compare("false") == 0) {
1474         return false;
1475     }
1476     return true;
1477 }
1478 
HandleVoipConnected(int32_t & numActive,int32_t callId)1479 void CallControlManager::HandleVoipConnected(int32_t &numActive, int32_t callId)
1480 {
1481     if (numActive == 0) {
1482         numActive = 1;
1483     }
1484     NotifyVoipCallStateUpdated(GetVoipCallInfo(), TelCallState::CALL_STATUS_INCOMING,
1485         TelCallState::CALL_STATUS_ACTIVE);
1486     UpdateOneVoipCallObjectByCallId(callId, TelCallState::CALL_STATUS_ACTIVE);
1487 }
1488 
HandleVoipIncoming(int32_t & numActive,int32_t callId,const std::string phoneNumber)1489 void CallControlManager::HandleVoipIncoming(int32_t &numActive, int32_t callId, const std::string phoneNumber)
1490 {
1491     CallAttributeInfo info;
1492     size_t copiedChars = phoneNumber.copy(info.accountNumber, sizeof(info.accountNumber) - 1);
1493     info.accountNumber[copiedChars] = '\0';
1494     info.callType = CallType::TYPE_VOIP;
1495     info.callId = callId;
1496     if (HasCallExist() || IsVoipCallExist()) {
1497         info.callState = TelCallState::CALL_STATUS_WAITING;
1498     } else {
1499         info.callState = TelCallState::CALL_STATUS_INCOMING;
1500     }
1501     info.callDirection = CallDirection::CALL_DIRECTION_IN;
1502     if (IsVoipCallExist() && (GetVoipCallInfo().callState == TelCallState::CALL_STATUS_ACTIVE)) {
1503         if (numActive == 0) {
1504             numActive = 1;
1505         }
1506     }
1507     NotifyVoipCallStateUpdated(info, TelCallState::CALL_STATUS_INCOMING, TelCallState::CALL_STATUS_INCOMING);
1508     AddOneVoipCallObject(info);
1509     bool res = DelayedSingleton<AudioDeviceManager>::GetInstance()->SetVirtualCall(false);
1510     TELEPHONY_LOGI("SetVirtualCall res: %{public}d.", res);
1511 }
1512 
HandleVoipDisconnected(int32_t & numActive,int32_t numHeld,int32_t callId,int32_t state,const std::string phoneNumber)1513 int32_t CallControlManager::HandleVoipDisconnected(int32_t &numActive, int32_t numHeld, int32_t callId,
1514     int32_t state, const std::string phoneNumber)
1515 {
1516     CallAttributeInfo info;
1517     size_t copiedChars = phoneNumber.copy(info.accountNumber, sizeof(info.accountNumber) - 1);
1518     info.accountNumber[copiedChars] = '\0';
1519     info.callType = CallType::TYPE_VOIP;
1520     info.callId = callId;
1521     info.callState = (TelCallState)state;
1522     NotifyVoipCallStateUpdated(info, TelCallState::CALL_STATUS_ACTIVE, TelCallState::CALL_STATUS_DISCONNECTED);
1523     DeleteOneVoipCallObject(callId);
1524     DelayedSingleton<BluetoothCallManager>::GetInstance()->
1525         SendBtCallState(numActive, numHeld, state, phoneNumber);
1526     int32_t carrierCallId = ERR_ID;
1527     IsCallExist(TelCallState::CALL_STATUS_WAITING, carrierCallId);
1528     if (carrierCallId != ERR_ID) {
1529         TELEPHONY_LOGI("SetVoIPCallInfo handle cs call sucessed");
1530         sptr<CallBase> call = GetOneCallObject(carrierCallId);
1531         return DelayedSingleton<BluetoothCallManager>::GetInstance()->
1532             SendBtCallState(0, 0, (int32_t)TelCallState::CALL_STATUS_INCOMING, call->GetAccountNumber());
1533     }
1534     return DelayedSingleton<BluetoothCallManager>::GetInstance()->
1535         SendBtCallState(numActive, numHeld, (int32_t)TelCallState::CALL_STATUS_IDLE, "");
1536 }
1537 
1538 
HandleVoipAlerting(int32_t callId,const std::string phoneNumber)1539 void CallControlManager::HandleVoipAlerting(int32_t callId, const std::string phoneNumber)
1540 {
1541     CallAttributeInfo info;
1542     size_t copiedChars = phoneNumber.copy(info.accountNumber, sizeof(info.accountNumber) - 1);
1543     info.accountNumber[copiedChars] = '\0';
1544     info.callType = CallType::TYPE_VOIP;
1545     info.callId = callId;
1546     info.callState = TelCallState::CALL_STATUS_ALERTING;
1547     info.callDirection = CallDirection::CALL_DIRECTION_OUT;
1548     AddOneVoipCallObject(info);
1549     NotifyVoipCallStateUpdated(info, TelCallState::CALL_STATUS_INCOMING, TelCallState::CALL_STATUS_DIALING);
1550     bool res = DelayedSingleton<AudioDeviceManager>::GetInstance()->SetVirtualCall(false);
1551     TELEPHONY_LOGI("SetVirtualCall res = %{public}d.", res);
1552 }
1553 
GetMeetimeCallState()1554 int32_t CallControlManager::GetMeetimeCallState()
1555 {
1556     return VoipCallInfo_.state;
1557 }
1558 
SetVoipCallInfoInner(const int32_t callId,const int32_t state,const std::string phoneNumber)1559 void CallControlManager::SetVoipCallInfoInner(const int32_t callId, const int32_t state,
1560     const std::string phoneNumber)
1561 {
1562     VoipCallInfo_.callId = callId;
1563     VoipCallInfo_.state = state;
1564     VoipCallInfo_.phoneNumber = phoneNumber;
1565 }
1566 
GetVoIPCallInfo(int32_t & callId,int32_t & state,std::string & phoneNumber)1567 int32_t CallControlManager::GetVoIPCallInfo(int32_t &callId, int32_t &state, std::string &phoneNumber)
1568 {
1569     if (!IsSupportSetVoipInfo()) {
1570         TELEPHONY_LOGE("GetVoIPCallInfo is not support");
1571         return TELEPHONY_ERROR;
1572     }
1573     callId = VoipCallInfo_.callId;
1574     state = VoipCallInfo_.state;
1575     phoneNumber = VoipCallInfo_.phoneNumber;
1576     return TELEPHONY_SUCCESS;
1577 }
1578 
AppStateObserver()1579 void CallControlManager::AppStateObserver()
1580 {
1581     std::lock_guard<std::mutex> lock(voipMutex_);
1582     if (appStateObserver == nullptr) {
1583         appStateObserver = new (std::nothrow) ApplicationStateObserver();
1584         if (appStateObserver == nullptr) {
1585             TELEPHONY_LOGE("Failed to Create AppStateObserver Instance");
1586             return;
1587         }
1588         sptr<ISystemAbilityManager> samgrClient = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1589         if (samgrClient == nullptr) {
1590             TELEPHONY_LOGE("Failed to get samgrClient");
1591             appStateObserver = nullptr;
1592             return;
1593         }
1594         appMgrProxy = iface_cast<AppExecFwk::IAppMgr>(samgrClient->GetSystemAbility(APP_MGR_SERVICE_ID));
1595         if (appMgrProxy == nullptr) {
1596             TELEPHONY_LOGE("Failed to get appMgrProxy");
1597             appStateObserver = nullptr;
1598             samgrClient = nullptr;
1599             return;
1600         }
1601         appMgrProxy->RegisterApplicationStateObserver(appStateObserver);
1602     }
1603 }
1604 
HangUpVoipCall()1605 int32_t CallControlManager::HangUpVoipCall()
1606 {
1607     std::list<sptr<CallBase>> allCallList = CallObjectManager::GetAllCallList();
1608     for (auto call : allCallList) {
1609         if (call == nullptr || call->GetCallType() != CallType::TYPE_VOIP) {
1610             continue;
1611         }
1612         TelCallState voipCallState = call->GetTelCallState();
1613         if (voipCallState == TelCallState::CALL_STATUS_ACTIVE) {
1614             TELEPHONY_LOGI("the voip call with callId %{public}d is active, no need to hangup", call->GetCallID());
1615         } else if (voipCallState == TelCallState::CALL_STATUS_INCOMING) {
1616             TELEPHONY_LOGI("Reject VoipCall callId %{public}d", call->GetCallID());
1617             int32_t ret = RejectCall(call->GetCallID(), true, u"CarrierAndVoipConflictProcess");
1618             if (ret != TELEPHONY_SUCCESS) {
1619                 TELEPHONY_LOGE("reject voip call %{public}d failed!", call->GetCallID());
1620                 return ret;
1621             }
1622         } else {
1623             TELEPHONY_LOGI("HangUp VoipCall callId %{public}d", call->GetCallID());
1624             int32_t ret = HangUpCall(call->GetCallID());
1625             if (ret != TELEPHONY_SUCCESS) {
1626                 TELEPHONY_LOGE("hangup voip call %{public}d failed!", call->GetCallID());
1627                 return ret;
1628             }
1629         }
1630     }
1631     return TELEPHONY_SUCCESS;
1632 }
1633 
GetVoIPCallState(int32_t & state)1634 int32_t CallControlManager::GetVoIPCallState(int32_t &state)
1635 {
1636     state = (int32_t)VoIPCallState_;
1637     return TELEPHONY_SUCCESS;
1638 }
1639 
CallStateObserve()1640 void CallControlManager::CallStateObserve()
1641 {
1642     if (callStateListenerPtr_ == nullptr) {
1643         TELEPHONY_LOGE("callStateListenerPtr_ is null");
1644         return;
1645     }
1646     std::shared_ptr<RejectCallSms> hangUpSmsPtr = std::make_shared<RejectCallSms>();
1647     if (hangUpSmsPtr == nullptr) {
1648         TELEPHONY_LOGE("hangUpSmsPtr is null");
1649         return;
1650     }
1651     callStateListenerPtr_->AddOneObserver(DelayedSingleton<CallAbilityReportProxy>::GetInstance());
1652     callStateListenerPtr_->AddOneObserver(DelayedSingleton<CallStateReportProxy>::GetInstance());
1653     callStateListenerPtr_->AddOneObserver(DelayedSingleton<AudioControlManager>::GetInstance());
1654     callStateListenerPtr_->AddOneObserver(hangUpSmsPtr);
1655     callStateListenerPtr_->AddOneObserver(missedCallNotification_);
1656     callStateListenerPtr_->AddOneObserver(incomingCallWakeup_);
1657     callStateListenerPtr_->AddOneObserver(DelayedSingleton<CallRecordsManager>::GetInstance());
1658     callStateListenerPtr_->AddOneObserver(DelayedSingleton<DistributedCommunicationManager>::GetInstance());
1659     callStateListenerPtr_->AddOneObserver(DelayedSingleton<InteroperableCommunicationManager>::GetInstance());
1660     callStateListenerPtr_->AddOneObserver(CallVoiceAssistantManager::GetInstance());
1661 }
1662 
AddCallLogAndNotification(sptr<CallBase> & callObjectPtr)1663 int32_t CallControlManager::AddCallLogAndNotification(sptr<CallBase> &callObjectPtr)
1664 {
1665     if (callObjectPtr == nullptr) {
1666         TELEPHONY_LOGE("callObjectPtr is null");
1667         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1668     }
1669     callObjectPtr->SetAnswerType(CallAnswerType::CALL_ANSWER_MISSED);
1670     DelayedSingleton<CallRecordsManager>::GetInstance()
1671         ->CallStateUpdated(callObjectPtr, TelCallState::CALL_STATUS_INCOMING, TelCallState::CALL_STATUS_DISCONNECTED);
1672     if (missedCallNotification_ == nullptr) {
1673         TELEPHONY_LOGE("missedCallNotification is null");
1674         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1675     }
1676     missedCallNotification_->PublishMissedCallEvent(callObjectPtr);
1677     return TELEPHONY_SUCCESS;
1678 }
1679 
AddBlockLogAndNotification(sptr<CallBase> & callObjectPtr)1680 int32_t CallControlManager::AddBlockLogAndNotification(sptr<CallBase> &callObjectPtr)
1681 {
1682     if (callObjectPtr == nullptr) {
1683         TELEPHONY_LOGE("callObjectPtr is null");
1684         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1685     }
1686     callObjectPtr->SetAnswerType(CallAnswerType::CALL_ANSWER_BLOCKED);
1687     DelayedSingleton<CallRecordsManager>::GetInstance()
1688         ->CallStateUpdated(callObjectPtr, TelCallState::CALL_STATUS_INCOMING, TelCallState::CALL_STATUS_DISCONNECTED);
1689     if (missedCallNotification_ == nullptr) {
1690         TELEPHONY_LOGE("missedCallNotification is null");
1691         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1692     }
1693     missedCallNotification_->PublishBlockedCallEvent(callObjectPtr);
1694     return TELEPHONY_SUCCESS;
1695 }
1696 
NumberLegalityCheck(std::string & number)1697 int32_t CallControlManager::NumberLegalityCheck(std::string &number)
1698 {
1699     if (number.empty()) {
1700         TELEPHONY_LOGE("phone number is NULL!");
1701         return CALL_ERR_PHONE_NUMBER_EMPTY;
1702     }
1703     if (number.length() > kMaxNumberLen) {
1704         TELEPHONY_LOGE(
1705             "the number length exceeds limit,len:%{public}zu,maxLen:%{public}d", number.length(), kMaxNumberLen);
1706         return CALL_ERR_NUMBER_OUT_OF_RANGE;
1707     }
1708     return TELEPHONY_SUCCESS;
1709 }
1710 
AcquireIncomingLock()1711 void CallControlManager::AcquireIncomingLock()
1712 {
1713     if (incomingCallWakeup_ == nullptr) {
1714         return;
1715     }
1716     incomingCallWakeup_->AcquireIncomingLock();
1717 }
1718 
ReleaseIncomingLock()1719 void CallControlManager::ReleaseIncomingLock()
1720 {
1721     if (incomingCallWakeup_ == nullptr) {
1722         return;
1723     }
1724     incomingCallWakeup_->ReleaseIncomingLock();
1725 }
1726 
DisconnectAllCalls()1727 void CallControlManager::DisconnectAllCalls()
1728 {
1729     std::list<sptr<CallBase>> allCallList = CallObjectManager::GetAllCallList();
1730     int32_t ret = -1;
1731     for (auto call : allCallList) {
1732         if (call == nullptr) {
1733             continue;
1734         }
1735         if (call->GetCallType() == CallType::TYPE_BLUETOOTH) {
1736             continue;
1737         }
1738         if (call->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_RINGING) {
1739             ret = RejectCall(call->GetCallID(), false, Str8ToStr16(""));
1740         } else {
1741             ret = HangUpCall(call->GetCallID());
1742         }
1743         if (ret == TELEPHONY_SUCCESS) {
1744             TELEPHONY_LOGI("one call is disconnected. call state: %{public}d, callId: %{public}d",
1745                 call->GetCallRunningState(), call->GetCallID());
1746         }
1747     }
1748 }
1749 
SystemAbilityListener()1750 CallControlManager::SystemAbilityListener::SystemAbilityListener() {}
1751 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1752 void CallControlManager::SystemAbilityListener::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
1753 {
1754     if (systemAbilityId != COMMON_EVENT_SERVICE_ID) {
1755         TELEPHONY_LOGE("systemAbilityId is not COMMON_EVENT_SERVICE_ID");
1756         return;
1757     }
1758     std::string identity = IPCSkeleton::ResetCallingIdentity();
1759     int32_t ret = CommonBroadcastSubscriber();
1760     if (ret) {
1761         TELEPHONY_LOGW("CommonBroadcastSubscriber fail.");
1762     }
1763     ret = ContactsBroadcastSubscriber();
1764     if (ret) {
1765         TELEPHONY_LOGW("ContactsBroadcastSubscriber fail.");
1766     }
1767     ret = SatcommBroadcastSubscriber();
1768     if (ret) {
1769         TELEPHONY_LOGW("SatcommBroadcastSubscriber fail.");
1770     }
1771     ret = SuperPrivacyModeBroadcastSubscriber();
1772     if (ret) {
1773         TELEPHONY_LOGW("SuperPrivacyModeBroadcastSubscriber fail.");
1774     }
1775     ret = HSDRBroadcastSubscriber();
1776     if (ret) {
1777         TELEPHONY_LOGW("HSDRBroadcastSubscriber fail.");
1778     }
1779     ret = HfpBroadcastSubscriber();
1780     if (ret) {
1781         TELEPHONY_LOGW("HfpBroadcastSubscriber fail.");
1782     }
1783     IPCSkeleton::SetCallingIdentity(identity);
1784     TELEPHONY_LOGI("CallControlManager add BroadcastSubscriber");
1785 }
1786 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1787 void CallControlManager::SystemAbilityListener::OnRemoveSystemAbility(
1788     int32_t systemAbilityId, const std::string &deviceId)
1789 {
1790     if (systemAbilityId != COMMON_EVENT_SERVICE_ID) {
1791         TELEPHONY_LOGE("systemAbilityId is not COMMON_EVENT_SERVICE_ID");
1792         return;
1793     }
1794     std::string identity = IPCSkeleton::ResetCallingIdentity();
1795     for (const auto& subscriberPtr : subscriberPtrList_) {
1796         bool subscribeResult = EventFwk::CommonEventManager::UnSubscribeCommonEvent(subscriberPtr);
1797         TELEPHONY_LOGI("CallControlManager UnSubscribeCommonEvent = %{public}d", subscribeResult);
1798     }
1799     subscriberPtrList_.clear();
1800     IPCSkeleton::SetCallingIdentity(identity);
1801     TELEPHONY_LOGI("CallControlManager remove BroadcastSubscriber");
1802 }
1803 
CommonBroadcastSubscriber()1804 int32_t CallControlManager::SystemAbilityListener::CommonBroadcastSubscriber()
1805 {
1806     EventFwk::MatchingSkills matchingSkills;
1807     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SIM_STATE_CHANGED);
1808     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED);
1809     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BLUETOOTH_REMOTEDEVICE_NAME_UPDATE);
1810     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED);
1811     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SHUTDOWN);
1812     EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
1813     subscriberInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1814     std::shared_ptr<CallBroadcastSubscriber> subscriberPtr = std::make_shared<CallBroadcastSubscriber>(subscriberInfo);
1815     if (subscriberPtr == nullptr) {
1816         TELEPHONY_LOGE("CommonBroadcastSubscriber subscriberPtr is nullptr");
1817         return TELEPHONY_ERROR;
1818     }
1819     subscriberPtrList_.emplace_back(subscriberPtr);
1820     bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberPtr);
1821     TELEPHONY_LOGI("CallControlManager SubscribeCommonEvent subscribeResult = %{public}d", subscribeResult);
1822     return TELEPHONY_SUCCESS;
1823 }
1824 
ContactsBroadcastSubscriber()1825 int32_t CallControlManager::SystemAbilityListener::ContactsBroadcastSubscriber()
1826 {
1827     EventFwk::MatchingSkills matchingSkills;
1828     matchingSkills.AddEvent("event.custom.contacts.PAGE_STATE_CHANGE");
1829     EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
1830     subscriberInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1831     subscriberInfo.SetPermission("ohos.permission.SET_TELEPHONY_STATE");
1832     std::shared_ptr<CallBroadcastSubscriber> subscriberPtr = std::make_shared<CallBroadcastSubscriber>(subscriberInfo);
1833     if (subscriberPtr == nullptr) {
1834         TELEPHONY_LOGE("ContactsBroadcastSubscriber subscriberPtr is nullptr");
1835         return TELEPHONY_ERROR;
1836     }
1837     subscriberPtrList_.emplace_back(subscriberPtr);
1838     bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberPtr);
1839     TELEPHONY_LOGI("CallControlManager SubscribeCommonEvent subscribeResult = %{public}d", subscribeResult);
1840     return TELEPHONY_SUCCESS;
1841 }
1842 
SatcommBroadcastSubscriber()1843 int32_t CallControlManager::SystemAbilityListener::SatcommBroadcastSubscriber()
1844 {
1845     EventFwk::MatchingSkills matchingSkills;
1846     matchingSkills.AddEvent("usual.event.thermal.satcomm.HIGH_TEMP_LEVEL");
1847     EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
1848     subscriberInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1849     subscriberInfo.SetPublisherUid(SATCOMM_UID);
1850     std::shared_ptr<CallBroadcastSubscriber> subscriberPtr = std::make_shared<CallBroadcastSubscriber>(subscriberInfo);
1851     if (subscriberPtr == nullptr) {
1852         TELEPHONY_LOGE("SatcommBroadcastSubscriber subscriberPtr is nullptr");
1853         return TELEPHONY_ERROR;
1854     }
1855     subscriberPtrList_.emplace_back(subscriberPtr);
1856     bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberPtr);
1857     TELEPHONY_LOGI("CallControlManager SubscribeCommonEvent subscribeResult = %{public}d", subscribeResult);
1858     return TELEPHONY_SUCCESS;
1859 }
1860 
SuperPrivacyModeBroadcastSubscriber()1861 int32_t CallControlManager::SystemAbilityListener::SuperPrivacyModeBroadcastSubscriber()
1862 {
1863     EventFwk::MatchingSkills matchingSkills;
1864     matchingSkills.AddEvent("usual.event.SUPER_PRIVACY_MODE");
1865     EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
1866     subscriberInfo.SetPublisherBundleName("com.settings");
1867     subscriberInfo.SetPermission("ohos.permission.SET_TELEPHONY_STATE");
1868     subscriberInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1869     std::shared_ptr<CallBroadcastSubscriber> subscriberPtr = std::make_shared<CallBroadcastSubscriber>(subscriberInfo);
1870     if (subscriberPtr == nullptr) {
1871         TELEPHONY_LOGE("SuperPrivacyModeBroadcastSubscriber subscriberPtr is nullptr");
1872         return TELEPHONY_ERROR;
1873     }
1874     subscriberPtrList_.emplace_back(subscriberPtr);
1875     bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberPtr);
1876     TELEPHONY_LOGI("CallControlManager SubscribeCommonEvent subscribeResult = %{public}d", subscribeResult);
1877     return TELEPHONY_SUCCESS;
1878 }
1879 
HSDRBroadcastSubscriber()1880 int32_t CallControlManager::SystemAbilityListener::HSDRBroadcastSubscriber()
1881 {
1882     EventFwk::MatchingSkills matchingSkillsHsdr_;
1883     matchingSkillsHsdr_.AddEvent("usual.event.HSDR_EVENT");
1884     EventFwk::CommonEventSubscribeInfo subscriberInfosHsdr_(matchingSkillsHsdr_);
1885     subscriberInfosHsdr_.SetPublisherBundleName("com.hsdr");
1886     subscriberInfosHsdr_.SetPermission("ohos.permission.securityguard.REPORT_SECURITY_INFO");
1887     subscriberInfosHsdr_.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1888     std::shared_ptr<CallBroadcastSubscriber> subscriberHsdr_ =
1889         std::make_shared<CallBroadcastSubscriber>(subscriberInfosHsdr_);
1890     if (subscriberHsdr_ == nullptr) {
1891         TELEPHONY_LOGE("CallControlManager::BroadcastSubscriber subscriberPtrs_ is nullptr");
1892         return TELEPHONY_ERROR;
1893     }
1894     subscriberPtrList_.emplace_back(subscriberHsdr_);
1895     bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberHsdr_);
1896     TELEPHONY_LOGI("CallControlManager SubscribeCommonEvent subscribeResult = %{public}d", subscribeResult);
1897     return TELEPHONY_SUCCESS;
1898 }
1899 
HfpBroadcastSubscriber()1900 int32_t CallControlManager::SystemAbilityListener::HfpBroadcastSubscriber()
1901 {
1902 #ifdef HFP_ASYNC_ENABLE
1903     EventFwk::MatchingSkills matchingSkillsHfp_;
1904     matchingSkillsHfp_.AddEvent("usual.event.bluetooth.CONNECT_HFP_HF");
1905     EventFwk::CommonEventSubscribeInfo subscriberInfosHfp_(matchingSkillsHfp_);
1906     subscriberInfosHfp_.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
1907     subscriberInfosHfp_.SetPermission("ohos.permission.MANAGR_SETTINGS");
1908     std::shared_ptr<CallBroadcastSubscriber> subscriberHfp_ =
1909         std::make_shared<CallBroadcastSubscriber>(subscriberInfosHfp_);
1910     if (subscriberHfp_ == nullptr) {
1911         TELEPHONY_LOGE("CallControlManager::BroadcastSubscriber subscriberPtrs is nullptr");
1912         return TELEPHONY_ERROR;
1913     }
1914     subscriberPtrList_.emplace_back(subscriberHfp_);
1915     bool subscribeResult = EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberHfp_);
1916     TELEPHONY_LOGI("CallControlManager SubscribeCommonEvent subscribeResult = %{public}d", subscribeResult);
1917 #endif
1918     return TELEPHONY_SUCCESS;
1919 }
1920 
SubscriberSaStateChange()1921 int32_t CallControlManager::SubscriberSaStateChange()
1922 {
1923     auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1924     if (samgrProxy == nullptr) {
1925         TELEPHONY_LOGE("samgrProxy is nullptr");
1926         return TELEPHONY_ERROR;
1927     }
1928     statusChangeListener_ = new (std::nothrow) SystemAbilityListener();
1929     if (statusChangeListener_ == nullptr) {
1930         TELEPHONY_LOGE("statusChangeListener_ is nullptr");
1931         return TELEPHONY_ERROR;
1932     }
1933     int32_t ret = samgrProxy->SubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, statusChangeListener_);
1934     TELEPHONY_LOGI("CallControlManager::SubscriberSaStateChange ret: %{public}d", ret);
1935     return TELEPHONY_SUCCESS;
1936 }
1937 
1938 #ifdef ABILITY_MEDIA_SUPPORT
onButtonDealing(HeadsetButtonService::ButtonEvent type)1939 bool CallControlManager::onButtonDealing(HeadsetButtonService::ButtonEvent type)
1940 {
1941     bool isRingState = false;
1942     sptr<CallBase> call = nullptr;
1943 
1944     if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING) != nullptr) {
1945         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
1946         isRingState = true;
1947     } else if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING) != nullptr) {
1948         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING);
1949     } else if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE) != nullptr) {
1950         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE);
1951     } else if (GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD) != nullptr) {
1952         call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD);
1953     } else {
1954         return false;
1955     }
1956 
1957     switch (type) {
1958         case HeadsetButtonService::SHORT_PRESS_EVENT:
1959             if (isRingState) {
1960                 call->HangUpCall();
1961             } else {
1962                 call->AnswerCall(0);
1963             }
1964             break;
1965         case HeadsetButtonService::LONG_PRESS_EVENT:
1966             if (isRingState) {
1967                 std::string str = "";
1968                 call->RejectCall(false, str);
1969             } else {
1970                 DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(true);
1971             }
1972             break;
1973         default:
1974             return false;
1975     }
1976     return true;
1977 }
1978 #endif
1979 #ifdef NOT_SUPPORT_MULTICALL
HangUpFirstCallBtAndESIM(int32_t secondCallId)1980 bool CallControlManager::HangUpFirstCallBtAndESIM(int32_t secondCallId)
1981 {
1982     if (!CallObjectManager::IsTwoCallBtCallAndESIM()) {
1983         return false;
1984     }
1985     HangUpFirstCallBySecondCallID(secondCallId, true);
1986     return true;
1987 }
1988 
HangUpFirstCallBtCall(int32_t secondCallId)1989 bool CallControlManager::HangUpFirstCallBtCall(int32_t secondCallId)
1990 {
1991     if (!CallObjectManager::IsTwoCallBtCall()) {
1992         return false;
1993     }
1994     HangUpFirstCallBySecondCallID(secondCallId);
1995     return true;
1996 }
1997 
HangUpFirstCallESIMCall(int32_t secondCallId)1998 bool CallControlManager::HangUpFirstCallESIMCall(int32_t secondCallId)
1999 {
2000     if (!CallObjectManager::IsTwoCallESIMCall()) {
2001         return false;
2002     }
2003     HangUpFirstCallBySecondCallID(secondCallId, true);
2004     return true;
2005 }
2006 
HangUpFirstCall(int32_t secondCallId)2007 bool CallControlManager::HangUpFirstCall(int32_t secondCallId)
2008 {
2009     if (CallObjectManager::IsTwoCallBtCallAndESIM()) {
2010         return HangUpFirstCallBtAndESIM(secondCallId);
2011     } else if (CallObjectManager::IsTwoCallBtCall()) {
2012         HangUpFirstCallBtCall(secondCallId);
2013     } else if (CallObjectManager::IsTwoCallESIMCall()) {
2014         return HangUpFirstCallESIMCall(secondCallId);
2015     }
2016     return false;
2017 }
2018 
HangUpFirstCallBySecondCallID(int32_t secondCallId,bool secondAutoAnswer)2019 void CallControlManager::HangUpFirstCallBySecondCallID(int32_t secondCallId, bool secondAutoAnswer)
2020 {
2021     sptr<CallBase> answerCall = CallObjectManager::GetOneCallObject(secondCallId);
2022     if (answerCall != nullptr &&
2023         (answerCall->GetTelCallState() == TelCallState::CALL_STATUS_INCOMING ||
2024         answerCall->GetTelCallState() == TelCallState::CALL_STATUS_WAITING)) {
2025         TELEPHONY_LOGI("AutoAnswerCall second callid=%{public}d", secondCallId);
2026         answerCall->SetAutoAnswerState(secondAutoAnswer);
2027     }
2028     std::list<sptr<CallBase>> allCallList = CallObjectManager::GetAllCallList();
2029     for (auto call : allCallList) {
2030         if (call->GetCallID() == secondCallId) {
2031             continue;
2032         }
2033         TelCallState telCallState = call->GetTelCallState();
2034         if (telCallState == TelCallState::CALL_STATUS_ACTIVE ||
2035             telCallState == TelCallState::CALL_STATUS_DIALING ||
2036             telCallState == TelCallState::CALL_STATUS_ALERTING) {
2037             TELEPHONY_LOGI("first call HangUpCall callid=%{public}d", call->GetCallID());
2038             int32_t ret = HangUpCall(call->GetCallID());
2039             if (ret != TELEPHONY_SUCCESS) {
2040                 TELEPHONY_LOGE("first call HangUpCall fail callid=%{public}d", call->GetCallID());
2041             }
2042         } else if (telCallState == TelCallState::CALL_STATUS_INCOMING ||
2043             telCallState == TelCallState::CALL_STATUS_WAITING) {
2044             TELEPHONY_LOGI("first call RejectCall callid=%{public}d", call->GetCallID());
2045             if (answerCall->GetAccountNumber() == call->GetAccountNumber()) {
2046                 break;
2047             }
2048             int32_t ret = RejectCall(call->GetCallID(), false, Str8ToStr16(""));
2049             if (ret != TELEPHONY_SUCCESS) {
2050                 TELEPHONY_LOGE("first call RejectCall fail callid=%{public}d", call->GetCallID());
2051             }
2052         }
2053         break;
2054     }
2055 }
2056 #endif
2057 } // namespace Telephony
2058 } // namespace OHOS
2059