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