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