1 /* 2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef CALL_STATUS_MANAGER_H 17 #define CALL_STATUS_MANAGER_H 18 19 #include <map> 20 21 #include "refbase.h" 22 23 #include "common_type.h" 24 #include "call_status_policy.h" 25 #include "call_incoming_filter_manager.h" 26 #include "time_wait_helper.h" 27 #include "voip_call_manager_info.h" 28 29 /** 30 * Singleton 31 * @ClassName:CallStatusManager 32 * @Description:CallStatusManager is designed for watching call state changes, 33 * when call state changes, cellularcall will notify callstatusmanager to handle it. 34 * call state: idle,disconnected, disconnecting,dialing,alerting,active,holding,waiting 35 * incoming 36 */ 37 namespace OHOS { 38 namespace Telephony { 39 const int32_t SLOT_NUM = 2; 40 41 class CallStatusManager : public CallStatusPolicy { 42 public: 43 CallStatusManager(); 44 ~CallStatusManager(); 45 int32_t Init(); 46 int32_t UnInit(); 47 int32_t HandleCallReportInfo(const CallDetailInfo &info); 48 void HandleDsdaInfo(int32_t slotId); 49 int32_t HandleCallsReportInfo(const CallDetailsInfo &info); 50 int32_t HandleDisconnectedCause(const DisconnectedDetails &details); 51 int32_t HandleEventResultReportInfo(const CellularCallEventInfo &info); 52 int32_t HandleOttEventReportInfo(const OttCallEventInfo &info); 53 int32_t HandleVoipCallReportInfo(const CallDetailInfo &info); 54 void CallFilterCompleteResult(const CallDetailInfo &info); 55 int32_t HandleVoipEventReportInfo(const VoipCallEventInfo &info); 56 57 private: 58 void InitCallBaseEvent(); 59 int32_t IncomingHandle(const CallDetailInfo &info); 60 int32_t IncomingVoipCallHandle(const CallDetailInfo &info); 61 int32_t OutgoingVoipCallHandle(const CallDetailInfo &info); 62 int32_t AnsweredVoipCallHandle(const CallDetailInfo &info); 63 int32_t DisconnectingVoipCallHandle(const CallDetailInfo &info); 64 int32_t DialingHandle(const CallDetailInfo &info); 65 int32_t ActiveHandle(const CallDetailInfo &info); 66 int32_t ActiveVoipCallHandle(const CallDetailInfo &info); 67 int32_t HoldingHandle(const CallDetailInfo &info); 68 int32_t WaitingHandle(const CallDetailInfo &info); 69 int32_t AlertHandle(const CallDetailInfo &info); 70 int32_t DisconnectingHandle(const CallDetailInfo &info); 71 int32_t DisconnectedVoipCallHandle(const CallDetailInfo &info); 72 int32_t DisconnectedHandle(const CallDetailInfo &info); 73 void HandleHoldCallOrAutoAnswerCall(const sptr<CallBase> call, 74 std::vector<std::u16string> callIdList, CallRunningState previousState, TelCallState priorState); 75 void IsCanUnHold(int32_t activeCallNum, int32_t waitingCallNum, int32_t size, bool &canUnHold); 76 void AutoAnswer(int32_t activeCallNum, int32_t waitingCallNum); 77 void AutoHandleForDsda( 78 bool canSwitchCallState, TelCallState priorState, int32_t activeCallNum, int32_t slotId, bool continueAnswer); 79 void AutoAnswerForVoiceCall(sptr<CallBase> ringCall, int32_t slotId, bool continueAnswer); 80 void AutoAnswerForVideoCall(int32_t activeCallNum); 81 void AutoUnHoldForDsda(bool canSwitchCallState, TelCallState priorState, int32_t activeCallNum, int32_t slotId); 82 sptr<CallBase> CreateNewCall(const CallDetailInfo &info, CallDirection dir); 83 sptr<CallBase> CreateNewCallByCallType( 84 DialParaInfo ¶Info, const CallDetailInfo &info, CallDirection dir, AppExecFwk::PacMap &extras); 85 sptr<CallBase> RefreshCallIfNecessary(const sptr<CallBase> &call, const CallDetailInfo &info); 86 void SetOriginalCallTypeForActiveState(sptr<CallBase> &call); 87 void SetOriginalCallTypeForDisconnectState(sptr<CallBase> &call); 88 void PackParaInfo( 89 DialParaInfo ¶Info, const CallDetailInfo &info, CallDirection dir, AppExecFwk::PacMap &extras); 90 int32_t UpdateCallState(sptr<CallBase> &call, TelCallState nextState); 91 int32_t ToSpeakerPhone(sptr<CallBase> &call); 92 int32_t TurnOffMute(sptr<CallBase> &call); 93 int32_t IncomingFilterPolicy(const CallDetailInfo &info); 94 void QueryCallerInfo(ContactInfo &contactInfo, std::string phoneNum); 95 int32_t UpdateDialingCallInfo(const CallDetailInfo &info); 96 void SetContactInfo(sptr<CallBase> &call, std::string phoneNum); 97 int32_t HandleRejectCall(sptr<CallBase> &call, bool isBlock); 98 bool ShouldRejectIncomingCall(); 99 bool ShouldBlockIncomingCall(const sptr<CallBase> &call, const CallDetailInfo &info); 100 bool IsRingOnceCall(const sptr<CallBase> &call, const CallDetailInfo &info); 101 int32_t HandleRingOnceCall(sptr<CallBase> &call); 102 void CarrierAndVoipConflictProcess(int32_t callId); 103 void SetVideoCallState(sptr<CallBase> &call, TelCallState nextState); 104 bool IsFocusModeOpen(); 105 bool IsRejectCall(sptr<CallBase> &call, const CallDetailInfo &info, bool &block); 106 107 private: 108 CallDetailInfo callReportInfo_; 109 CallDetailsInfo callDetailsInfo_[SLOT_NUM]; 110 sptr<CallIncomingFilterManager> CallIncomingFilterManagerPtr_; 111 std::map<RequestResultEventId, CallAbilityEventId> mEventIdTransferMap_; 112 std::map<OttCallEventId, CallAbilityEventId> mOttEventIdTransferMap_; 113 VideoStateType priorVideoState_[SLOT_NUM] = {VideoStateType::TYPE_VOICE}; 114 const std::string DETAIL_INFO = "detail_info"; 115 const std::string CONTENT_TYPE = "content_type"; 116 const std::string PHONE = "phone"; 117 const int32_t CALL_NUMBER = 2; 118 std::unique_ptr<TimeWaitHelper> timeWaitHelper_ {nullptr}; 119 }; 120 } // namespace Telephony 121 } // namespace OHOS 122 123 #endif // CALL_STATUS_MANAGER_H 124