1 /*
2 * Copyright (C) 2021-2025 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_status_manager.h"
17
18 #include <securec.h>
19
20 #include "antifraud_service.h"
21 #include "audio_control_manager.h"
22 #include "bluetooth_call.h"
23 #include "bluetooth_call_connection.h"
24 #include "bluetooth_call_service.h"
25 #include "bool_wrapper.h"
26 #include "call_ability_report_proxy.h"
27 #include "call_control_manager.h"
28 #include "call_earthquake_alarm_locator.h"
29 #include "call_manager_errors.h"
30 #include "call_manager_hisysevent.h"
31 #include "call_number_utils.h"
32 #include "call_request_event_handler_helper.h"
33 #include "call_state_processor.h"
34 #include "call_superprivacy_control_manager.h"
35 #include "call_voice_assistant_manager.h"
36 #include "cs_call.h"
37 #include "core_service_client.h"
38 #include "datashare_predicates.h"
39 #include "distributed_communication_manager.h"
40 #include "ffrt.h"
41 #include "hitrace_meter.h"
42 #include "ims_call.h"
43 #include "notification_helper.h"
44 #include "motion_recognition.h"
45 #include "os_account_manager.h"
46 #include "ott_call.h"
47 #include "parameters.h"
48 #include "report_call_info_handler.h"
49 #include "satellite_call.h"
50 #include "satellite_call_control.h"
51 #include "screen_sensor_plugin.h"
52 #include "settings_datashare_helper.h"
53 #include "spam_call_adapter.h"
54 #include "telephony_log_wrapper.h"
55 #include "uri.h"
56 #include "voip_call.h"
57 #include "want_params_wrapper.h"
58
59 namespace OHOS {
60 namespace Telephony {
61 constexpr int32_t INIT_INDEX = 0;
62 constexpr int32_t PRESENTATION_RESTRICTED = 3;
63 constexpr int32_t MAIN_USER_SPACE = 100;
64 const std::string ADVSECMODE_STATE = "ohos.boot.advsecmode.state";
65 int32_t CallStatusManager::deviceProvisioned_ = DEVICE_PROVISION_UNDEF;
66 sptr<OOBEStatusObserver> CallStatusManager::oobeStatusObserver_ = nullptr;
67
CallStatusManager()68 CallStatusManager::CallStatusManager()
69 {
70 (void)memset_s(&callReportInfo_, sizeof(CallDetailInfo), 0, sizeof(CallDetailInfo));
71 for (int32_t i = 0; i < SLOT_NUM; i++) {
72 (void)memset_s(&callDetailsInfo_[i], sizeof(CallDetailsInfo), 0, sizeof(CallDetailsInfo));
73 }
74 }
75
~CallStatusManager()76 CallStatusManager::~CallStatusManager()
77 {
78 UnInit();
79 }
80
Init()81 int32_t CallStatusManager::Init()
82 {
83 for (int32_t i = 0; i < SLOT_NUM; i++) {
84 callDetailsInfo_[i].callVec.clear();
85 tmpCallDetailsInfo_[i].callVec.clear();
86 }
87 for (int32_t i = 0; i < SLOT_NUM; i++) {
88 priorVideoState_[i] = VideoStateType::TYPE_VOICE;
89 }
90 mEventIdTransferMap_.clear();
91 mOttEventIdTransferMap_.clear();
92 InitCallBaseEvent();
93 CallIncomingFilterManagerPtr_ = (std::make_unique<CallIncomingFilterManager>()).release();
94 return TELEPHONY_SUCCESS;
95 }
96
InitCallBaseEvent()97 void CallStatusManager::InitCallBaseEvent()
98 {
99 mEventIdTransferMap_[RequestResultEventId::RESULT_DIAL_NO_CARRIER] = CallAbilityEventId::EVENT_DIAL_NO_CARRIER;
100 mEventIdTransferMap_[RequestResultEventId::RESULT_HOLD_SEND_FAILED] = CallAbilityEventId::EVENT_HOLD_CALL_FAILED;
101 mEventIdTransferMap_[RequestResultEventId::RESULT_SWAP_SEND_FAILED] = CallAbilityEventId::EVENT_SWAP_CALL_FAILED;
102 mOttEventIdTransferMap_[OttCallEventId::OTT_CALL_EVENT_FUNCTION_UNSUPPORTED] =
103 CallAbilityEventId::EVENT_OTT_FUNCTION_UNSUPPORTED;
104 mEventIdTransferMap_[RequestResultEventId::RESULT_COMBINE_SEND_FAILED] =
105 CallAbilityEventId::EVENT_COMBINE_CALL_FAILED;
106 mEventIdTransferMap_[RequestResultEventId::RESULT_SPLIT_SEND_FAILED] =
107 CallAbilityEventId::EVENT_SPLIT_CALL_FAILED;
108 }
109
UnInit()110 int32_t CallStatusManager::UnInit()
111 {
112 for (int32_t i = 0; i < SLOT_NUM; i++) {
113 callDetailsInfo_[i].callVec.clear();
114 tmpCallDetailsInfo_[i].callVec.clear();
115 }
116 mEventIdTransferMap_.clear();
117 mOttEventIdTransferMap_.clear();
118 return TELEPHONY_SUCCESS;
119 }
120
HandleCallReportInfo(const CallDetailInfo & info)121 int32_t CallStatusManager::HandleCallReportInfo(const CallDetailInfo &info)
122 {
123 int32_t ret = TELEPHONY_ERR_FAIL;
124 callReportInfo_ = info;
125 if (info.callType == CallType::TYPE_VOIP) {
126 return HandleVoipCallReportInfo(info);
127 }
128 if (info.callType == CallType::TYPE_BLUETOOTH) {
129 HandleBluetoothCallReportInfo(info);
130 }
131 switch (info.state) {
132 case TelCallState::CALL_STATUS_ACTIVE:
133 ret = ActiveHandle(info);
134 break;
135 case TelCallState::CALL_STATUS_HOLDING:
136 ret = HoldingHandle(info);
137 break;
138 case TelCallState::CALL_STATUS_DIALING: {
139 ret = DialingHandle(info);
140 FinishAsyncTrace(HITRACE_TAG_OHOS, "DialCall", getpid());
141 DelayedSingleton<CallManagerHisysevent>::GetInstance()->JudgingDialTimeOut(
142 info.accountId, static_cast<int32_t>(info.callType), static_cast<int32_t>(info.callMode));
143 break;
144 }
145 case TelCallState::CALL_STATUS_ALERTING:
146 ret = AlertHandle(info);
147 break;
148 case TelCallState::CALL_STATUS_INCOMING: {
149 DelayedSingleton<CallControlManager>::GetInstance()->AcquireIncomingLock();
150 ret = IncomingHandle(info);
151 DelayedSingleton<CallControlManager>::GetInstance()->ReleaseIncomingLock();
152 FinishAsyncTrace(HITRACE_TAG_OHOS, "InComingCall", getpid());
153 DelayedSingleton<CallManagerHisysevent>::GetInstance()->JudgingIncomingTimeOut(
154 info.accountId, static_cast<int32_t>(info.callType), static_cast<int32_t>(info.callMode));
155 break;
156 }
157 case TelCallState::CALL_STATUS_WAITING:
158 case TelCallState::CALL_STATUS_DISCONNECTED:
159 case TelCallState::CALL_STATUS_DISCONNECTING:
160 ret = HandleCallReportInfoEx(info);
161 break;
162 default:
163 TELEPHONY_LOGE("Invalid call state!");
164 break;
165 }
166 TELEPHONY_LOGI("Entry CallStatusManager HandleCallReportInfo");
167 HandleDsdaInfo(info.accountId);
168 DelayedSingleton<BluetoothCallService>::GetInstance()->GetCallState();
169 TELEPHONY_LOGI("End CallStatusManager HandleCallReportInfo");
170 return ret;
171 }
172
HandleBluetoothCallReportInfo(const CallDetailInfo & info)173 void CallStatusManager::HandleBluetoothCallReportInfo(const CallDetailInfo &info)
174 {
175 if (info.state == TelCallState::CALL_STATUS_WAITING || info.state == TelCallState::CALL_STATUS_INCOMING) {
176 return;
177 }
178 sptr<CallBase> call = nullptr;
179 if (info.index > 0) {
180 if (info.state == TelCallState::CALL_STATUS_DIALING || info.state == TelCallState::CALL_STATUS_ALERTING) {
181 call = GetOneCallObjectByIndexSlotIdAndCallType(INIT_INDEX, info.accountId, info.callType);
182 if (call != nullptr) {
183 BtCallDialingHandleFirst(call, info);
184 return;
185 }
186 }
187 if (call == nullptr) {
188 call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
189 }
190 if (call != nullptr) {
191 return;
192 }
193 } else {
194 return;
195 }
196 if (call == nullptr) {
197 call = CreateNewCall(info, CallDirection::CALL_DIRECTION_OUT);
198 if (call == nullptr) {
199 TELEPHONY_LOGE("Call is NULL");
200 return;
201 }
202 AddOneCallObject(call);
203 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
204 }
205 return;
206 }
207
HandleDsdaInfo(int32_t slotId)208 void CallStatusManager::HandleDsdaInfo(int32_t slotId)
209 {
210 int32_t dsdsMode = DSDS_MODE_V2;
211 bool noOtherCall = true;
212 std::list<int32_t> callIdList;
213 GetCarrierCallList(callIdList);
214 int32_t currentCallNum = GetCurrentCallNum();
215 DelayedSingleton<CallRequestProcess>::GetInstance()->IsExistCallOtherSlot(callIdList, slotId, noOtherCall);
216 DelayedRefSingleton<CoreServiceClient>::GetInstance().GetDsdsMode(dsdsMode);
217 TELEPHONY_LOGI("dsdsMode:%{public}d", dsdsMode);
218 if ((dsdsMode == static_cast<int32_t>(DsdsMode::DSDS_MODE_V5_DSDA) ||
219 dsdsMode == static_cast<int32_t>(DsdsMode::DSDS_MODE_V5_TDM)) &&
220 !noOtherCall) {
221 TELEPHONY_LOGI("Handle DsdaCallInfo");
222 sptr<CallBase> holdCall = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD);
223 if (holdCall != nullptr && currentCallNum > CALL_NUMBER) {
224 holdCall->SetCanUnHoldState(false);
225 }
226 }
227 }
228
229 // handle call state changes, incoming call, outgoing call.
HandleCallsReportInfo(const CallDetailsInfo & info)230 int32_t CallStatusManager::HandleCallsReportInfo(const CallDetailsInfo &info)
231 {
232 bool flag = false;
233 TELEPHONY_LOGI("call list size:%{public}zu,slotId:%{public}d", info.callVec.size(), info.slotId);
234 int32_t curSlotId = info.slotId;
235 if (!DelayedSingleton<CallNumberUtils>::GetInstance()->IsValidSlotId(curSlotId)) {
236 TELEPHONY_LOGE("invalid slotId!");
237 return CALL_ERR_INVALID_SLOT_ID;
238 }
239 tmpCallDetailsInfo_[curSlotId].callVec.clear();
240 tmpCallDetailsInfo_[curSlotId] = info;
241 for (auto &it : info.callVec) {
242 for (const auto &it1 : callDetailsInfo_[curSlotId].callVec) {
243 if (it.index == it1.index) {
244 // call state changes
245 if (it.state != it1.state || it.mpty != it1.mpty || it.callType != it1.callType
246 || it.callMode != it1.callMode || it.state == TelCallState::CALL_STATUS_ALERTING) {
247 TELEPHONY_LOGI("handle updated call state:%{public}d", it.state);
248 HandleCallReportInfo(it);
249 }
250 flag = true;
251 break;
252 }
253 }
254 // incoming/outgoing call handle
255 if (!flag || callDetailsInfo_[curSlotId].callVec.empty()) {
256 HandleConnectingCallReportInfo(it);
257 }
258 flag = false;
259 }
260 // disconnected calls handle
261 for (auto &it2 : callDetailsInfo_[curSlotId].callVec) {
262 for (const auto &it3 : info.callVec) {
263 if (it2.index == it3.index) {
264 TELEPHONY_LOGI("state:%{public}d", it2.state);
265 flag = true;
266 break;
267 }
268 }
269 if (!flag) {
270 it2.state = TelCallState::CALL_STATUS_DISCONNECTED;
271 HandleCallReportInfo(it2);
272 }
273 flag = false;
274 }
275 UpdateCallDetailsInfo(info);
276 return TELEPHONY_SUCCESS;
277 }
278
HandleConnectingCallReportInfo(const CallDetailInfo & info)279 void CallStatusManager::HandleConnectingCallReportInfo(const CallDetailInfo &info)
280 {
281 int32_t callId = ERR_ID;
282 bool isMeetimeActiveCallExist = CallObjectManager::IsVoipCallExist(TelCallState::CALL_STATUS_ACTIVE, callId);
283 CallDetailInfo tempInfo = info;
284 TELEPHONY_LOGI("handle new call state:%{public}d, isMeetimeActiveCallExist:%{public}d",
285 info.state, isMeetimeActiveCallExist);
286 if (isMeetimeActiveCallExist && info.state == TelCallState::CALL_STATUS_INCOMING) {
287 tempInfo.state = TelCallState::CALL_STATUS_WAITING;
288 }
289 HandleCallReportInfo(tempInfo);
290 }
291
UpdateCallDetailsInfo(const CallDetailsInfo & info)292 void CallStatusManager::UpdateCallDetailsInfo(const CallDetailsInfo &info)
293 {
294 int32_t curSlotId = info.slotId;
295 callDetailsInfo_[curSlotId].callVec.clear();
296 callDetailsInfo_[curSlotId] = info;
297 auto condition = [](CallDetailInfo i) { return i.state == TelCallState::CALL_STATUS_DISCONNECTED; };
298 auto it_end = std::remove_if(callDetailsInfo_[curSlotId].callVec.begin(),
299 callDetailsInfo_[curSlotId].callVec.end(), condition);
300 callDetailsInfo_[curSlotId].callVec.erase(it_end, callDetailsInfo_[curSlotId].callVec.end());
301 if (callDetailsInfo_[curSlotId].callVec.empty()) {
302 TELEPHONY_LOGI("clear tmpCallDetailsInfo");
303 tmpCallDetailsInfo_[curSlotId].callVec.clear();
304 }
305 TELEPHONY_LOGI("End CallStatusManager HandleCallsReportInfo slotId:%{public}d, "
306 "callDetailsInfo_ size:%{public}zu", info.slotId, callDetailsInfo_[curSlotId].callVec.size());
307 }
308
HandleVoipCallReportInfo(const CallDetailInfo & info)309 int32_t CallStatusManager::HandleVoipCallReportInfo(const CallDetailInfo &info)
310 {
311 TELEPHONY_LOGI("Entry CallStatusManager HandleVoipCallReportInfo");
312 int32_t ret = TELEPHONY_ERR_FAIL;
313 switch (info.state) {
314 case TelCallState::CALL_STATUS_ACTIVE:
315 ret = ActiveVoipCallHandle(info);
316 break;
317 case TelCallState::CALL_STATUS_INCOMING: {
318 ret = IncomingVoipCallHandle(info);
319 break;
320 }
321 case TelCallState::CALL_STATUS_DISCONNECTED:
322 ret = DisconnectedVoipCallHandle(info);
323 break;
324 case TelCallState::CALL_STATUS_DIALING:
325 ret = OutgoingVoipCallHandle(info);
326 break;
327 case TelCallState::CALL_STATUS_ANSWERED:
328 ret = AnsweredVoipCallHandle(info);
329 break;
330 case TelCallState::CALL_STATUS_DISCONNECTING:
331 ret = DisconnectingVoipCallHandle(info);
332 break;
333 default:
334 TELEPHONY_LOGE("Invalid call state!");
335 break;
336 }
337 return ret;
338 }
339
HandleDisconnectedCause(const DisconnectedDetails & details)340 int32_t CallStatusManager::HandleDisconnectedCause(const DisconnectedDetails &details)
341 {
342 bool ret = DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallDestroyed(details);
343 if (!ret) {
344 TELEPHONY_LOGI("NotifyCallDestroyed failed!");
345 return CALL_ERR_PHONE_CALLSTATE_NOTIFY_FAILED;
346 }
347 return TELEPHONY_SUCCESS;
348 }
349
HandleEventResultReportInfo(const CellularCallEventInfo & info)350 int32_t CallStatusManager::HandleEventResultReportInfo(const CellularCallEventInfo &info)
351 {
352 if (info.eventType != CellularCallEventType::EVENT_REQUEST_RESULT_TYPE) {
353 TELEPHONY_LOGE("unexpected type event occurs, eventId:%{public}d", info.eventId);
354 return CALL_ERR_PHONE_TYPE_UNEXPECTED;
355 }
356 TELEPHONY_LOGI("recv one Event, eventId:%{public}d", info.eventId);
357 sptr<CallBase> call = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING);
358 if (call != nullptr) {
359 int32_t ret = DealFailDial(call);
360 TELEPHONY_LOGI("DealFailDial ret:%{public}d", ret);
361 }
362 CallEventInfo eventInfo;
363 (void)memset_s(&eventInfo, sizeof(CallEventInfo), 0, sizeof(CallEventInfo));
364 if (mEventIdTransferMap_.find(info.eventId) != mEventIdTransferMap_.end()) {
365 eventInfo.eventId = mEventIdTransferMap_[info.eventId];
366 DialParaInfo dialInfo;
367 if (eventInfo.eventId == CallAbilityEventId::EVENT_DIAL_NO_CARRIER) {
368 DelayedSingleton<CallControlManager>::GetInstance()->GetDialParaInfo(dialInfo);
369 if (dialInfo.number.length() > static_cast<size_t>(kMaxNumberLen)) {
370 TELEPHONY_LOGE("Number out of limit!");
371 return CALL_ERR_NUMBER_OUT_OF_RANGE;
372 }
373 if (memcpy_s(eventInfo.phoneNum, kMaxNumberLen, dialInfo.number.c_str(), dialInfo.number.length()) != EOK) {
374 TELEPHONY_LOGE("memcpy_s failed!");
375 return TELEPHONY_ERR_MEMCPY_FAIL;
376 }
377 } else if (eventInfo.eventId == CallAbilityEventId::EVENT_COMBINE_CALL_FAILED) {
378 sptr<CallBase> activeCall = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE);
379 if (activeCall != nullptr) {
380 activeCall->HandleCombineConferenceFailEvent();
381 }
382 } else if (eventInfo.eventId == CallAbilityEventId::EVENT_HOLD_CALL_FAILED) {
383 needWaitHold_ = false;
384 }
385 DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallEventUpdated(eventInfo);
386 } else {
387 TELEPHONY_LOGW("unknown type Event, eventid %{public}d", info.eventId);
388 }
389 return TELEPHONY_SUCCESS;
390 }
391
HandleOttEventReportInfo(const OttCallEventInfo & info)392 int32_t CallStatusManager::HandleOttEventReportInfo(const OttCallEventInfo &info)
393 {
394 TELEPHONY_LOGI("recv one Event, eventId:%{public}d", info.ottCallEventId);
395 CallEventInfo eventInfo;
396 (void)memset_s(&eventInfo, sizeof(CallEventInfo), 0, sizeof(CallEventInfo));
397 if (mOttEventIdTransferMap_.find(info.ottCallEventId) != mOttEventIdTransferMap_.end()) {
398 eventInfo.eventId = mOttEventIdTransferMap_[info.ottCallEventId];
399 if (strlen(info.bundleName) > static_cast<size_t>(kMaxNumberLen)) {
400 TELEPHONY_LOGE("Number out of limit!");
401 return CALL_ERR_NUMBER_OUT_OF_RANGE;
402 }
403 if (memcpy_s(eventInfo.bundleName, kMaxNumberLen, info.bundleName, strlen(info.bundleName)) != EOK) {
404 TELEPHONY_LOGE("memcpy_s failed!");
405 return TELEPHONY_ERR_MEMCPY_FAIL;
406 }
407 DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallEventUpdated(eventInfo);
408 } else {
409 TELEPHONY_LOGW("unknown type Event, eventid %{public}d", info.ottCallEventId);
410 }
411 return TELEPHONY_SUCCESS;
412 }
413
HandleVoipEventReportInfo(const VoipCallEventInfo & info)414 int32_t CallStatusManager::HandleVoipEventReportInfo(const VoipCallEventInfo &info)
415 {
416 TELEPHONY_LOGI("recv one Event, eventId:%{public}d", info.voipCallEvent);
417 sptr<CallBase> call = GetOneCallObjectByVoipCallId(info.voipCallId, info.bundleName, info.uid);
418 if (call == nullptr) {
419 TELEPHONY_LOGE("voip call is null");
420 return TELEPHONY_ERR_LOCAL_PTR_NULL;
421 }
422 if (call->GetCallRunningState() != CallRunningState::CALL_RUNNING_STATE_ACTIVE
423 && call->GetCallRunningState() != CallRunningState::CALL_RUNNING_STATE_DIALING) {
424 return TELEPHONY_ERR_FAIL;
425 }
426 if (info.voipCallEvent == VoipCallEvent::VOIP_CALL_EVENT_MUTED) {
427 call->SetMicPhoneState(true);
428 } else if (info.voipCallEvent == VoipCallEvent::VOIP_CALL_EVENT_UNMUTED) {
429 call->SetMicPhoneState(false);
430 AudioDevice device = {
431 .deviceType = AudioDeviceType::DEVICE_EARPIECE,
432 .address = { 0 },
433 };
434 if (DelayedSingleton<AudioProxy>::GetInstance()->GetPreferredOutputAudioDevice(device, true) ==
435 TELEPHONY_SUCCESS) {
436 DelayedSingleton<AudioDeviceManager>::GetInstance()->SetCurrentAudioDevice(device);
437 }
438 }
439 DelayedSingleton<AudioDeviceManager>::GetInstance()->ReportAudioDeviceInfo(call);
440 return TELEPHONY_SUCCESS;
441 }
442
IncomingHandle(const CallDetailInfo & info)443 int32_t CallStatusManager::IncomingHandle(const CallDetailInfo &info)
444 {
445 TELEPHONY_LOGI("handle incoming state");
446 detectStartTime = std::chrono::system_clock::from_time_t(0);
447 int32_t ret = TELEPHONY_SUCCESS;
448 bool isExisted = false;
449 ret = RefreshOldCall(info, isExisted);
450 if (isExisted) {
451 return ret;
452 }
453 if (info.callType == CallType::TYPE_CS || info.callType == CallType::TYPE_IMS ||
454 info.callType == CallType::TYPE_SATELLITE) {
455 ret = IncomingFilterPolicy(info);
456 if (ret != TELEPHONY_SUCCESS) {
457 return ret;
458 }
459 }
460 sptr<CallBase> call = CreateNewCall(info, CallDirection::CALL_DIRECTION_IN);
461 if (call == nullptr) {
462 TELEPHONY_LOGE("CreateNewCall failed!");
463 return CALL_ERR_CALL_OBJECT_IS_NULL;
464 }
465 if (IsFromTheSameNumberAtTheSameTime(call)) {
466 ModifyEsimType();
467 }
468 SetContactInfo(call, std::string(info.phoneNum));
469 bool block = false;
470 if (IsRejectCall(call, info, block)) {
471 return HandleRejectCall(call, block);
472 }
473 if (info.callType != CallType::TYPE_VOIP && info.callType != CallType::TYPE_BLUETOOTH &&
474 IsRingOnceCall(call, info)) {
475 return HandleRingOnceCall(call);
476 }
477 HandleVideoCallInAdvsecMode(call, info);
478 AddOneCallObject(call);
479 StartInComingCallMotionRecognition();
480 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
481 ret = UpdateCallState(call, info.state);
482 if (ret != TELEPHONY_SUCCESS) {
483 TELEPHONY_LOGE("UpdateCallState failed!");
484 return ret;
485 }
486 ret = FilterResultsDispose(call);
487 if (ret != TELEPHONY_SUCCESS) {
488 TELEPHONY_LOGE("FilterResultsDispose failed!");
489 }
490 DelayedSingleton<CallControlManager>::GetInstance()->StartFlashRemind();
491 return ret;
492 }
493
HandleVideoCallInAdvsecMode(const sptr<CallBase> & call,const CallDetailInfo & info)494 void CallStatusManager::HandleVideoCallInAdvsecMode(const sptr<CallBase> &call, const CallDetailInfo &info)
495 {
496 if (call->GetVideoStateType() != VideoStateType::TYPE_VIDEO) {
497 return;
498 }
499 if (call->GetCallType() != CallType::TYPE_IMS) {
500 return;
501 }
502 std::string phoneNumber(info.phoneNum);
503 NumberMarkInfo numberMarkInfo = call->GetNumberMarkInfo();
504 if (IsTrustedNumber(numberMarkInfo.markType, phoneNumber)) {
505 return;
506 }
507 if (OHOS::system::GetBoolParameter(ADVSECMODE_STATE, false)) {
508 TELEPHONY_LOGI("is video call in AdvsecMode.");
509 call->SetForcedReportVoiceCall(true);
510 }
511 }
512
IsTrustedNumber(MarkType markType,std::string phoneNumber)513 bool CallStatusManager::IsTrustedNumber(MarkType markType, std::string phoneNumber)
514 {
515 if (markType == MarkType::MARK_TYPE_YELLOW_PAGE ||
516 markType == MarkType::MARK_TYPE_ENTERPRISE ||
517 IsContactPhoneNum(phoneNumber)) {
518 return true;
519 }
520 return false;
521 }
522
SetContactInfo(sptr<CallBase> & call,std::string phoneNum)523 void CallStatusManager::SetContactInfo(sptr<CallBase> &call, std::string phoneNum)
524 {
525 if (call == nullptr) {
526 TELEPHONY_LOGE("CreateVoipCall failed!");
527 return;
528 }
529 ContactInfo contactInfo = {
530 .name = "",
531 .number = phoneNum,
532 .isContacterExists = false,
533 .ringtonePath = "",
534 .isSendToVoicemail = false,
535 .isEcc = false,
536 .isVoiceMail = false,
537 .isQueryComplete = true,
538 };
539 if (call->GetCallType() == CallType::TYPE_BLUETOOTH && SetBluetoothCallContactInfo(call, contactInfo, phoneNum)) {
540 return;
541 }
542 ffrt::submit([=, &call]() {
543 if (call == nullptr) {
544 TELEPHONY_LOGE("Call is nullptr.");
545 return;
546 }
547 sptr<CallBase> callObjectPtr = call;
548 // allow list filtering
549 // Get the contact data from the database
550 ContactInfo contactInfoTemp = contactInfo;
551 QueryCallerInfo(contactInfoTemp, phoneNum);
552 if (!CallVoiceAssistantManager::GetInstance()->IsStartVoiceBroadcast()) {
553 if (DelayedSingleton<AudioControlManager>::GetInstance()->NeedPlayVideoRing(
554 contactInfoTemp, callObjectPtr)) {
555 AAFwk::WantParams params = callObjectPtr->GetExtraParams();
556 params.SetParam("VideoRingPath", AAFwk::String::Box(std::string(contactInfoTemp.ringtonePath)));
557 callObjectPtr->SetExtraParams(params);
558 }
559 }
560 callObjectPtr->SetCallerInfo(contactInfoTemp);
561 CallVoiceAssistantManager::GetInstance()->UpdateContactInfo(contactInfoTemp, callObjectPtr->GetCallID());
562 DelayedSingleton<DistributedCommunicationManager>::GetInstance()->ProcessCallInfo(callObjectPtr,
563 DistributedDataType::NAME);
564 });
565 }
566
SetBluetoothCallContactInfo(sptr<CallBase> & call,ContactInfo & contactInfo,std::string phoneNum)567 bool CallStatusManager::SetBluetoothCallContactInfo(sptr<CallBase> &call, ContactInfo &contactInfo,
568 std::string phoneNum)
569 {
570 std::string contactName = DelayedSingleton<BluetoothCallConnection>::GetInstance()->GetHfpContactName(
571 phoneNum);
572 if (!contactName.empty()) {
573 contactInfo.name = contactName;
574 contactInfo.isContacterExists = true;
575 call->SetCallerInfo(contactInfo);
576 AAFwk::WantParams params = call->GetExtraParams();
577 params.SetParam("BtCallContactName", AAFwk::String::Box(contactName));
578 call->SetExtraParams(params);
579 TELEPHONY_LOGI("SetCallerInfo end for type bluetooth.");
580 return true;
581 }
582 return false;
583 }
584
HandleRejectCall(sptr<CallBase> & call,bool isBlock)585 int32_t CallStatusManager::HandleRejectCall(sptr<CallBase> &call, bool isBlock)
586 {
587 if (call == nullptr) {
588 TELEPHONY_LOGE("call is nullptr!");
589 return TELEPHONY_ERR_LOCAL_PTR_NULL;
590 }
591 int32_t ret = call->SetTelCallState(TelCallState::CALL_STATUS_INCOMING);
592 if (ret != TELEPHONY_SUCCESS && ret != CALL_ERR_NOT_NEW_STATE) {
593 TELEPHONY_LOGE("Set CallState failed!");
594 return ret;
595 }
596 ret = call->RejectCall();
597 if (ret != TELEPHONY_SUCCESS) {
598 TELEPHONY_LOGE("RejectCall failed!");
599 return ret;
600 }
601 if (isBlock) {
602 return DelayedSingleton<CallControlManager>::GetInstance()->AddBlockLogAndNotification(call);
603 }
604 return DelayedSingleton<CallControlManager>::GetInstance()->AddCallLogAndNotification(call);
605 }
606
IncomingVoipCallHandle(const CallDetailInfo & info)607 int32_t CallStatusManager::IncomingVoipCallHandle(const CallDetailInfo &info)
608 {
609 int32_t ret = TELEPHONY_ERROR;
610 sptr<CallBase> call = GetOneCallObjectByVoipCallId(
611 info.voipCallInfo.voipCallId, info.voipCallInfo.voipBundleName, info.voipCallInfo.uid);
612 if (call != nullptr) {
613 return TELEPHONY_SUCCESS;
614 }
615 call = CreateNewCall(info, CallDirection::CALL_DIRECTION_IN);
616 if (call == nullptr) {
617 TELEPHONY_LOGE("CreateVoipCall failed!");
618 return CALL_ERR_CALL_OBJECT_IS_NULL;
619 }
620 AddOneCallObject(call);
621 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
622 ret = UpdateCallState(call, info.state);
623 if (ret != TELEPHONY_SUCCESS) {
624 TELEPHONY_LOGE("UpdateCallState failed!");
625 return ret;
626 }
627 return ret;
628 }
629
OutgoingVoipCallHandle(const CallDetailInfo & info)630 int32_t CallStatusManager::OutgoingVoipCallHandle(const CallDetailInfo &info)
631 {
632 int32_t ret = TELEPHONY_ERROR;
633 sptr<CallBase> call = GetOneCallObjectByVoipCallId(
634 info.voipCallInfo.voipCallId, info.voipCallInfo.voipBundleName, info.voipCallInfo.uid);
635 if (call != nullptr) {
636 VideoStateType originalType = call->GetVideoStateType();
637 if (originalType != info.callMode) {
638 TELEPHONY_LOGI("change VideoStateType from %{public}d to %{public}d",
639 static_cast<int32_t>(originalType), static_cast<int32_t>(info.callMode));
640 call->SetVideoStateType(info.callMode);
641 }
642 sptr<VoIPCall> voipCall = reinterpret_cast<VoIPCall *>(call.GetRefPtr());
643 if (voipCall != nullptr) {
644 voipCall->UpdateCallAttributeInfo(info);
645 }
646 return UpdateCallState(call, info.state);
647 }
648 call = CreateNewCall(info, CallDirection::CALL_DIRECTION_OUT);
649 if (call == nullptr) {
650 TELEPHONY_LOGE("CreateVoipCall failed!");
651 return CALL_ERR_CALL_OBJECT_IS_NULL;
652 }
653 AddOneCallObject(call);
654 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
655 ret = UpdateCallState(call, info.state);
656 if (ret != TELEPHONY_SUCCESS) {
657 TELEPHONY_LOGE("UpdateCallState failed!");
658 return ret;
659 }
660 return ret;
661 }
662
AnsweredVoipCallHandle(const CallDetailInfo & info)663 int32_t CallStatusManager::AnsweredVoipCallHandle(const CallDetailInfo &info)
664 {
665 int32_t ret = TELEPHONY_ERROR;
666 sptr<CallBase> call = GetOneCallObjectByVoipCallId(
667 info.voipCallInfo.voipCallId, info.voipCallInfo.voipBundleName, info.voipCallInfo.uid);
668 if (call == nullptr) {
669 return ret;
670 }
671 if (DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallStateUpdated(
672 call, TelCallState::CALL_STATUS_INCOMING, TelCallState::CALL_STATUS_ANSWERED)) {
673 return TELEPHONY_SUCCESS;
674 } else {
675 return ret;
676 }
677 }
678
DisconnectingVoipCallHandle(const CallDetailInfo & info)679 int32_t CallStatusManager::DisconnectingVoipCallHandle(const CallDetailInfo &info)
680 {
681 sptr<CallBase> call = GetOneCallObjectByVoipCallId(
682 info.voipCallInfo.voipCallId, info.voipCallInfo.voipBundleName, info.voipCallInfo.uid);
683 if (call == nullptr) {
684 return TELEPHONY_ERROR;
685 }
686 return UpdateCallState(call, TelCallState::CALL_STATUS_DISCONNECTING);
687 }
688
QueryCallerInfo(ContactInfo & contactInfo,std::string phoneNum)689 void CallStatusManager::QueryCallerInfo(ContactInfo &contactInfo, std::string phoneNum)
690 {
691 TELEPHONY_LOGI("Entry CallStatusManager QueryCallerInfo");
692 std::shared_ptr<CallDataBaseHelper> callDataPtr = DelayedSingleton<CallDataBaseHelper>::GetInstance();
693 if (callDataPtr == nullptr) {
694 TELEPHONY_LOGE("callDataPtr is nullptr!");
695 return;
696 }
697 DataShare::DataSharePredicates predicates;
698 predicates.EqualTo(TYPE_ID, 5); // type 5 means query number
699 predicates.And();
700 predicates.EqualTo(IS_DELETED, 0);
701 predicates.And();
702 #ifdef TELEPHONY_CUST_SUPPORT
703 TELEPHONY_LOGI("telephony cust support.");
704 if (phoneNum.length() >= static_cast<size_t>(QUERY_CONTACT_LEN)) {
705 TELEPHONY_LOGI("phoneNum is longer than 7");
706 predicates.BeginWrap();
707 predicates.EndsWith(DETAIL_INFO, phoneNum.substr(phoneNum.length() - QUERY_CONTACT_LEN));
708 predicates.Or();
709 predicates.EndsWith(FORMAT_PHONE_NUMBER, phoneNum.substr(phoneNum.length() - QUERY_CONTACT_LEN));
710 predicates.EndWrap();
711 if (!callDataPtr->QueryContactInfoEnhanced(contactInfo, predicates)) {
712 TELEPHONY_LOGE("Query contact database enhanced fail!");
713 }
714 return;
715 }
716 #endif
717 predicates.EqualTo(DETAIL_INFO, phoneNum);
718 if (!callDataPtr->Query(contactInfo, predicates)) {
719 TELEPHONY_LOGE("Query contact database fail!");
720 }
721 }
722
IncomingFilterPolicy(const CallDetailInfo & info)723 int32_t CallStatusManager::IncomingFilterPolicy(const CallDetailInfo &info)
724 {
725 if (CallIncomingFilterManagerPtr_ == nullptr) {
726 TELEPHONY_LOGE("CallIncomingFilterManagerPtr_ is null");
727 return TELEPHONY_ERR_LOCAL_PTR_NULL;
728 }
729 return CallIncomingFilterManagerPtr_->DoIncomingFilter(info);
730 }
731
CallFilterCompleteResult(const CallDetailInfo & info)732 void CallStatusManager::CallFilterCompleteResult(const CallDetailInfo &info)
733 {
734 int32_t ret = TELEPHONY_ERR_FAIL;
735 sptr<CallBase> call = CreateNewCall(info, CallDirection::CALL_DIRECTION_IN);
736 if (call == nullptr) {
737 TELEPHONY_LOGE("CreateNewCall failed!");
738 return;
739 }
740 AddOneCallObject(call);
741 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
742 ret = UpdateCallState(call, info.state);
743 if (ret != TELEPHONY_SUCCESS) {
744 TELEPHONY_LOGE("UpdateCallState failed!");
745 return;
746 }
747 ret = FilterResultsDispose(call);
748 if (ret != TELEPHONY_SUCCESS) {
749 TELEPHONY_LOGE("FilterResultsDispose failed!");
750 return;
751 }
752 }
753
UpdateDialingCallInfo(const CallDetailInfo & info)754 int32_t CallStatusManager::UpdateDialingCallInfo(const CallDetailInfo &info)
755 {
756 TELEPHONY_LOGI("UpdateDialingCallInfo start.");
757 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
758 if (call != nullptr) {
759 TELEPHONY_LOGI("RefreshCallIfNecessary for not null.");
760 call = RefreshCallIfNecessary(call, info);
761 return TELEPHONY_SUCCESS;
762 }
763 call = GetOneCallObjectByIndex(INIT_INDEX);
764 if (call == nullptr) {
765 TELEPHONY_LOGE("call is nullptr");
766 return TELEPHONY_ERR_LOCAL_PTR_NULL;
767 }
768
769 std::string oriNum = call->GetAccountNumber();
770 TELEPHONY_LOGI("RefreshCallIfNecessary");
771 call = RefreshCallIfNecessary(call, info);
772 call->SetCallIndex(info.index);
773 call->SetBundleName(info.bundleName);
774 call->SetSlotId(info.accountId);
775 call->SetTelCallState(info.state);
776 call->SetVideoStateType(info.callMode);
777 call->SetCallType(info.callType);
778 call->SetAccountNumber(oriNum);
779 ClearPendingState(call);
780 return TELEPHONY_SUCCESS;
781 }
782
DialingHandle(const CallDetailInfo & info)783 int32_t CallStatusManager::DialingHandle(const CallDetailInfo &info)
784 {
785 TELEPHONY_LOGI("handle dialing state, index: %{public}d", info.index);
786 bool isDistributedDeviceDialing = false;
787 if (info.index > 0) {
788 if (UpdateDialingHandle(info, isDistributedDeviceDialing)) {
789 return UpdateDialingCallInfo(info);
790 }
791 }
792 sptr<CallBase> call = CreateNewCall(info, CallDirection::CALL_DIRECTION_OUT);
793 if (call == nullptr) {
794 TELEPHONY_LOGE("CreateNewCall failed!");
795 return TELEPHONY_ERR_LOCAL_PTR_NULL;
796 }
797 SetDistributedDeviceDialing(call, isDistributedDeviceDialing);
798 if (IsDcCallConneceted()) {
799 SetContactInfo(call, std::string(info.phoneNum));
800 }
801 AddOneCallObject(call);
802 auto callRequestEventHandler = DelayedSingleton<CallRequestEventHandlerHelper>::GetInstance();
803 if (info.index == INIT_INDEX) {
804 callRequestEventHandler->SetPendingMo(true, call->GetCallID());
805 call->SetPhoneOrWatchDial(static_cast<int32_t>(PhoneOrWatchDial::WATCH_DIAL));
806 SetBtCallDialByPhone(call, false);
807 StartOutGoingCallMotionRecognition();
808 }
809 callRequestEventHandler->RestoreDialingFlag(false);
810 callRequestEventHandler->RemoveEventHandlerTask();
811 int32_t ret = call->DialingProcess();
812 if (ret != TELEPHONY_SUCCESS) {
813 return ret;
814 }
815 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
816 MyLocationEngine::StartEccService(call, info);
817 ret = UpdateCallState(call, TelCallState::CALL_STATUS_DIALING);
818 if (ret != TELEPHONY_SUCCESS) {
819 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
820 }
821 return ret;
822 }
823
UpdateDialingHandle(const CallDetailInfo & info,bool & isDistributedDeviceDialing)824 bool CallStatusManager::UpdateDialingHandle(const CallDetailInfo &info, bool &isDistributedDeviceDialing)
825 {
826 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(INIT_INDEX, info.accountId, info.callType);
827 if (info.callType == CallType::TYPE_BLUETOOTH) {
828 BtCallDialingHandle(call, info);
829 } else {
830 if (call == nullptr) {
831 call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
832 isDistributedDeviceDialing = IsDistributeCallSourceStatus();
833 }
834 }
835 if (call != nullptr) {
836 TELEPHONY_LOGI("need update call info");
837 return true;
838 }
839 return false;
840 }
841
ActiveHandle(const CallDetailInfo & info)842 int32_t CallStatusManager::ActiveHandle(const CallDetailInfo &info)
843 {
844 TELEPHONY_LOGI("handle active state");
845 StopCallMotionRecognition(TelCallState::CALL_STATUS_ACTIVE);
846 std::string tmpStr(info.phoneNum);
847 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
848 if (call == nullptr && IsDcCallConneceted()) {
849 TELEPHONY_LOGW("need create new call.");
850 CreateAndSaveNewCall(info, CallDirection::CALL_DIRECTION_UNKNOW);
851 call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
852 }
853 if (call == nullptr && !RefreshDialingStateByOtherState(call, info)) {
854 TELEPHONY_LOGE("Call is NULL");
855 return TELEPHONY_ERR_LOCAL_PTR_NULL;
856 }
857 ClearPendingState(call);
858 TELEPHONY_LOGI("refresh call.");
859 call = RefreshCallIfNecessary(call, info);
860 SetOriginalCallTypeForActiveState(call);
861 // call state change active, need to judge if launching a conference
862 std::vector<sptr<CallBase>> conferenceCallList = GetConferenceCallList(call->GetSlotId());
863 if (info.mpty == 1 && conferenceCallList.size() > 1) {
864 SetConferenceCall(conferenceCallList);
865 } else if (call->ExitConference() == TELEPHONY_SUCCESS) {
866 TELEPHONY_LOGI("SubCallSeparateFromConference success!");
867 } else {
868 TELEPHONY_LOGI("SubCallSeparateFromConference fail!");
869 }
870 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_ACTIVE);
871 if (ret != TELEPHONY_SUCCESS) {
872 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
873 return ret;
874 }
875 sptr<CallBase> holdCall = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD);
876 if (holdCall != nullptr) {
877 holdCall->SetCanSwitchCallState(true);
878 TELEPHONY_LOGI("holdcall:%{public}d can swap", holdCall->GetCallID());
879 }
880 #ifdef AUDIO_SUPPORT
881 ToSpeakerPhone(call);
882 DelayedSingleton<AudioControlManager>::GetInstance()->SetVolumeAudible();
883 #endif
884 TELEPHONY_LOGI("handle active state success");
885
886 bool isAntiFraudSupport = OHOS::system::GetBoolParameter(ANTIFRAUD_FEATURE, true);
887 if (isAntiFraudSupport) {
888 SetupAntiFraudService(call, info);
889 }
890 return ret;
891 }
892
GetAntiFraudSlotId()893 int32_t CallStatusManager::GetAntiFraudSlotId()
894 {
895 std::lock_guard<ffrt::mutex> lock(mutex_);
896 return antiFraudSlotId_;
897 }
898
GetAntiFraudIndex()899 int32_t CallStatusManager::GetAntiFraudIndex()
900 {
901 std::lock_guard<ffrt::mutex> lock(mutex_);
902 return antiFraudIndex_;
903 }
904
SetAntiFraudSlotId(int32_t slotId)905 void CallStatusManager::SetAntiFraudSlotId(int32_t slotId)
906 {
907 std::lock_guard<ffrt::mutex> lock(mutex_);
908 antiFraudSlotId_ = slotId;
909 }
910
SetAntiFraudIndex(int32_t index)911 void CallStatusManager::SetAntiFraudIndex(int32_t index)
912 {
913 std::lock_guard<ffrt::mutex> lock(mutex_);
914 antiFraudIndex_ = index;
915 }
916
SetupAntiFraudService(const sptr<CallBase> & call,const CallDetailInfo & info)917 void CallStatusManager::SetupAntiFraudService(const sptr<CallBase> &call, const CallDetailInfo &info)
918 {
919 auto antiFraudService = DelayedSingleton<AntiFraudService>::GetInstance();
920 NumberMarkInfo numberMarkInfo = call->GetNumberMarkInfo();
921 std::string tmpStr(info.phoneNum);
922 std::vector<int> activedOsAccountIds;
923 OHOS::AccountSA::OsAccountManager::QueryActiveOsAccountIds(activedOsAccountIds);
924 if (activedOsAccountIds.empty() || activedOsAccountIds[0] != MAIN_USER_SPACE) {
925 TELEPHONY_LOGI("SetupAntiFraudService not in main user space");
926 return;
927 }
928 if (numberMarkInfo.markType != MarkType::MARK_TYPE_FRAUD &&
929 numberMarkInfo.markType != MarkType::MARK_TYPE_YELLOW_PAGE &&
930 numberMarkInfo.markType != MarkType::MARK_TYPE_ENTERPRISE &&
931 !IsContactPhoneNum(tmpStr) && antiFraudService->IsAntiFraudSwitchOn()) {
932 int32_t slotId = call->GetSlotId();
933 if (slotId == -1) {
934 return;
935 }
936 if (GetAntiFraudSlotId() != -1 || GetAntiFraudIndex() != -1) {
937 return;
938 }
939 SetAntiFraudSlotId(slotId);
940 SetAntiFraudIndex(info.index);
941 ffrt::submit([tmpStr, slotId, info, this]() {
942 int32_t ret = DelayedSingleton<AntiFraudService>::GetInstance()->
943 StartAntiFraudService(tmpStr, slotId, info.index);
944 if (ret != 0) {
945 SetAntiFraudSlotId(-1);
946 SetAntiFraudIndex(-1);
947 }
948 });
949 }
950 }
951
StopAntiFraudDetect(sptr<CallBase> & call,const CallDetailInfo & info)952 void CallStatusManager::StopAntiFraudDetect(sptr<CallBase> &call, const CallDetailInfo &info)
953 {
954 if (GetAntiFraudSlotId() != call->GetSlotId() || GetAntiFraudIndex() != info.index) {
955 return;
956 }
957 DelayedSingleton<AntiFraudService>::GetInstance()->StopAntiFraudService(call->GetSlotId(), info.index);
958 SetAntiFraudSlotId(-1);
959 SetAntiFraudIndex(-1);
960 TELEPHONY_LOGI("call ending, can begin a new antifraud");
961 UpdateAntiFraudState(call, static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_FINISHED));
962 }
963
HandleCeliaCall(sptr<CallBase> & call)964 void CallStatusManager::HandleCeliaCall(sptr<CallBase> &call)
965 {
966 int32_t slotId = call->GetSlotId();
967 int32_t index = call->GetCallIndex();
968 TELEPHONY_LOGI("handle celia call, slotId=%{public}d, index=%{public}d", slotId, index);
969 if (GetAntiFraudSlotId() != slotId || GetAntiFraudIndex() != index) {
970 return;
971 }
972 DelayedSingleton<AntiFraudService>::GetInstance()->StopAntiFraudService(slotId, index);
973 SetAntiFraudSlotId(-1);
974 SetAntiFraudIndex(-1);
975 TELEPHONY_LOGI("celia call begin, recover AntiFraud SlotId and Index");
976 UpdateAntiFraudState(call, static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_FINISHED));
977
978 if (call->GetTelCallState() == TelCallState::CALL_STATUS_ACTIVE) {
979 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_ACTIVE);
980 if (ret != TELEPHONY_SUCCESS) {
981 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
982 }
983 }
984 }
985
UpdateAntiFraudState(sptr<CallBase> & call,int32_t antiFraudState)986 void CallStatusManager::UpdateAntiFraudState(sptr<CallBase> &call, int32_t antiFraudState)
987 {
988 AAFwk::WantParams extraParams = call->GetExtraParams();
989 extraParams.SetParam("antiFraudState", AAFwk::Integer::Box(antiFraudState));
990 call->SetExtraParams(extraParams);
991 }
992
IsContactPhoneNum(const std::string & phoneNum)993 bool CallStatusManager::IsContactPhoneNum(const std::string &phoneNum)
994 {
995 ContactInfo contactInfo = {
996 .name = "",
997 .number = phoneNum,
998 .isContacterExists = false,
999 .ringtonePath = "",
1000 .isSendToVoicemail = false,
1001 .isEcc = false,
1002 .isVoiceMail = false,
1003 .isQueryComplete = true,
1004 };
1005 QueryCallerInfo(contactInfo, phoneNum);
1006 if (contactInfo.name.length() < 1) {
1007 TELEPHONY_LOGI("no corresponding contact found");
1008 return false;
1009 } else {
1010 return true;
1011 }
1012 }
1013
TriggerAntiFraud(int32_t antiFraudState)1014 void CallStatusManager::TriggerAntiFraud(int32_t antiFraudState)
1015 {
1016 TELEPHONY_LOGI("TriggerAntiState, antiFraudState = %{public}d", antiFraudState);
1017 sptr<CallBase> call = nullptr;
1018 int32_t antiFraudSlotId = GetAntiFraudSlotId();
1019 if (antiFraudSlotId >= SLOT_NUM || antiFraudSlotId < 0) {
1020 return;
1021 }
1022 for (auto &it : callDetailsInfo_[antiFraudSlotId].callVec) {
1023 if (it.index == GetAntiFraudIndex()) {
1024 it.antiFraudState = antiFraudState;
1025 call = GetOneCallObjectByIndexSlotIdAndCallType(it.index, it.accountId, it.callType);
1026 break;
1027 }
1028 }
1029 if (antiFraudState == static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_RISK) ||
1030 antiFraudState == static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_FINISHED)) {
1031 SetAntiFraudSlotId(-1);
1032 SetAntiFraudIndex(-1);
1033 TELEPHONY_LOGI("detect finish, can begin a new antifraud");
1034 }
1035
1036 if (call == nullptr) {
1037 return;
1038 }
1039 if (antiFraudState != static_cast<int32_t>(AntiFraudState::ANTIFRAUD_STATE_DEFAULT)) {
1040 UpdateAntiFraudState(call, antiFraudState);
1041 }
1042
1043 if (call->GetTelCallState() == TelCallState::CALL_STATUS_ACTIVE) {
1044 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_ACTIVE);
1045 if (ret != TELEPHONY_SUCCESS) {
1046 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
1047 }
1048 }
1049 }
1050
SetConferenceCall(std::vector<sptr<CallBase>> conferenceCallList)1051 void CallStatusManager::SetConferenceCall(std::vector<sptr<CallBase>> conferenceCallList)
1052 {
1053 for (auto conferenceCall : conferenceCallList) {
1054 TELEPHONY_LOGI("SetConferenceCall callid : %{public}d; State : %{public}d",
1055 conferenceCall->GetCallID(), conferenceCall->GetTelConferenceState());
1056 if (conferenceCall->GetTelConferenceState() != TelConferenceState::TEL_CONFERENCE_ACTIVE) {
1057 conferenceCall->LaunchConference();
1058 UpdateCallState(conferenceCall, conferenceCall->GetTelCallState());
1059 }
1060 }
1061 }
1062
ActiveVoipCallHandle(const CallDetailInfo & info)1063 int32_t CallStatusManager::ActiveVoipCallHandle(const CallDetailInfo &info)
1064 {
1065 TELEPHONY_LOGI("handle active state");
1066 sptr<CallBase> call = GetOneCallObjectByVoipCallId(
1067 info.voipCallInfo.voipCallId, info.voipCallInfo.voipBundleName, info.voipCallInfo.uid);
1068 if (call == nullptr) {
1069 TELEPHONY_LOGE("voip Call is NULL");
1070 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1071 }
1072 VideoStateType originalType = call->GetVideoStateType();
1073 if (originalType != info.callMode) {
1074 TELEPHONY_LOGI("change VideoStateType from %{public}d to %{public}d",
1075 static_cast<int32_t>(originalType), static_cast<int32_t>(info.callMode));
1076 call->SetVideoStateType(info.callMode);
1077 }
1078 sptr<VoIPCall> voipCall = reinterpret_cast<VoIPCall *>(call.GetRefPtr());
1079 if (voipCall != nullptr) {
1080 voipCall->UpdateCallAttributeInfo(info);
1081 }
1082 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_ACTIVE);
1083 if (ret != TELEPHONY_SUCCESS) {
1084 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
1085 return ret;
1086 }
1087 TELEPHONY_LOGI("handle active state success");
1088 return ret;
1089 }
1090
HoldingHandle(const CallDetailInfo & info)1091 int32_t CallStatusManager::HoldingHandle(const CallDetailInfo &info)
1092 {
1093 TELEPHONY_LOGI("handle holding state");
1094 std::string tmpStr(info.phoneNum);
1095 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
1096 if (call == nullptr && IsDcCallConneceted()) {
1097 CreateAndSaveNewCall(info, CallDirection::CALL_DIRECTION_UNKNOW);
1098 call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
1099 }
1100 if (call == nullptr) {
1101 TELEPHONY_LOGE("Call is NULL");
1102 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1103 }
1104 StopAntiFraudDetect(call, info);
1105 // if the call is in a conference, it will exit, otherwise just set it holding
1106 TELEPHONY_LOGI("refresh call.");
1107 call = RefreshCallIfNecessary(call, info);
1108 if (info.mpty == 1) {
1109 int32_t ret = call->HoldConference();
1110 if (ret == TELEPHONY_SUCCESS) {
1111 TELEPHONY_LOGI("HoldConference success");
1112 }
1113 }
1114 return UpdateCallStateAndHandleDsdsMode(info, call);
1115 }
1116
WaitingHandle(const CallDetailInfo & info)1117 int32_t CallStatusManager::WaitingHandle(const CallDetailInfo &info)
1118 {
1119 DelayedSingleton<CallControlManager>::GetInstance()->AcquireIncomingLock();
1120 int32_t ret = IncomingHandle(info);
1121 DelayedSingleton<CallControlManager>::GetInstance()->ReleaseIncomingLock();
1122 return ret;
1123 }
1124
AlertHandle(const CallDetailInfo & info)1125 int32_t CallStatusManager::AlertHandle(const CallDetailInfo &info)
1126 {
1127 TELEPHONY_LOGI("handle alerting state");
1128 std::string tmpStr(info.phoneNum);
1129 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
1130 if (call == nullptr && IsDcCallConneceted()) {
1131 TELEPHONY_LOGI("create new call.");
1132 CreateAndSaveNewCall(info, CallDirection::CALL_DIRECTION_OUT);
1133 call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
1134 }
1135 if (call == nullptr && !RefreshDialingStateByOtherState(call, info)) {
1136 TELEPHONY_LOGE("Call is NULL");
1137 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1138 }
1139 ClearPendingState(call);
1140 TELEPHONY_LOGI("refresh call.");
1141 call = RefreshCallIfNecessary(call, info);
1142 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_ALERTING);
1143 if (ret != TELEPHONY_SUCCESS) {
1144 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
1145 return ret;
1146 }
1147 #ifdef AUDIO_SUPPORT
1148 ToSpeakerPhone(call);
1149 TurnOffMute(call);
1150 DelayedSingleton<AudioControlManager>::GetInstance()->SetVolumeAudible();
1151 #endif
1152 return ret;
1153 }
1154
DisconnectingHandle(const CallDetailInfo & info)1155 int32_t CallStatusManager::DisconnectingHandle(const CallDetailInfo &info)
1156 {
1157 TELEPHONY_LOGI("handle disconnecting state");
1158 std::string tmpStr(info.phoneNum);
1159 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
1160 if (call == nullptr) {
1161 TELEPHONY_LOGE("Call is NULL");
1162 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1163 }
1164 StopAntiFraudDetect(call, info);
1165 TELEPHONY_LOGI("refresh call.");
1166 call = RefreshCallIfNecessary(call, info);
1167 SetOriginalCallTypeForDisconnectState(call);
1168 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_DISCONNECTING);
1169 if (ret != TELEPHONY_SUCCESS) {
1170 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
1171 }
1172 DelayedSingleton<CallControlManager>::GetInstance()->StopFlashRemind();
1173 return ret;
1174 }
1175
DisconnectedVoipCallHandle(const CallDetailInfo & info)1176 int32_t CallStatusManager::DisconnectedVoipCallHandle(const CallDetailInfo &info)
1177 {
1178 TELEPHONY_LOGI("handle disconnected voip call state");
1179 sptr<CallBase> call = GetOneCallObjectByVoipCallId(
1180 info.voipCallInfo.voipCallId, info.voipCallInfo.voipBundleName, info.voipCallInfo.uid);
1181 if (call == nullptr) {
1182 TELEPHONY_LOGE("voip Call is NULL");
1183 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1184 }
1185 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_DISCONNECTED);
1186 if (ret != TELEPHONY_SUCCESS) {
1187 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
1188 return ret;
1189 }
1190 DeleteOneCallObject(call->GetCallID());
1191 TELEPHONY_LOGI("handle disconnected voip call state success");
1192 return ret;
1193 }
1194
DisconnectedHandle(const CallDetailInfo & info)1195 int32_t CallStatusManager::DisconnectedHandle(const CallDetailInfo &info)
1196 {
1197 TELEPHONY_LOGI("handle disconnected state");
1198 if (timeWaitHelper_ != nullptr) {
1199 TELEPHONY_LOGI("ringtone once");
1200 timeWaitHelper_->NotifyAll();
1201 timeWaitHelper_ = nullptr;
1202 }
1203 std::string tmpStr(info.phoneNum);
1204 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
1205 if (call == nullptr && !RefreshDialingStateByOtherState(call, info)) {
1206 TELEPHONY_LOGE("Call is Null");
1207 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1208 }
1209 if (call->GetTelCallState() != TelCallState::CALL_STATUS_DISCONNECTING) {
1210 // Acquire disconnected lock when the remote hangup and will release after StopSoundtone
1211 DelayedSingleton<CallControlManager>::GetInstance()->AcquireDisconnectedLock();
1212 }
1213 StopAntiFraudDetect(call, info);
1214 #ifdef NOT_SUPPORT_MULTICALL
1215 bool isTwoCallBtCallAndESIM = CallObjectManager::IsTwoCallBtCallAndESIM();
1216 bool IsTwoCallESIMCall = CallObjectManager::IsTwoCallESIMCall();
1217 #endif
1218 call = RefreshCallIfNecessary(call, info);
1219 RefreshCallDisconnectReason(call, static_cast<int32_t>(info.reason), info.message);
1220 ClearPendingState(call);
1221 SetOriginalCallTypeForDisconnectState(call);
1222 std::vector<std::u16string> callIdList;
1223 call->GetSubCallIdList(callIdList);
1224 CallRunningState previousState = call->GetCallRunningState();
1225 call->ExitConference();
1226 TelCallState priorState = call->GetTelCallState();
1227 UpdateCallState(call, TelCallState::CALL_STATUS_DISCONNECTED);
1228 MyLocationEngine::StopEccService(call->GetCallID());
1229 HandleHoldCallOrAutoAnswerCall(call, callIdList, previousState, priorState);
1230 std::vector<sptr<CallBase>> conferenceCallList = GetConferenceCallList(call->GetSlotId());
1231 if (conferenceCallList.size() == 1) {
1232 sptr<CallBase> leftOneConferenceCall = conferenceCallList[0];
1233 if (leftOneConferenceCall != nullptr &&
1234 leftOneConferenceCall->GetTelConferenceState() != TelConferenceState::TEL_CONFERENCE_IDLE) {
1235 TELEPHONY_LOGI("Not enough calls to be a conference!");
1236 leftOneConferenceCall->SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_IDLE);
1237 UpdateCallState(leftOneConferenceCall, leftOneConferenceCall->GetTelCallState());
1238 }
1239 }
1240 if (CallObjectManager::GetCurrentCallNum() <= 0) {
1241 DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->RestoreSuperPrivacyMode();
1242 }
1243 #ifdef NOT_SUPPORT_MULTICALL
1244 if (isTwoCallBtCallAndESIM || IsTwoCallESIMCall) {
1245 TELEPHONY_LOGI("Auto AnswerCall");
1246 AutoAnswerSecondCall();
1247 }
1248 #endif
1249 StopCallMotionRecognition(TelCallState::CALL_STATUS_DISCONNECTED);
1250 DelayedSingleton<CallControlManager>::GetInstance()->StopFlashRemind();
1251 return TELEPHONY_SUCCESS;
1252 }
1253
StopCallMotionRecognition(TelCallState nextState)1254 void CallStatusManager::StopCallMotionRecognition(TelCallState nextState)
1255 {
1256 switch (nextState) {
1257 case TelCallState::CALL_STATUS_ACTIVE:
1258 MotionRecogntion::UnsubscribePickupSensor();
1259 MotionRecogntion::UnsubscribeFlipSensor();
1260 break;
1261 case TelCallState::CALL_STATUS_DISCONNECTED:
1262 if (!CallObjectManager::HasCellularCallExist()) {
1263 MotionRecogntion::UnsubscribePickupSensor();
1264 MotionRecogntion::UnsubscribeFlipSensor();
1265 MotionRecogntion::UnsubscribeCloseToEarSensor();
1266 Rosen::UnloadMotionSensor();
1267 }
1268 break;
1269 default:
1270 break;
1271 }
1272 }
1273
GetConferenceCallList(int32_t slotId)1274 std::vector<sptr<CallBase>> CallStatusManager::GetConferenceCallList(int32_t slotId)
1275 {
1276 if (slotId >= SLOT_NUM || slotId < 0) {
1277 return std::vector<sptr<CallBase>>();
1278 }
1279 std::vector<sptr<CallBase>> conferenceCallList;
1280 for (const auto &it : tmpCallDetailsInfo_[slotId].callVec) {
1281 if (it.mpty == 1) {
1282 sptr<CallBase> conferenceCall = GetOneCallObjectByIndexAndSlotId(it.index, it.accountId);
1283 if (conferenceCall != nullptr) {
1284 conferenceCallList.emplace_back(conferenceCall);
1285 }
1286 }
1287 }
1288 TELEPHONY_LOGI("Conference call list size:%{public}zu", conferenceCallList.size());
1289 return conferenceCallList;
1290 }
1291
HandleHoldCallOrAutoAnswerCall(const sptr<CallBase> call,std::vector<std::u16string> callIdList,CallRunningState previousState,TelCallState priorState)1292 void CallStatusManager::HandleHoldCallOrAutoAnswerCall(const sptr<CallBase> call,
1293 std::vector<std::u16string> callIdList, CallRunningState previousState, TelCallState priorState)
1294 {
1295 if (call == nullptr) {
1296 TELEPHONY_LOGE("call is null");
1297 return;
1298 }
1299 bool canUnHold = false;
1300 size_t size = callIdList.size();
1301 int32_t activeCallNum = GetCallNum(TelCallState::CALL_STATUS_ACTIVE);
1302 int32_t waitingCallNum = GetCallNum(TelCallState::CALL_STATUS_WAITING);
1303 IsCanUnHold(activeCallNum, waitingCallNum, size, canUnHold);
1304 sptr<CallBase> holdCall = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD);
1305 if (previousState != CallRunningState::CALL_RUNNING_STATE_HOLD &&
1306 previousState != CallRunningState::CALL_RUNNING_STATE_ACTIVE &&
1307 priorState == TelCallState::CALL_STATUS_DISCONNECTING) {
1308 if (holdCall != nullptr && canUnHold && holdCall->GetCanUnHoldState()) {
1309 if (holdCall->GetSlotId() == call->GetSlotId()) {
1310 TELEPHONY_LOGI("release call and recover the held call");
1311 holdCall->UnHoldCall();
1312 }
1313 }
1314 }
1315 DeleteOneCallObject(call->GetCallID());
1316 int32_t dsdsMode = DSDS_MODE_V2;
1317 DelayedRefSingleton<CoreServiceClient>::GetInstance().GetDsdsMode(dsdsMode);
1318 if (dsdsMode == DSDS_MODE_V3) {
1319 AutoAnswer(activeCallNum, waitingCallNum);
1320 } else if (dsdsMode == static_cast<int32_t>(DsdsMode::DSDS_MODE_V5_DSDA) ||
1321 dsdsMode == static_cast<int32_t>(DsdsMode::DSDS_MODE_V5_TDM)) {
1322 bool canSwitchCallState = call->GetCanSwitchCallState();
1323 AutoHandleForDsda(canSwitchCallState, priorState, activeCallNum, call->GetSlotId(), true);
1324 }
1325 }
1326
IsCanUnHold(int32_t activeCallNum,int32_t waitingCallNum,int32_t size,bool & canUnHold)1327 void CallStatusManager::IsCanUnHold(int32_t activeCallNum, int32_t waitingCallNum, int32_t size, bool &canUnHold)
1328 {
1329 int32_t incomingCallNum = GetCallNum(TelCallState::CALL_STATUS_INCOMING);
1330 int32_t answeredCallNum = GetCallNum(TelCallState::CALL_STATUS_ANSWERED);
1331 int32_t dialingCallNum = GetCallNum(TelCallState::CALL_STATUS_ALERTING);
1332 if (answeredCallNum == 0 && incomingCallNum == 0 && (size == 0 || size == 1) && activeCallNum == 0 &&
1333 waitingCallNum == 0 && dialingCallNum == 0) {
1334 canUnHold = true;
1335 }
1336 TELEPHONY_LOGI("CanUnHold state: %{public}d", canUnHold);
1337 }
1338
AutoHandleForDsda(bool canSwitchCallState,TelCallState priorState,int32_t activeCallNum,int32_t slotId,bool continueAnswer)1339 void CallStatusManager::AutoHandleForDsda(
1340 bool canSwitchCallState, TelCallState priorState, int32_t activeCallNum, int32_t slotId, bool continueAnswer)
1341 {
1342 int32_t dialingCallNum = GetCallNum(TelCallState::CALL_STATUS_DIALING);
1343 int32_t alertingCallNum = GetCallNum(TelCallState::CALL_STATUS_ALERTING);
1344 std::list<int32_t> callIdList;
1345 GetCarrierCallList(callIdList);
1346 for (int32_t ringCallId : callIdList) {
1347 sptr<CallBase> ringCall = GetOneCallObject(ringCallId);
1348 if (ringCall != nullptr && ringCall->GetAutoAnswerState()) {
1349 TELEPHONY_LOGI("ringCall is not nullptr");
1350 int32_t videoState = static_cast<int32_t>(ringCall->GetVideoStateType());
1351 if (videoState == static_cast<int32_t>(VideoStateType::TYPE_VIDEO)) {
1352 TELEPHONY_LOGI("AutoAnswer VideoCall for Dsda");
1353 AutoAnswerForVideoCall(activeCallNum);
1354 AutoUnHoldForDsda(canSwitchCallState, priorState, activeCallNum, slotId);
1355 return;
1356 }
1357 if (dialingCallNum == 0 && alertingCallNum == 0 && activeCallNum == 0 &&
1358 ringCall->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_RINGING) {
1359 TELEPHONY_LOGI("AutoAnswer VoiceCall for Dsda");
1360 AutoAnswerForVoiceCall(ringCall, slotId, continueAnswer);
1361 AutoUnHoldForDsda(canSwitchCallState, priorState, activeCallNum, slotId);
1362 return;
1363 }
1364 }
1365 }
1366 AutoUnHoldForDsda(canSwitchCallState, priorState, activeCallNum, slotId);
1367 }
1368
AutoUnHoldForDsda(bool canSwitchCallState,TelCallState priorState,int32_t activeCallNum,int32_t slotId)1369 void CallStatusManager::AutoUnHoldForDsda(
1370 bool canSwitchCallState, TelCallState priorState, int32_t activeCallNum, int32_t slotId)
1371 {
1372 int32_t dialingCallNum = GetCallNum(TelCallState::CALL_STATUS_DIALING);
1373 int32_t waitingCallNum = GetCallNum(TelCallState::CALL_STATUS_WAITING);
1374 int32_t callNum = 2;
1375 std::list<int32_t> callIdList;
1376 GetCarrierCallList(callIdList);
1377 int32_t currentCallNum = GetCurrentCallNum();
1378 for (int32_t otherCallId : callIdList) {
1379 sptr<CallBase> otherCall = GetOneCallObject(otherCallId);
1380 if (otherCall == nullptr) {
1381 TELEPHONY_LOGE("otherCall is nullptr");
1382 continue;
1383 }
1384 TelCallState state = otherCall->GetTelCallState();
1385 TelConferenceState confState = otherCall->GetTelConferenceState();
1386 int32_t conferenceId = ERR_ID;
1387 otherCall->GetMainCallId(conferenceId);
1388 if (slotId != otherCall->GetSlotId() && state == TelCallState::CALL_STATUS_HOLDING &&
1389 otherCall->GetCanUnHoldState() && activeCallNum == 0 && waitingCallNum == 0 &&
1390 dialingCallNum == 0 &&
1391 ((confState != TelConferenceState::TEL_CONFERENCE_IDLE && conferenceId == otherCallId) ||
1392 confState == TelConferenceState::TEL_CONFERENCE_IDLE)) {
1393 // Actively hang up the processing unhold state or exchange call
1394 if (priorState == TelCallState::CALL_STATUS_DISCONNECTING ||
1395 (!canSwitchCallState && currentCallNum == callNum)) {
1396 otherCall->UnHoldCall();
1397 return;
1398 }
1399 }
1400 }
1401 for (int32_t otherCallId : callIdList) {
1402 sptr<CallBase> holdCall = GetOneCallObject(otherCallId);
1403 if (holdCall != nullptr && holdCall->GetTelCallState() == TelCallState::CALL_STATUS_HOLDING) {
1404 if (currentCallNum == callNum) {
1405 holdCall->SetCanUnHoldState(true);
1406 }
1407 }
1408 }
1409 }
1410
AutoAnswerForVoiceCall(sptr<CallBase> ringCall,int32_t slotId,bool continueAnswer)1411 void CallStatusManager::AutoAnswerForVoiceCall(sptr<CallBase> ringCall, int32_t slotId, bool continueAnswer)
1412 {
1413 /* Need to check whether the autoAnswer call and the holding call are on the same slotid
1414 * To prevent repeated AT command delivery.
1415 */
1416 if (continueAnswer || slotId != ringCall->GetSlotId()) {
1417 DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallStateUpdated(
1418 ringCall, TelCallState::CALL_STATUS_INCOMING, TelCallState::CALL_STATUS_ANSWERED);
1419 int ret = ringCall->AnswerCall(ringCall->GetAnswerVideoState());
1420 if (ret == TELEPHONY_SUCCESS) {
1421 DelayedSingleton<CallControlManager>::GetInstance()->NotifyIncomingCallAnswered(ringCall);
1422 }
1423 TELEPHONY_LOGI("ret = %{public}d", ret);
1424 }
1425 ringCall->SetAutoAnswerState(false);
1426 }
1427
AutoAnswerForVideoCall(int32_t activeCallNum)1428 void CallStatusManager::AutoAnswerForVideoCall(int32_t activeCallNum)
1429 {
1430 int32_t holdingCallNum = GetCallNum(TelCallState::CALL_STATUS_HOLDING);
1431 int32_t dialingCallNum = GetCallNum(TelCallState::CALL_STATUS_DIALING);
1432 int32_t alertingCallNum = GetCallNum(TelCallState::CALL_STATUS_ALERTING);
1433 if (activeCallNum == 0 && holdingCallNum == 0 && dialingCallNum == 0 && alertingCallNum == 0) {
1434 std::list<int32_t> ringCallIdList;
1435 GetCarrierCallList(ringCallIdList);
1436 for (int32_t ringingCallId : ringCallIdList) {
1437 sptr<CallBase> ringingCall = GetOneCallObject(ringingCallId);
1438 if (ringingCall == nullptr) {
1439 TELEPHONY_LOGE("ringingCall is nullptr");
1440 return;
1441 }
1442 CallRunningState ringingCallState = ringingCall->GetCallRunningState();
1443 if ((ringingCallState == CallRunningState::CALL_RUNNING_STATE_RINGING &&
1444 (ringingCall->GetAutoAnswerState()))) {
1445 ringingCall->SetAutoAnswerState(false);
1446 int ret = ringingCall->AnswerCall(ringingCall->GetAnswerVideoState());
1447 TELEPHONY_LOGI("ret = %{public}d", ret);
1448 break;
1449 }
1450 }
1451 }
1452 }
1453
AutoAnswer(int32_t activeCallNum,int32_t waitingCallNum)1454 void CallStatusManager::AutoAnswer(int32_t activeCallNum, int32_t waitingCallNum)
1455 {
1456 int32_t holdingCallNum = GetCallNum(TelCallState::CALL_STATUS_HOLDING);
1457 int32_t dialingCallNum = GetCallNum(TelCallState::CALL_STATUS_DIALING);
1458 int32_t alertingCallNum = GetCallNum(TelCallState::CALL_STATUS_ALERTING);
1459 if (activeCallNum == 0 && waitingCallNum == 0 && holdingCallNum == 0 && dialingCallNum == 0 &&
1460 alertingCallNum == 0) {
1461 std::list<int32_t> ringCallIdList;
1462 GetCarrierCallList(ringCallIdList);
1463 for (int32_t ringingCallId : ringCallIdList) {
1464 sptr<CallBase> ringingCall = GetOneCallObject(ringingCallId);
1465 if (ringingCall == nullptr) {
1466 TELEPHONY_LOGE("ringingCall is nullptr");
1467 return;
1468 }
1469 CallRunningState ringingCallState = ringingCall->GetCallRunningState();
1470 if ((ringingCallState == CallRunningState::CALL_RUNNING_STATE_RINGING &&
1471 (ringingCall->GetAutoAnswerState()))) {
1472 ringingCall->SetAutoAnswerState(false);
1473 int ret = ringingCall->AnswerCall(ringingCall->GetAnswerVideoState());
1474 TELEPHONY_LOGI("ret = %{public}d", ret);
1475 break;
1476 }
1477 }
1478 }
1479 }
1480
UpdateCallState(sptr<CallBase> & call,TelCallState nextState)1481 int32_t CallStatusManager::UpdateCallState(sptr<CallBase> &call, TelCallState nextState)
1482 {
1483 TELEPHONY_LOGW("UpdateCallState start");
1484 if (call == nullptr) {
1485 TELEPHONY_LOGE("Call is NULL");
1486 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1487 }
1488 TelCallState priorState = call->GetTelCallState();
1489 VideoStateType videoState = call->GetVideoStateType();
1490 TELEPHONY_LOGI(
1491 "callIndex:%{public}d, callId:%{public}d, priorState:%{public}d, nextState:%{public}d, videoState:%{public}d",
1492 call->GetCallIndex(), call->GetCallID(), priorState, nextState, videoState);
1493 if (call->GetCallType() == CallType::TYPE_SATELLITE) {
1494 DelayedSingleton<SatelliteCallControl>::GetInstance()->
1495 HandleSatelliteCallStateUpdate(call, priorState, nextState);
1496 }
1497 if (priorState == TelCallState::CALL_STATUS_INCOMING && nextState == TelCallState::CALL_STATUS_ACTIVE) {
1498 DelayedSingleton<CallManagerHisysevent>::GetInstance()->JudgingAnswerTimeOut(
1499 call->GetSlotId(), call->GetCallID(), static_cast<int32_t>(call->GetVideoStateType()));
1500 }
1501 int32_t ret = call->SetTelCallState(nextState);
1502 UpdateOneCallObjectByCallId(call->GetCallID(), nextState);
1503 if (ret != TELEPHONY_SUCCESS && ret != CALL_ERR_NOT_NEW_STATE) {
1504 TELEPHONY_LOGE("SetTelCallState failed");
1505 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1506 }
1507 if (!DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallStateUpdated(call, priorState, nextState)) {
1508 TELEPHONY_LOGE(
1509 "NotifyCallStateUpdated failed! priorState:%{public}d,nextState:%{public}d", priorState, nextState);
1510 if (nextState == TelCallState::CALL_STATUS_INCOMING) {
1511 CallManagerHisysevent::WriteIncomingCallFaultEvent(call->GetSlotId(),
1512 static_cast<int32_t>(call->GetCallType()), static_cast<int32_t>(call->GetVideoStateType()), ret,
1513 "NotifyCallStateUpdated failed");
1514 }
1515 return CALL_ERR_PHONE_CALLSTATE_NOTIFY_FAILED;
1516 }
1517 SetVideoCallState(call, nextState);
1518 return TELEPHONY_SUCCESS;
1519 }
1520
SetVideoCallState(sptr<CallBase> & call,TelCallState nextState)1521 void CallStatusManager::SetVideoCallState(sptr<CallBase> &call, TelCallState nextState)
1522 {
1523 if (call == nullptr || call->GetCallType() == CallType::TYPE_VOIP) {
1524 TELEPHONY_LOGE("Call is NULL or calltype is VoIP");
1525 return;
1526 }
1527 int slotId = call->GetSlotId();
1528 bool isSlotIdValid = false;
1529 if (slotId >= SLOT_NUM || slotId < 0) {
1530 return;
1531 }
1532 VideoStateType videoState = call->GetVideoStateType();
1533 TELEPHONY_LOGI("nextVideoState:%{public}d, priorVideoState:%{public}d", videoState, priorVideoState_[slotId]);
1534 if (priorVideoState_[slotId] != videoState) {
1535 DelayedSingleton<AudioControlManager>::GetInstance()->VideoStateUpdated(
1536 call, priorVideoState_[slotId], videoState);
1537 priorVideoState_[slotId] = videoState;
1538 }
1539 if (nextState == TelCallState::CALL_STATUS_DISCONNECTED) {
1540 priorVideoState_[slotId] = VideoStateType::TYPE_VOICE;
1541 }
1542 }
1543
RefreshCallIfNecessary(const sptr<CallBase> & call,const CallDetailInfo & info)1544 sptr<CallBase> CallStatusManager::RefreshCallIfNecessary(const sptr<CallBase> &call, const CallDetailInfo &info)
1545 {
1546 call->SetNewCallUseBox(info.newCallUseBox);
1547 if (call->GetCallType() == CallType::TYPE_IMS && call->GetVideoStateType() != info.callMode) {
1548 call->SetVideoStateType(info.callMode);
1549 sptr<IMSCall> imsCall = reinterpret_cast<IMSCall *>(call.GetRefPtr());
1550 imsCall->InitVideoCall();
1551 }
1552 if (call->GetCallType() == CallType::TYPE_IMS) {
1553 call->SetCrsType(info.crsType);
1554 }
1555 if (call->GetCallType() == info.callType) {
1556 TELEPHONY_LOGI("RefreshCallIfNecessary not need Refresh");
1557 return call;
1558 }
1559 TelCallState priorState = call->GetTelCallState();
1560 CallAttributeInfo attrInfo;
1561 (void)memset_s(&attrInfo, sizeof(CallAttributeInfo), 0, sizeof(CallAttributeInfo));
1562 call->GetCallAttributeBaseInfo(attrInfo);
1563 sptr<CallBase> newCall = CreateNewCall(info, attrInfo.callDirection);
1564 if (newCall == nullptr) {
1565 TELEPHONY_LOGE("RefreshCallIfNecessary createCallFail");
1566 return call;
1567 }
1568 AddOneCallObject(newCall);
1569 newCall->SetCallRunningState(call->GetCallRunningState());
1570 newCall->SetTelConferenceState(call->GetTelConferenceState());
1571 newCall->SetStartTime(attrInfo.startTime);
1572 newCall->SetPolicyFlag(PolicyFlag(call->GetPolicyFlag()));
1573 newCall->SetSpeakerphoneOn(call->IsSpeakerphoneOn());
1574 newCall->SetCallEndedType(call->GetCallEndedType());
1575 newCall->SetCallBeginTime(attrInfo.callBeginTime);
1576 newCall->SetCallCreateTime(attrInfo.callCreateTime);
1577 newCall->SetCallEndTime(attrInfo.callEndTime);
1578 newCall->SetRingBeginTime(attrInfo.ringBeginTime);
1579 newCall->SetRingEndTime(attrInfo.ringEndTime);
1580 newCall->SetAnswerType(attrInfo.answerType);
1581 newCall->SetMicPhoneState(call->IsMuted());
1582 DeleteOneCallObject(call->GetCallID());
1583 newCall->SetCallId(call->GetCallID());
1584 newCall->SetTelCallState(priorState);
1585 if (call->GetNumberLocation() != "default") {
1586 newCall->SetNumberLocation(call->GetNumberLocation());
1587 }
1588 NumberMarkInfo numberMarkInfo = call->GetNumberMarkInfo();
1589 if (numberMarkInfo.markType > MarkType::MARK_TYPE_NONE || (attrInfo.isEcc &&
1590 numberMarkInfo.markType > MarkType::MARK_TYPE_DEFAULT && newCall->GetCallType() == CallType::TYPE_CS)) {
1591 newCall->SetNumberMarkInfo(numberMarkInfo);
1592 }
1593 return newCall;
1594 }
1595
SetOriginalCallTypeForActiveState(sptr<CallBase> & call)1596 void CallStatusManager::SetOriginalCallTypeForActiveState(sptr<CallBase> &call)
1597 {
1598 if (call == nullptr) {
1599 TELEPHONY_LOGE("Call is NULL");
1600 return;
1601 }
1602 TelCallState priorState = call->GetTelCallState();
1603 VideoStateType videoState = call->GetVideoStateType();
1604 int32_t videoStateHistory = call->GetOriginalCallType();
1605 if (priorState == TelCallState::CALL_STATUS_ALERTING || priorState == TelCallState::CALL_STATUS_INCOMING ||
1606 priorState == TelCallState::CALL_STATUS_WAITING) {
1607 // outgoing/incoming video call, but accepted/answered with voice call
1608 if (videoStateHistory != static_cast<int32_t>(videoState)) {
1609 TELEPHONY_LOGD("set videoState:%{public}d as original call type", static_cast<int32_t>(videoState));
1610 call->SetOriginalCallType(static_cast<int32_t>(videoState));
1611 }
1612 } else if (priorState == TelCallState::CALL_STATUS_ACTIVE || priorState == TelCallState::CALL_STATUS_HOLDING) {
1613 int32_t videoStateCurrent =
1614 static_cast<int32_t>(static_cast<uint32_t>(videoStateHistory) | static_cast<uint32_t>(videoState));
1615 TELEPHONY_LOGD("maybe upgrade/downgrade operation, keep video record always, videoStateCurrent:%{public}d",
1616 videoStateCurrent);
1617 call->SetOriginalCallType(videoStateCurrent);
1618 }
1619 }
1620
SetOriginalCallTypeForDisconnectState(sptr<CallBase> & call)1621 void CallStatusManager::SetOriginalCallTypeForDisconnectState(sptr<CallBase> &call)
1622 {
1623 if (call == nullptr) {
1624 TELEPHONY_LOGE("Call is NULL");
1625 return;
1626 }
1627 TelCallState priorState = call->GetTelCallState();
1628 CallAttributeInfo attrInfo;
1629 (void)memset_s(&attrInfo, sizeof(CallAttributeInfo), 0, sizeof(CallAttributeInfo));
1630 call->GetCallAttributeBaseInfo(attrInfo);
1631 if (priorState == TelCallState::CALL_STATUS_DIALING || priorState == TelCallState::CALL_STATUS_ALERTING ||
1632 ((priorState == TelCallState::CALL_STATUS_INCOMING || priorState == TelCallState::CALL_STATUS_WAITING) &&
1633 attrInfo.answerType != CallAnswerType::CALL_ANSWER_REJECT)) {
1634 // outgoing/incoming video call, but canceled or missed
1635 TELEPHONY_LOGD("canceled or missed call, set voice type as original call type");
1636 call->SetOriginalCallType(static_cast<int32_t>(VideoStateType::TYPE_VOICE));
1637 }
1638 }
1639
ToSpeakerPhone(sptr<CallBase> & call)1640 int32_t CallStatusManager::ToSpeakerPhone(sptr<CallBase> &call)
1641 {
1642 int32_t ret = TELEPHONY_ERR_FAIL;
1643 if (call == nullptr) {
1644 TELEPHONY_LOGE("Call is NULL");
1645 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1646 }
1647 if (call->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_DIALING) {
1648 TELEPHONY_LOGI("Call is CALL_STATUS_DIALING");
1649 return ret;
1650 }
1651 if (call->IsSpeakerphoneOn()) {
1652 AudioDevice device = {
1653 .deviceType = AudioDeviceType::DEVICE_SPEAKER,
1654 .address = { 0 },
1655 };
1656 DelayedSingleton<AudioControlManager>::GetInstance()->SetAudioDevice(device);
1657 ret = call->SetSpeakerphoneOn(false);
1658 }
1659 return ret;
1660 }
1661
TurnOffMute(sptr<CallBase> & call)1662 int32_t CallStatusManager::TurnOffMute(sptr<CallBase> &call)
1663 {
1664 bool enabled = true;
1665 if (HasEmergencyCall(enabled) != TELEPHONY_SUCCESS) {
1666 TELEPHONY_LOGI("CallStatusManager::TurnOffMute HasEmergencyCall failed.");
1667 }
1668 if (call->GetEmergencyState() || enabled) {
1669 DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(false);
1670 } else {
1671 DelayedSingleton<AudioControlManager>::GetInstance()->SetMute(true);
1672 }
1673 return TELEPHONY_SUCCESS;
1674 }
1675
CreateNewCall(const CallDetailInfo & info,CallDirection dir)1676 sptr<CallBase> CallStatusManager::CreateNewCall(const CallDetailInfo &info, CallDirection dir)
1677 {
1678 TELEPHONY_LOGI("CreateNewCall");
1679 DialParaInfo paraInfo;
1680 AppExecFwk::PacMap extras;
1681 extras.Clear();
1682 PackParaInfo(paraInfo, info, dir, extras);
1683
1684 sptr<CallBase> callPtr = CreateNewCallByCallType(paraInfo, info, dir, extras);
1685 if (callPtr == nullptr) {
1686 TELEPHONY_LOGE("CreateNewCall failed!");
1687 return nullptr;
1688 }
1689 DialScene dialScene = (DialScene)extras.GetIntValue("dialScene");
1690 if (dialScene == DialScene::CALL_EMERGENCY) {
1691 callPtr->SetIsEccContact(true);
1692 }
1693 callPtr->SetOriginalCallType(info.originalCallType);
1694 TELEPHONY_LOGD("originalCallType:%{public}d", info.originalCallType);
1695 if (info.callType == CallType::TYPE_VOIP) {
1696 return callPtr;
1697 }
1698 if (info.state == TelCallState::CALL_STATUS_INCOMING || info.state == TelCallState::CALL_STATUS_WAITING ||
1699 (info.state == TelCallState::CALL_STATUS_DIALING && (info.index == 0 || IsDcCallConneceted()))) {
1700 TELEPHONY_LOGI("NumberLocationUpdate start");
1701 wptr<CallBase> callBaseWeakPtr = callPtr;
1702 ffrt::submit([callBaseWeakPtr, info]() {
1703 sptr<CallBase> callBasePtr = callBaseWeakPtr.promote();
1704 if (callBasePtr == nullptr) {
1705 TELEPHONY_LOGE("callBasePtr is nullptr");
1706 return;
1707 }
1708 DelayedSingleton<CallNumberUtils>::GetInstance()->NumberLocationUpdate(callBasePtr);
1709 DelayedSingleton<DistributedCommunicationManager>::GetInstance()->ProcessCallInfo(callBasePtr,
1710 DistributedDataType::LOCATION);
1711 if (info.state == TelCallState::CALL_STATUS_DIALING) {
1712 DelayedSingleton<CallNumberUtils>::GetInstance()->YellowPageAndMarkUpdate(callBasePtr);
1713 }
1714 });
1715 }
1716 time_t createTime = time(nullptr);
1717 if (createTime < 0) {
1718 createTime = 0;
1719 }
1720 callPtr->SetCallCreateTime(createTime);
1721 return callPtr;
1722 }
1723
CreateNewCallByCallType(DialParaInfo & paraInfo,const CallDetailInfo & info,CallDirection dir,AppExecFwk::PacMap & extras)1724 sptr<CallBase> CallStatusManager::CreateNewCallByCallType(
1725 DialParaInfo ¶Info, const CallDetailInfo &info, CallDirection dir, AppExecFwk::PacMap &extras)
1726 {
1727 sptr<CallBase> callPtr = nullptr;
1728 switch (info.callType) {
1729 case CallType::TYPE_CS: {
1730 if (dir == CallDirection::CALL_DIRECTION_OUT) {
1731 callPtr = (std::make_unique<CSCall>(paraInfo, extras)).release();
1732 } else {
1733 callPtr = (std::make_unique<CSCall>(paraInfo)).release();
1734 }
1735 break;
1736 }
1737 case CallType::TYPE_IMS: {
1738 if (dir == CallDirection::CALL_DIRECTION_OUT) {
1739 callPtr = (std::make_unique<IMSCall>(paraInfo, extras)).release();
1740 } else {
1741 callPtr = (std::make_unique<IMSCall>(paraInfo)).release();
1742 }
1743 if (callPtr->GetCallType() == CallType::TYPE_IMS) {
1744 sptr<IMSCall> imsCall = reinterpret_cast<IMSCall *>(callPtr.GetRefPtr());
1745 imsCall->InitVideoCall();
1746 }
1747 break;
1748 }
1749 case CallType::TYPE_OTT: {
1750 if (dir == CallDirection::CALL_DIRECTION_OUT) {
1751 callPtr = (std::make_unique<OTTCall>(paraInfo, extras)).release();
1752 } else {
1753 callPtr = (std::make_unique<OTTCall>(paraInfo)).release();
1754 }
1755 break;
1756 }
1757 case CallType::TYPE_VOIP:
1758 case CallType::TYPE_SATELLITE:
1759 case CallType::TYPE_BLUETOOTH: {
1760 callPtr = CreateNewCallByCallTypeEx(paraInfo, info, dir, extras);
1761 break;
1762 }
1763 default:
1764 return nullptr;
1765 }
1766 return callPtr;
1767 }
1768
CreateNewCallByCallTypeEx(DialParaInfo & paraInfo,const CallDetailInfo & info,CallDirection dir,AppExecFwk::PacMap & extras)1769 sptr<CallBase> CallStatusManager::CreateNewCallByCallTypeEx(
1770 DialParaInfo ¶Info, const CallDetailInfo &info, CallDirection dir, AppExecFwk::PacMap &extras)
1771 {
1772 sptr<CallBase> callPtr = nullptr;
1773 switch (info.callType) {
1774 case CallType::TYPE_VOIP: {
1775 callPtr = (std::make_unique<VoIPCall>(paraInfo)).release();
1776 break;
1777 }
1778 case CallType::TYPE_SATELLITE: {
1779 if (dir == CallDirection::CALL_DIRECTION_OUT) {
1780 callPtr = (std::make_unique<SatelliteCall>(paraInfo, extras)).release();
1781 } else {
1782 callPtr = (std::make_unique<SatelliteCall>(paraInfo)).release();
1783 }
1784 break;
1785 }
1786 case CallType::TYPE_BLUETOOTH: {
1787 std::string macAddress = DelayedSingleton<BluetoothCallConnection>::GetInstance()->GetMacAddress();
1788 if (dir == CallDirection::CALL_DIRECTION_OUT) {
1789 callPtr = (std::make_unique<BluetoothCall>(paraInfo, extras, macAddress)).release();
1790 } else {
1791 callPtr = (std::make_unique<BluetoothCall>(paraInfo, macAddress)).release();
1792 }
1793 break;
1794 }
1795 default:
1796 return nullptr;
1797 }
1798 return callPtr;
1799 }
1800
ShouldRejectIncomingCall()1801 bool CallStatusManager::ShouldRejectIncomingCall()
1802 {
1803 bool hasEcc = false;
1804 if (HasEmergencyCall(hasEcc) == TELEPHONY_SUCCESS && hasEcc) {
1805 TELEPHONY_LOGI("HasEmergencyCall reject incoming call.");
1806 return true;
1807 }
1808 if (CallStatusManager::GetDevProvisioned() != DEVICE_PROVISION_VALID) {
1809 TELEPHONY_LOGW("ShouldRejectIncomingCall: device_provisioned = 0");
1810 return true;
1811 }
1812 auto datashareHelper = SettingsDataShareHelper::GetInstance();
1813 std::string user_setup_complete {"1"};
1814 std::vector<int> activedOsAccountIds;
1815 OHOS::AccountSA::OsAccountManager::QueryActiveOsAccountIds(activedOsAccountIds);
1816 if (activedOsAccountIds.empty()) {
1817 TELEPHONY_LOGW("ShouldRejectIncomingCall: activedOsAccountIds is empty");
1818 return false;
1819 }
1820 int userId = activedOsAccountIds[0];
1821 OHOS::Uri uri_setup(
1822 "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_"
1823 + std::to_string(userId) + "?Proxy=true&key=user_setup_complete");
1824 int resp_userSetup = datashareHelper->Query(uri_setup, "user_setup_complete", user_setup_complete);
1825 if (resp_userSetup == TELEPHONY_SUCCESS && (user_setup_complete == "0" || user_setup_complete.empty())) {
1826 TELEPHONY_LOGW("ShouldRejectIncomingCall: user_setup_complete = 0");
1827 return true;
1828 }
1829 return false;
1830 }
1831
ShouldBlockIncomingCall(const sptr<CallBase> & call,const CallDetailInfo & info)1832 bool CallStatusManager::ShouldBlockIncomingCall(const sptr<CallBase> &call, const CallDetailInfo &info)
1833 {
1834 bool isEcc = false;
1835 DelayedSingleton<CellularCallConnection>::GetInstance()->IsEmergencyPhoneNumber(
1836 info.phoneNum, info.accountId, isEcc);
1837 if (isEcc) {
1838 TELEPHONY_LOGW("incoming phoneNumber is ecc.");
1839 return false;
1840 }
1841 std::shared_ptr<SpamCallAdapter> spamCallAdapterPtr_ = std::make_shared<SpamCallAdapter>();
1842 if (spamCallAdapterPtr_ == nullptr) {
1843 TELEPHONY_LOGE("create SpamCallAdapter object failed!");
1844 return false;
1845 }
1846 bool isDetectedSpamCall = spamCallAdapterPtr_->DetectSpamCall(std::string(info.phoneNum), info.accountId);
1847 if (!isDetectedSpamCall) {
1848 TELEPHONY_LOGE("DetectSpamCall failed!");
1849 return false;
1850 }
1851 detectStartTime = std::chrono::system_clock::now();
1852 if (spamCallAdapterPtr_->WaitForDetectResult()) {
1853 TELEPHONY_LOGW("DetectSpamCall no time out");
1854 NumberMarkInfo numberMarkInfo;
1855 bool isBlock = false;
1856 int32_t blockReason;
1857 std::string detectDetails = "";
1858 spamCallAdapterPtr_->GetParseResult(isBlock, numberMarkInfo, blockReason, detectDetails);
1859 call->SetNumberMarkInfo(numberMarkInfo);
1860 call->SetBlockReason(blockReason);
1861 call->SetDetectDetails(detectDetails);
1862 AAFwk::WantParams params = call->GetExtraParams();
1863 params.SetParam("blockReason", AAFwk::Integer::Box(blockReason));
1864 call->SetExtraParams(params);
1865 if (isBlock) {
1866 return true;
1867 }
1868 }
1869 return false;
1870 }
1871
IsRingOnceCall(const sptr<CallBase> & call,const CallDetailInfo & info)1872 bool CallStatusManager::IsRingOnceCall(const sptr<CallBase> &call, const CallDetailInfo &info)
1873 {
1874 NumberMarkInfo numberMarkInfo = call->GetNumberMarkInfo();
1875 ContactInfo contactInfo = call->GetCallerInfo();
1876 if (numberMarkInfo.markType == MarkType::MARK_TYPE_YELLOW_PAGE || contactInfo.name != "") {
1877 TELEPHONY_LOGW("yellowpage or contact, no need check ring once call");
1878 return false;
1879 }
1880 auto datashareHelper = SettingsDataShareHelper::GetInstance();
1881 std::string is_check_ring_once {"0"};
1882 std::string key = "spamshield_sim" + std::to_string(info.accountId + 1) + "_phone_switch_ring_once";
1883 OHOS::Uri uri(
1884 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=" + key);
1885 int32_t ret = datashareHelper->Query(uri, key, is_check_ring_once);
1886 TELEPHONY_LOGW("is_check_ring_once = %{public}s", is_check_ring_once.c_str());
1887 if (ret != TELEPHONY_SUCCESS || is_check_ring_once == "0") {
1888 return false;
1889 }
1890 auto waitTime = WAIT_TIME_THREE_SECOND;
1891 if (detectStartTime != std::chrono::system_clock::from_time_t(0)) {
1892 auto detectEndTime = std::chrono::system_clock::now();
1893 auto diff = detectEndTime - detectStartTime;
1894 std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(diff);
1895 if (diff >= WAIT_TIME_THREE_SECOND) {
1896 TELEPHONY_LOGW("cost time over 3s, non need check ring once call");
1897 }
1898 waitTime = WAIT_TIME_THREE_SECOND - ms;
1899 }
1900 if (timeWaitHelper_ == nullptr) {
1901 timeWaitHelper_ = std::make_unique<TimeWaitHelper>(waitTime);
1902 }
1903 if (!timeWaitHelper_->WaitForResult()) {
1904 TELEPHONY_LOGW("is not ring once");
1905 timeWaitHelper_ = nullptr;
1906 return false;
1907 }
1908 timeWaitHelper_ = nullptr;
1909 return true;
1910 }
1911
HandleRingOnceCall(sptr<CallBase> & call)1912 int32_t CallStatusManager::HandleRingOnceCall(sptr<CallBase> &call)
1913 {
1914 if (call == nullptr) {
1915 TELEPHONY_LOGE("call is nullptr!");
1916 return TELEPHONY_ERR_LOCAL_PTR_NULL;
1917 }
1918 int32_t ret = call->SetTelCallState(TelCallState::CALL_STATUS_INCOMING);
1919 if (ret != TELEPHONY_SUCCESS && ret != CALL_ERR_NOT_NEW_STATE) {
1920 TELEPHONY_LOGE("Set CallState failed!");
1921 return ret;
1922 }
1923 return DelayedSingleton<CallControlManager>::GetInstance()->AddCallLogAndNotification(call);
1924 }
1925
PackParaInfo(DialParaInfo & paraInfo,const CallDetailInfo & info,CallDirection dir,AppExecFwk::PacMap & extras)1926 void CallStatusManager::PackParaInfo(
1927 DialParaInfo ¶Info, const CallDetailInfo &info, CallDirection dir, AppExecFwk::PacMap &extras)
1928 {
1929 paraInfo.isEcc = false;
1930 paraInfo.dialType = DialType::DIAL_CARRIER_TYPE;
1931 if (dir == CallDirection::CALL_DIRECTION_OUT) {
1932 DelayedSingleton<CallControlManager>::GetInstance()->GetDialParaInfo(paraInfo, extras);
1933 }
1934 TELEPHONY_LOGI("is ecc: %{public}d", paraInfo.isEcc);
1935 if (info.callType == CallType::TYPE_VOIP) {
1936 paraInfo.voipCallInfo.voipCallId = info.voipCallInfo.voipCallId;
1937 paraInfo.voipCallInfo.userName = info.voipCallInfo.userName;
1938 (paraInfo.voipCallInfo.userProfile).assign(
1939 (info.voipCallInfo.userProfile).begin(), (info.voipCallInfo.userProfile).end());
1940 paraInfo.voipCallInfo.abilityName = info.voipCallInfo.abilityName;
1941 paraInfo.voipCallInfo.extensionId = info.voipCallInfo.extensionId;
1942 paraInfo.voipCallInfo.voipBundleName = info.voipCallInfo.voipBundleName;
1943 paraInfo.voipCallInfo.showBannerForIncomingCall = info.voipCallInfo.showBannerForIncomingCall;
1944 paraInfo.voipCallInfo.isConferenceCall = info.voipCallInfo.isConferenceCall;
1945 paraInfo.voipCallInfo.isVoiceAnswerSupported = info.voipCallInfo.isVoiceAnswerSupported;
1946 paraInfo.voipCallInfo.hasMicPermission = info.voipCallInfo.hasMicPermission;
1947 paraInfo.voipCallInfo.isCapsuleSticky = info.voipCallInfo.isCapsuleSticky;
1948 paraInfo.voipCallInfo.uid = info.voipCallInfo.uid;
1949 }
1950 paraInfo.number = info.phoneNum;
1951 paraInfo.callId = GetNewCallId();
1952 paraInfo.index = info.index;
1953 paraInfo.videoState = info.callMode;
1954 paraInfo.accountId = info.accountId;
1955 paraInfo.callType = info.callType;
1956 paraInfo.callState = info.state;
1957 paraInfo.bundleName = info.bundleName;
1958 paraInfo.crsType = info.crsType;
1959 paraInfo.originalCallType = info.originalCallType;
1960 paraInfo.extraParams =
1961 AAFwk::WantParamWrapper::ParseWantParamsWithBrackets(extras.GetStringValue("extraParams"));
1962 bool value = false;
1963 int32_t namePresentation;
1964 OperatorConfig config;
1965 CoreServiceClient::GetInstance().GetOperatorConfigs(info.accountId, config);
1966 if (config.boolValue.find("support_cnap_bool") != config.boolValue.end()) {
1967 value = config.boolValue["support_cnap_bool"];
1968 }
1969 namePresentation = value ? info.namePresentation : PRESENTATION_RESTRICTED;
1970 paraInfo.extraParams.SetParam("namePresentation", AAFwk::Integer::Box(namePresentation));
1971 paraInfo.extraParams.SetParam("name", AAFwk::String::Box(namePresentation == 0 ? info.name : ""));
1972 paraInfo.phoneOrWatch = info.phoneOrWatch;
1973 paraInfo.newCallUseBox = info.newCallUseBox;
1974 }
1975
IsFocusModeOpen()1976 bool CallStatusManager::IsFocusModeOpen()
1977 {
1978 auto datashareHelper = SettingsDataShareHelper::GetInstance();
1979 std::string focusModeEnable {"0"};
1980 std::vector<int> activedOsAccountIds;
1981 OHOS::AccountSA::OsAccountManager::QueryActiveOsAccountIds(activedOsAccountIds);
1982 if (activedOsAccountIds.empty()) {
1983 TELEPHONY_LOGW("ShouldRejectIncomingCall: activedOsAccountIds is empty");
1984 return false;
1985 }
1986 int userId = activedOsAccountIds[0];
1987 OHOS::Uri uri(
1988 "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_"
1989 + std::to_string(userId) + "?Proxy=true&key=focus_mode_enable");
1990 int resp = datashareHelper->Query(uri, "focus_mode_enable", focusModeEnable);
1991 TELEPHONY_LOGI("IsFocusModeOpen: userId = %{public}d, focus_mode_enable = %{public}s",
1992 userId, focusModeEnable.c_str());
1993 if (resp == TELEPHONY_SUCCESS && focusModeEnable == "1") {
1994 return true;
1995 }
1996 return false;
1997 }
1998
IsRejectCall(sptr<CallBase> & call,const CallDetailInfo & info,bool & block)1999 bool CallStatusManager::IsRejectCall(sptr<CallBase> &call, const CallDetailInfo &info, bool &block)
2000 {
2001 int32_t state;
2002 DelayedSingleton<CallControlManager>::GetInstance()->GetVoIPCallState(state);
2003 if (ShouldRejectIncomingCall() || state == (int32_t)CallStateToApp::CALL_STATE_RINGING) {
2004 CallManagerHisysevent::HiWriteBehaviorEventPhoneUE(
2005 CALL_INCOMING_REJECT_BY_SYSTEM, PNAMEID_KEY, KEY_CALL_MANAGER, PVERSIONID_KEY, "",
2006 ACTION_TYPE, REJECT_BY_OOBE);
2007 block = false;
2008 return true;
2009 }
2010 if (info.callType != CallType::TYPE_VOIP && info.callType != CallType::TYPE_BLUETOOTH &&
2011 ShouldBlockIncomingCall(call, info)) {
2012 CallManagerHisysevent::HiWriteBehaviorEventPhoneUE(
2013 CALL_INCOMING_REJECT_BY_SYSTEM, PNAMEID_KEY, KEY_CALL_MANAGER, PVERSIONID_KEY, "",
2014 ACTION_TYPE, REJECT_BY_NUM_BLOCK);
2015 block = true;
2016 return true;
2017 }
2018 if (IsFocusModeOpen()) {
2019 int ret = Notification::NotificationHelper::IsNeedSilentInDoNotDisturbMode(info.phoneNum, 0);
2020 TELEPHONY_LOGW("IsRejectCall IsNeedSilentInDoNotDisturbMode ret:%{public}d", ret);
2021 if (ret == 0) {
2022 CallManagerHisysevent::HiWriteBehaviorEventPhoneUE(
2023 CALL_INCOMING_REJECT_BY_SYSTEM, PNAMEID_KEY, KEY_CALL_MANAGER, PVERSIONID_KEY, "",
2024 ACTION_TYPE, REJECT_IN_FOCUSMODE);
2025 AAFwk::WantParams params = call->GetExtraParams();
2026 params.SetParam("IsNeedSilentInDoNotDisturbMode", AAFwk::Integer::Box(1));
2027 call->SetExtraParams(params);
2028 }
2029 }
2030 return false;
2031 }
2032
CreateAndSaveNewCall(const CallDetailInfo & info,CallDirection direction)2033 void CallStatusManager::CreateAndSaveNewCall(const CallDetailInfo &info, CallDirection direction)
2034 {
2035 if (GetOneCallObjectByIndex(INIT_INDEX) != nullptr) {
2036 TELEPHONY_LOGI("get init_index call success");
2037 UpdateDialingCallInfo(info);
2038 return;
2039 }
2040 auto call = CreateNewCall(info, direction);
2041 if (call != nullptr) {
2042 ffrt::submit([=]() {
2043 DelayedSingleton<CallNumberUtils>::GetInstance()->YellowPageAndMarkUpdate(call);
2044 });
2045 AddOneCallObject(call);
2046 DelayedSingleton<CallControlManager>::GetInstance()->NotifyNewCallCreated(call);
2047 }
2048 }
2049
UpdateCallStateAndHandleDsdsMode(const CallDetailInfo & info,sptr<CallBase> & call)2050 int32_t CallStatusManager::UpdateCallStateAndHandleDsdsMode(const CallDetailInfo &info, sptr<CallBase> &call)
2051 {
2052 if (call == nullptr) {
2053 return TELEPHONY_ERR_LOCAL_PTR_NULL;
2054 }
2055 TelCallState priorState = call->GetTelCallState();
2056 int32_t ret = UpdateCallState(call, TelCallState::CALL_STATUS_HOLDING);
2057 if (ret != TELEPHONY_SUCCESS) {
2058 TELEPHONY_LOGE("UpdateCallState failed, errCode:%{public}d", ret);
2059 }
2060 int32_t callId = call->GetCallID();
2061 int32_t dsdsMode = DSDS_MODE_V2;
2062 DelayedRefSingleton<CoreServiceClient>::GetInstance().GetDsdsMode(dsdsMode);
2063 TELEPHONY_LOGE("HoldingHandle dsdsMode:%{public}d", dsdsMode);
2064 bool canSwitchCallState = call->GetCanSwitchCallState();
2065 if (dsdsMode == static_cast<int32_t>(DsdsMode::DSDS_MODE_V5_DSDA) ||
2066 dsdsMode == static_cast<int32_t>(DsdsMode::DSDS_MODE_V5_TDM)) {
2067 int32_t activeCallNum = GetCallNum(TelCallState::CALL_STATUS_ACTIVE);
2068 if (needWaitHold_ && activeCallNum == 0) {
2069 needWaitHold_ = false;
2070 HandleDialWhenHolding(callId, call);
2071 } else {
2072 TelConferenceState confState = call->GetTelConferenceState();
2073 int32_t conferenceId = ERR_ID;
2074 call->GetMainCallId(conferenceId);
2075 if (confState != TelConferenceState::TEL_CONFERENCE_IDLE && conferenceId == callId) {
2076 AutoHandleForDsda(canSwitchCallState, priorState, activeCallNum, call->GetSlotId(), false);
2077 } else if (confState == TelConferenceState::TEL_CONFERENCE_IDLE) {
2078 AutoHandleForDsda(canSwitchCallState, priorState, activeCallNum, call->GetSlotId(), false);
2079 }
2080 }
2081 }
2082 return ret;
2083 }
2084
HandleDialWhenHolding(int32_t callId,sptr<CallBase> & call)2085 void CallStatusManager::HandleDialWhenHolding(int32_t callId, sptr<CallBase> &call)
2086 {
2087 auto callRequestEventHandler = DelayedSingleton<CallRequestEventHandlerHelper>::GetInstance();
2088 if (callRequestEventHandler->IsPendingHangup()) {
2089 sptr<CallBase> holdCall = CallObjectManager::GetOneCallObject(callId);
2090 if (holdCall != nullptr) {
2091 holdCall->UnHoldCall();
2092 }
2093 int32_t pendingHangupCallId = callRequestEventHandler->GetPendingHangupCallId();
2094 sptr<CallBase> pendingHangupCall = CallObjectManager::GetOneCallObject(pendingHangupCallId);
2095 if (pendingHangupCall != nullptr) {
2096 UpdateCallState(pendingHangupCall, TelCallState::CALL_STATUS_DISCONNECTED);
2097 DeleteOneCallObject(pendingHangupCallId);
2098 }
2099 callRequestEventHandler->SetPendingHangup(false, -1);
2100 } else {
2101 int32_t result = DelayedSingleton<CellularCallConnection>::GetInstance()->Dial(GetDialCallInfo());
2102 sptr<CallBase> dialCall = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING);
2103 if (result != TELEPHONY_SUCCESS && dialCall != nullptr) {
2104 DealFailDial(call);
2105 TELEPHONY_LOGI("Dial call fail");
2106 }
2107 }
2108 }
2109
IsDcCallConneceted()2110 bool CallStatusManager::IsDcCallConneceted()
2111 {
2112 std::string dcStatus = "";
2113 auto settingHelper = SettingsDataShareHelper::GetInstance();
2114 if (settingHelper != nullptr) {
2115 OHOS::Uri settingUri(SettingsDataShareHelper::SETTINGS_DATASHARE_URI);
2116 settingHelper->Query(settingUri, "distributed_modem_state", dcStatus);
2117 }
2118 if (dcStatus == "1_sink" || dcStatus == "1_source") {
2119 return true;
2120 }
2121 return false;
2122 }
2123
IsDistributeCallSourceStatus()2124 bool CallStatusManager::IsDistributeCallSourceStatus()
2125 {
2126 std::string dcStatus = "";
2127 auto settingHelper = SettingsDataShareHelper::GetInstance();
2128 if (settingHelper != nullptr) {
2129 OHOS::Uri settingUri(SettingsDataShareHelper::SETTINGS_DATASHARE_URI);
2130 settingHelper->Query(settingUri, "distributed_modem_state", dcStatus);
2131 }
2132 if (dcStatus == "1_source") {
2133 return true;
2134 }
2135 return false;
2136 }
2137
SetBtCallDialByPhone(const sptr<CallBase> & call,bool isBtCallDialByPhone)2138 void CallStatusManager::SetBtCallDialByPhone(const sptr<CallBase> &call, bool isBtCallDialByPhone)
2139 {
2140 if (call == nullptr) {
2141 return;
2142 }
2143 CallAttributeInfo info;
2144 call->GetCallAttributeInfo(info);
2145 AAFwk::WantParams object = AAFwk::WantParamWrapper::ParseWantParamsWithBrackets(info.extraParamsString);
2146 object.SetParam("isBtCallDialByPhone", AAFwk::Boolean::Box(isBtCallDialByPhone));
2147 call->SetExtraParams(object);
2148 call->GetCallAttributeBaseInfo(info);
2149 }
2150
BtCallDialingHandle(sptr<CallBase> & call,const CallDetailInfo & info)2151 void CallStatusManager::BtCallDialingHandle(sptr<CallBase> &call, const CallDetailInfo &info)
2152 {
2153 if (call != nullptr) {
2154 call->SetPhoneOrWatchDial(static_cast<int32_t>(PhoneOrWatchDial::WATCH_DIAL));
2155 SetBtCallDialByPhone(call, false);
2156 } else {
2157 call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
2158 if (call != nullptr) {
2159 call->SetPhoneOrWatchDial(static_cast<int32_t>(PhoneOrWatchDial::PHONE_DIAL));
2160 SetBtCallDialByPhone(call, true);
2161 }
2162 }
2163 }
2164
SetDistributedDeviceDialing(sptr<CallBase> call,bool isDistributedDeviceDialing)2165 void CallStatusManager::SetDistributedDeviceDialing(sptr<CallBase> call, bool isDistributedDeviceDialing)
2166 {
2167 if (call == nullptr) {
2168 return;
2169 }
2170 if (isDistributedDeviceDialing) {
2171 AAFwk::WantParams extraParams;
2172 extraParams.SetParam("isDistributedDeviceDialing", AAFwk::String::Box("true"));
2173 call->SetExtraParams(extraParams);
2174 }
2175 }
2176
BtCallDialingHandleFirst(sptr<CallBase> call,const CallDetailInfo & info)2177 void CallStatusManager::BtCallDialingHandleFirst(sptr<CallBase> call, const CallDetailInfo &info)
2178 {
2179 if (call == nullptr) {
2180 return;
2181 }
2182 call->SetPhoneOrWatchDial(static_cast<int32_t>(PhoneOrWatchDial::WATCH_DIAL));
2183 SetBtCallDialByPhone(call, false);
2184 if (info.state == TelCallState::CALL_STATUS_ALERTING) {
2185 UpdateDialingCallInfo(info);
2186 if (call->GetTelCallState() == TelCallState::CALL_STATUS_ALERTING) {
2187 call->SetTelCallState(TelCallState::CALL_STATUS_DIALING);
2188 }
2189 }
2190 }
2191
HandleCallReportInfoEx(const CallDetailInfo & info)2192 int32_t CallStatusManager::HandleCallReportInfoEx(const CallDetailInfo &info)
2193 {
2194 int32_t ret = TELEPHONY_ERR_FAIL;
2195 switch (info.state) {
2196 case TelCallState::CALL_STATUS_WAITING:
2197 ret = WaitingHandle(info);
2198 break;
2199 case TelCallState::CALL_STATUS_DISCONNECTED:
2200 ret = DisconnectedHandle(info);
2201 break;
2202 case TelCallState::CALL_STATUS_DISCONNECTING:
2203 ret = DisconnectingHandle(info);
2204 break;
2205 default:
2206 TELEPHONY_LOGE("Invalid call state!");
2207 break;
2208 }
2209 return ret;
2210 }
2211
ClearPendingState(sptr<CallBase> & call)2212 void CallStatusManager::ClearPendingState(sptr<CallBase> &call)
2213 {
2214 auto callRequestEventHandler = DelayedSingleton<CallRequestEventHandlerHelper>::GetInstance();
2215 int32_t callId = call->GetCallID();
2216 TELEPHONY_LOGI("check clear pending state callId = %{public}d", callId);
2217 if (callRequestEventHandler->HasPendingMo(callId)) {
2218 callRequestEventHandler->SetPendingMo(false, -1);
2219 }
2220 if (callRequestEventHandler->HasPendingHangup(callId)) {
2221 if (call->GetCallRunningState() != CallRunningState::CALL_RUNNING_STATE_ENDED) {
2222 call->HangUpCall();
2223 }
2224 callRequestEventHandler->SetPendingHangup(false, -1);
2225 }
2226 }
2227
RefreshCallDisconnectReason(const sptr<CallBase> & call,int32_t reason,const std::string & message)2228 void CallStatusManager::RefreshCallDisconnectReason(const sptr<CallBase> &call, int32_t reason,
2229 const std::string &message)
2230 {
2231 switch (reason) {
2232 case static_cast<int32_t>(RilDisconnectedReason::DISCONNECTED_REASON_CS_CALL_ANSWERED_ELSEWHER):
2233 if (call->GetCallType() == CallType::TYPE_CS) {
2234 call->SetAnswerType(CallAnswerType::CALL_ANSWERED_ELSEWHER);
2235 TELEPHONY_LOGI("cs call answered elsewhere");
2236 }
2237 break;
2238 case static_cast<int32_t>(RilDisconnectedReason::DISCONNECTED_REASON_ANSWERED_ELSEWHER):
2239 {
2240 TELEPHONY_LOGI("RefreshCallDisconnectReason message[%{public}s]", message.c_str());
2241 std::string lowerStr = message;
2242 std::transform(lowerStr.begin(), lowerStr.end(), lowerStr.begin(), ::tolower);
2243 if (DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsSinkRole() ||
2244 lowerStr.find("elsewhere") != std::string::npos) {
2245 call->SetAnswerType(CallAnswerType::CALL_ANSWERED_ELSEWHER);
2246 TELEPHONY_LOGI("call answered elsewhere");
2247 }
2248 }
2249 break;
2250 case static_cast<int32_t>(RilDisconnectedReason::DISCONNECTED_REASON_NORMAL):
2251 {
2252 AAFwk::WantParams params = call->GetExtraParams();
2253 params.SetParam("disconnectedReason",
2254 AAFwk::Integer::Box(static_cast<int32_t>(CallAnswerType::CALL_DISCONNECTED_BY_REMOTE)));
2255 call->SetExtraParams(params);
2256 }
2257 break;
2258 default:
2259 break;
2260 }
2261 }
2262 #ifdef NOT_SUPPORT_MULTICALL
AutoAnswerSecondCall()2263 void CallStatusManager::AutoAnswerSecondCall()
2264 {
2265 std::list<sptr<CallBase>> allCallList = CallObjectManager::GetAllCallList();
2266 for (auto call : allCallList) {
2267 if (call->GetTelCallState() != TelCallState::CALL_STATUS_INCOMING &&
2268 call->GetTelCallState() != TelCallState::CALL_STATUS_WAITING) {
2269 continue;
2270 }
2271 if (call->GetAutoAnswerState()) {
2272 TELEPHONY_LOGI("Auto AnswerCall callid=%{public}d", call->GetCallID());
2273 int ret = DelayedSingleton<CallControlManager>::GetInstance()->AnswerCall(call->GetCallID(),
2274 static_cast<int32_t>(call->GetVideoStateType()));
2275 if (ret != TELEPHONY_SUCCESS) {
2276 TELEPHONY_LOGE("Auto AnswerCall failed callid=%{public}d", call->GetCallID());
2277 }
2278 return;
2279 }
2280 }
2281 return;
2282 }
2283 #endif
IsFromTheSameNumberAtTheSameTime(const sptr<CallBase> & newCall)2284 bool CallStatusManager::IsFromTheSameNumberAtTheSameTime(const sptr<CallBase> &newCall)
2285 {
2286 if (newCall == nullptr) {
2287 return false;
2288 }
2289 // get the old call obj with phoneNumber of new call.
2290 std::string phoneNumber = newCall->GetAccountNumber();
2291 sptr<CallBase> oldCall = GetOneCallObject(phoneNumber);
2292 if (oldCall == nullptr) {
2293 return false;
2294 }
2295 // compare old with new in scene of one-number-dual-terminal
2296 if ((abs(newCall->GetCallID() - oldCall->GetCallID()) != 1)) {
2297 return false;
2298 }
2299 CallAttributeInfo oldAttrInfo;
2300 oldCall->GetCallAttributeBaseInfo(oldAttrInfo);
2301 if (oldAttrInfo.callState != TelCallState::CALL_STATUS_INCOMING) {
2302 return false;
2303 }
2304 CallAttributeInfo newAttrInfo;
2305 newCall->GetCallAttributeBaseInfo(newAttrInfo);
2306 constexpr int32_t CALLS_COMING_MAX_INTERVAL_DURATION = 10 * 1000;
2307 if ((newAttrInfo.callCreateTime - oldAttrInfo.callCreateTime) > CALLS_COMING_MAX_INTERVAL_DURATION) {
2308 return false;
2309 }
2310 TELEPHONY_LOGI("the new call is from the same number at the same time.");
2311 return true;
2312 }
2313
ModifyEsimType()2314 void CallStatusManager::ModifyEsimType()
2315 {
2316 auto datashareHelper = SettingsDataShareHelper::GetInstance();
2317 if (datashareHelper == nullptr) {
2318 return;
2319 }
2320 OHOS::Uri settingUri(SettingsDataShareHelper::SETTINGS_DATASHARE_URI);
2321 std::string esimCardType = "";
2322
2323 constexpr const char* ESIM_TYPE_ONE_NUMBER_DUAL_TERMINAL = "1";
2324 int32_t retCode = datashareHelper->Query(settingUri, "key_esim_card_type", esimCardType);
2325 if ((retCode == TELEPHONY_SUCCESS) && (esimCardType == ESIM_TYPE_ONE_NUMBER_DUAL_TERMINAL ||
2326 esimCardType == "")) {
2327 TELEPHONY_LOGI("do not need to fix esim card type, current type: %{public}s", esimCardType.c_str());
2328 return;
2329 }
2330
2331 retCode = datashareHelper->Update(settingUri, "key_esim_card_type", ESIM_TYPE_ONE_NUMBER_DUAL_TERMINAL);
2332 if (retCode != TELEPHONY_SUCCESS) {
2333 TELEPHONY_LOGE("update esim card type failed, retCode: %{public}d", retCode);
2334 return;
2335 }
2336 std::string manullySetState = "";
2337 retCode = datashareHelper->Query(settingUri, "key_manually_set_net", manullySetState);
2338 if (manullySetState == "") {
2339 manullySetState = "000";
2340 }
2341 constexpr int32_t STATUS_VALUE_LEN = 3;
2342 const char *changeStatus = manullySetState.c_str();
2343 if (strlen(changeStatus) != STATUS_VALUE_LEN) {
2344 return;
2345 }
2346 constexpr char SMARTOFF_NETWORK_MODIFIED = '1';
2347 int32_t index = 0;
2348 if (changeStatus[index++] != SMARTOFF_NETWORK_MODIFIED) {
2349 retCode = datashareHelper->Update(settingUri, "key_smartoff_network_bluetooth_connection", "1");
2350 }
2351 if (changeStatus[index++] != SMARTOFF_NETWORK_MODIFIED) {
2352 retCode = datashareHelper->Update(settingUri, "key_smartoff_network_not_wear", "true");
2353 }
2354 if (changeStatus[index++] != SMARTOFF_NETWORK_MODIFIED) {
2355 retCode = datashareHelper->Update(settingUri, "key_smartoff_network_sleep_mode", "true");
2356 }
2357 }
2358
RefreshOldCall(const CallDetailInfo & info,bool & isExistedOldCall)2359 int32_t CallStatusManager::RefreshOldCall(const CallDetailInfo &info, bool &isExistedOldCall)
2360 {
2361 TELEPHONY_LOGI("RefreshOldCall enter.");
2362 sptr<CallBase> initCall = GetOneCallObjectByIndex(INIT_INDEX);
2363 if (initCall != nullptr) {
2364 DealFailDial(initCall);
2365 }
2366 sptr<CallBase> call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
2367 if (call == nullptr) {
2368 isExistedOldCall = false;
2369 return TELEPHONY_SUCCESS;
2370 }
2371 isExistedOldCall = true;
2372 auto oldCallType = call->GetCallType();
2373 auto videoState = call->GetVideoStateType();
2374 if (oldCallType != info.callType || call->GetTelCallState() != info.state || videoState != info.callMode) {
2375 TELEPHONY_LOGI("refresh call.");
2376 call = RefreshCallIfNecessary(call, info);
2377 if (oldCallType != info.callType || videoState != info.callMode) {
2378 return UpdateCallState(call, info.state);
2379 }
2380 }
2381
2382 return TELEPHONY_SUCCESS;
2383 }
2384
IsCallMotionRecognitionEnable(const std::string & key)2385 bool CallStatusManager::IsCallMotionRecognitionEnable(const std::string& key)
2386 {
2387 std::vector<int> activedOsAccountIds;
2388 OHOS::AccountSA::OsAccountManager::QueryActiveOsAccountIds(activedOsAccountIds);
2389 if (activedOsAccountIds.empty()) {
2390 TELEPHONY_LOGW("activedOsAccountIds is empty");
2391 return false;
2392 }
2393 int userId = activedOsAccountIds[0];
2394 OHOS::Uri uri(
2395 "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_"
2396 + std::to_string(userId) + "?Proxy=true");
2397 auto datashareHelper = SettingsDataShareHelper::GetInstance();
2398 std::string is_motion_switch_on {"0"};
2399 int resp = datashareHelper->Query(uri, key, is_motion_switch_on);
2400 TELEPHONY_LOGI("key = %{public}s, value = %{public}s", key.c_str(), is_motion_switch_on.c_str());
2401 if (resp == TELEPHONY_SUCCESS && is_motion_switch_on == "1") {
2402 return true;
2403 }
2404 return false;
2405 }
2406
StartInComingCallMotionRecognition()2407 void CallStatusManager::StartInComingCallMotionRecognition()
2408 {
2409 if (GetOneCarrierCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING) != nullptr ||
2410 GetOneCarrierCallObject(CallRunningState::CALL_RUNNING_STATE_ACTIVE) != nullptr ||
2411 GetOneCarrierCallObject(CallRunningState::CALL_RUNNING_STATE_HOLD) != nullptr) {
2412 TELEPHONY_LOGI("has dialing active or holding call return");
2413 return;
2414 }
2415 bool isPickupReduceVolumeSwitchOn =
2416 IsCallMotionRecognitionEnable(SettingsDataShareHelper::QUERY_MOTION_PICKUP_REDUCE_KEY);
2417 bool isFlipMuteSwitchOn = IsCallMotionRecognitionEnable(SettingsDataShareHelper::QUERY_MOTION_FLIP_MUTE_KEY);
2418 bool isCloseToEarQuickAnswerSwitchOn =
2419 IsCallMotionRecognitionEnable(SettingsDataShareHelper::QUERY_MOTION_CLOSE_TO_EAR_KEY);
2420 if (isPickupReduceVolumeSwitchOn || isFlipMuteSwitchOn || isCloseToEarQuickAnswerSwitchOn) {
2421 if (!Rosen::LoadMotionSensor()) {
2422 TELEPHONY_LOGE("LoadMotionSensor failed");
2423 return;
2424 }
2425 TELEPHONY_LOGI("LoadMotionSensor success");
2426 if (isPickupReduceVolumeSwitchOn) {
2427 MotionRecogntion::SubscribePickupSensor();
2428 }
2429 if (isFlipMuteSwitchOn) {
2430 MotionRecogntion::SubscribeFlipSensor();
2431 }
2432 if (isCloseToEarQuickAnswerSwitchOn) {
2433 MotionRecogntion::SubscribeCloseToEarSensor();
2434 }
2435 }
2436 }
2437
StartOutGoingCallMotionRecognition()2438 void CallStatusManager::StartOutGoingCallMotionRecognition()
2439 {
2440 bool isCloseToEarQuickAnswerSwitchOn =
2441 IsCallMotionRecognitionEnable(SettingsDataShareHelper::QUERY_MOTION_CLOSE_TO_EAR_KEY);
2442 if (isCloseToEarQuickAnswerSwitchOn) {
2443 if (!Rosen::LoadMotionSensor()) {
2444 TELEPHONY_LOGE("LoadMotionSensor failed");
2445 return;
2446 }
2447 TELEPHONY_LOGI("LoadMotionSensor success");
2448 MotionRecogntion::SubscribeCloseToEarSensor();
2449 }
2450 }
2451
RefreshDialingStateByOtherState(sptr<CallBase> & call,const CallDetailInfo & info)2452 bool CallStatusManager::RefreshDialingStateByOtherState(sptr<CallBase> &call, const CallDetailInfo &info)
2453 {
2454 sptr<CallBase> initCall = GetOneCallObjectByIndex(INIT_INDEX);
2455 if (initCall == nullptr) {
2456 TELEPHONY_LOGE("initCall is nullptr!");
2457 return false;
2458 }
2459 CallDetailInfo tempInfo = info;
2460 tempInfo.state = TelCallState::CALL_STATUS_DIALING;
2461 DialingHandle(tempInfo);
2462 HandleDsdaInfo(info.accountId);
2463 DelayedSingleton<BluetoothCallService>::GetInstance()->GetCallState();
2464 call = GetOneCallObjectByIndexSlotIdAndCallType(info.index, info.accountId, info.callType);
2465 if (call == nullptr) {
2466 TELEPHONY_LOGE("after recalling dialingHandle, call still is nullptr!");
2467 return false;
2468 }
2469 return true;
2470 }
2471
OnChange()2472 void OOBEStatusObserver::OnChange()
2473 {
2474 TELEPHONY_LOGE("OOBEStatusObserver::OnChange enter");
2475 CallStatusManager::UpdateDevProvisioned();
2476 }
2477
RegisterObserver()2478 void CallStatusManager::RegisterObserver()
2479 {
2480 if (oobeStatusObserver_ != nullptr) {
2481 return;
2482 }
2483 oobeStatusObserver_ = new OOBEStatusObserver();
2484 OHOS::Uri OOBEStatusUri(SettingsDataShareHelper::SETTINGS_DATASHARE_URI + "&key=device_provisioned");
2485 auto helper = DelayedSingleton<SettingsDataShareHelper>().GetInstance();
2486 if (!helper->RegisterToDataShare(OOBEStatusUri, oobeStatusObserver_)) {
2487 TELEPHONY_LOGE("RegisterObserver failed");
2488 }
2489 }
2490
GetDevProvisioned()2491 int32_t CallStatusManager::GetDevProvisioned()
2492 {
2493 if (deviceProvisioned_ == DEVICE_PROVISION_UNDEF) {
2494 UpdateDevProvisioned();
2495 }
2496 return deviceProvisioned_;
2497 }
2498
UpdateDevProvisioned()2499 void CallStatusManager::UpdateDevProvisioned()
2500 {
2501 auto datashareHelper = SettingsDataShareHelper::GetInstance();
2502 std::string deviceProvisioned {"0"};
2503 OHOS::Uri uri(
2504 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true&key=device_provisioned");
2505 int resp = datashareHelper->Query(uri, "device_provisioned", deviceProvisioned);
2506 if (resp == TELEPHONY_SUCCESS) {
2507 TELEPHONY_LOGI("UpdateDevProvisioned device_provisioned = %{public}s", deviceProvisioned.c_str());
2508 if (deviceProvisioned == "0" || deviceProvisioned.empty()) {
2509 deviceProvisioned_ = DEVICE_PROVISION_INVALID;
2510 } else if (deviceProvisioned == "1") {
2511 deviceProvisioned_ = DEVICE_PROVISION_VALID;
2512 }
2513 }
2514 }
2515 } // namespace Telephony
2516 } // namespace OHOS
2517