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