• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &paraInfo, 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 &paraInfo, 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 &paraInfo, 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