1 /*
2  * Copyright (C) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "voip_call.h"
17 
18 #include "call_control_manager.h"
19 #include "call_manager_errors.h"
20 #include "call_object_manager.h"
21 #include "telephony_log_wrapper.h"
22 #include "voip_call_connection.h"
23 
24 namespace OHOS {
25 namespace Telephony {
VoIPCall(DialParaInfo & info)26 VoIPCall::VoIPCall(DialParaInfo &info) : CarrierCall(info)
27 {
28     callId_ = info.callId;
29     voipCallId_ = info.voipCallInfo.voipCallId;
30     userName_ = info.voipCallInfo.userName;
31     userProfile_.assign((info.voipCallInfo.userProfile).begin(), (info.voipCallInfo.userProfile).end());
32     abilityName_ = info.voipCallInfo.abilityName;
33     extensionId_ = info.voipCallInfo.extensionId;
34     voipBundleName_ = info.voipCallInfo.voipBundleName;
35     showBannerForIncomingCall_ = info.voipCallInfo.showBannerForIncomingCall;
36     isConferenceCall_ = info.voipCallInfo.isConferenceCall;
37     isVoiceAnswerSupported_ = info.voipCallInfo.isVoiceAnswerSupported;
38     hasMicPermission_ = info.voipCallInfo.hasMicPermission;
39     uid_ = info.voipCallInfo.uid;
40 }
41 
~VoIPCall()42 VoIPCall::~VoIPCall() {}
43 
DialingProcess()44 int32_t VoIPCall::DialingProcess()
45 {
46     return TELEPHONY_SUCCESS;
47 }
48 
AnswerCall(int32_t videoState)49 int32_t VoIPCall::AnswerCall(int32_t videoState)
50 {
51     TELEPHONY_LOGI("VoIPCall::AnswerCall");
52     VoipCallEventInfo voipcallInfo;
53     int32_t ret = TELEPHONY_ERROR;
54     ret = PackVoipCallInfo(voipcallInfo);
55     if (ret != TELEPHONY_SUCCESS) {
56         TELEPHONY_LOGW("PackVoipCallInfo failed!");
57     }
58     DelayedSingleton<VoipCallConnection>::GetInstance()->AnswerCall(voipcallInfo, videoState);
59     if (ret != TELEPHONY_SUCCESS) {
60         TELEPHONY_LOGE("answer call failed!");
61         return CALL_ERR_ANSWER_FAILED;
62     }
63     return TELEPHONY_SUCCESS;
64 }
65 
PackVoipCallInfo(VoipCallEventInfo & voipcallInfo)66 int32_t VoIPCall::PackVoipCallInfo(VoipCallEventInfo &voipcallInfo)
67 {
68     voipcallInfo.voipCallId = voipCallId_;
69     voipcallInfo.bundleName = voipBundleName_;
70     voipcallInfo.uid = uid_;
71     return TELEPHONY_SUCCESS;
72 }
73 
RejectCall()74 int32_t VoIPCall::RejectCall()
75 {
76     TELEPHONY_LOGI("VoIPCall::RejectCall enter");
77     VoipCallEventInfo voipcallInfo;
78     int32_t ret = TELEPHONY_ERROR;
79     ret = PackVoipCallInfo(voipcallInfo);
80     if (ret != TELEPHONY_SUCCESS) {
81         TELEPHONY_LOGW("PackVoipCallInfo failed!");
82     }
83     DelayedSingleton<VoipCallConnection>::GetInstance()->RejectCall(voipcallInfo);
84     if (ret != TELEPHONY_SUCCESS) {
85         TELEPHONY_LOGE("reject call failed!");
86         return CALL_ERR_ANSWER_FAILED;
87     }
88     return TELEPHONY_SUCCESS;
89 }
90 
HangUpCall()91 int32_t VoIPCall::HangUpCall()
92 {
93     TELEPHONY_LOGI("VoIPCall::HangUpCall enter");
94     VoipCallEventInfo voipcallInfo;
95     int32_t ret = TELEPHONY_ERROR;
96     ret = PackVoipCallInfo(voipcallInfo);
97     if (ret != TELEPHONY_SUCCESS) {
98         TELEPHONY_LOGW("PackVoipCallInfo failed!");
99     }
100     voipcallInfo.errorReason = ErrorReason::USER_ANSWER_CELLULAR_FIRST;
101     DelayedSingleton<VoipCallConnection>::GetInstance()->HangUpCall(voipcallInfo);
102     if (ret != TELEPHONY_SUCCESS) {
103         TELEPHONY_LOGE("hangup call failed!");
104         return CALL_ERR_ANSWER_FAILED;
105     }
106     return TELEPHONY_SUCCESS;
107 }
108 
HangUpCall(const ErrorReason & status)109 int32_t VoIPCall::HangUpCall(const ErrorReason &status)
110 {
111     TELEPHONY_LOGI("VoIPCall::dial cellularcall HangUpvoipCall enter");
112     VoipCallEventInfo voipcallInfo;
113     int32_t ret = TELEPHONY_ERROR;
114     ret = PackVoipCallInfo(voipcallInfo);
115     if (ret != TELEPHONY_SUCCESS) {
116         TELEPHONY_LOGW("PackVoipCallInfo failed!");
117     }
118     voipcallInfo.errorReason = status;
119     DelayedSingleton<VoipCallConnection>::GetInstance()->HangUpCall(voipcallInfo);
120     if (ret != TELEPHONY_SUCCESS) {
121         TELEPHONY_LOGE("hangup call failed!");
122         return CALL_ERR_ANSWER_FAILED;
123     }
124     return TELEPHONY_SUCCESS;
125 }
126 
HoldCall()127 int32_t VoIPCall::HoldCall()
128 {
129     return TELEPHONY_SUCCESS;
130 }
131 
UnHoldCall()132 int32_t VoIPCall::UnHoldCall()
133 {
134     return TELEPHONY_SUCCESS;
135 }
136 
SwitchCall()137 int32_t VoIPCall::SwitchCall()
138 {
139     return TELEPHONY_SUCCESS;
140 }
141 
SetMute(int32_t mute,int32_t slotId)142 int32_t VoIPCall::SetMute(int32_t mute, int32_t slotId)
143 {
144     CallAttributeInfo info;
145     GetCallAttributeInfo(info);
146     std::string voipCallId = info.voipCallInfo.voipBundleName + ":" + std::to_string(info.voipCallInfo.uid) + ":" +
147         info.voipCallInfo.voipCallId;
148     CallAudioEvent callAudioEvent = mute == 1 ? CallAudioEvent::AUDIO_EVENT_MUTED : CallAudioEvent::AUDIO_EVENT_UNMUTED;
149     TELEPHONY_LOGI("VoIPCall::setMute voipCallId: %{public}s, callAudioEvent: %{public}d", voipCallId.c_str(),
150         callAudioEvent);
151     DelayedSingleton<VoipCallConnection>::GetInstance()->SendCallUiEvent(voipCallId, callAudioEvent);
152     return TELEPHONY_SUCCESS;
153 }
154 
GetCallAttributeInfo(CallAttributeInfo & info)155 void VoIPCall::GetCallAttributeInfo(CallAttributeInfo &info)
156 {
157     GetCallAttributeCarrierInfo(info);
158     info.callId = callId_;
159     info.voipCallInfo.voipCallId = voipCallId_;
160     info.voipCallInfo.userName = userName_;
161     (info.voipCallInfo.userProfile).assign(userProfile_.begin(), userProfile_.end());
162     info.voipCallInfo.extensionId = extensionId_;
163     info.voipCallInfo.abilityName = abilityName_;
164     info.voipCallInfo.voipBundleName = voipBundleName_;
165     info.voipCallInfo.showBannerForIncomingCall = showBannerForIncomingCall_;
166     info.voipCallInfo.isConferenceCall = isConferenceCall_;
167     info.voipCallInfo.isVoiceAnswerSupported = isVoiceAnswerSupported_;
168     info.voipCallInfo.hasMicPermission = hasMicPermission_;
169     info.voipCallInfo.uid = uid_;
170     return;
171 }
172 
CombineConference()173 int32_t VoIPCall::CombineConference()
174 {
175     return TELEPHONY_SUCCESS;
176 }
177 
HandleCombineConferenceFailEvent()178 void VoIPCall::HandleCombineConferenceFailEvent()
179 {
180     return;
181 }
182 
SeparateConference()183 int32_t VoIPCall::SeparateConference()
184 {
185     return TELEPHONY_SUCCESS;
186 }
187 
KickOutFromConference()188 int32_t VoIPCall::KickOutFromConference()
189 {
190     return TELEPHONY_SUCCESS;
191 }
192 
CanCombineConference()193 int32_t VoIPCall::CanCombineConference()
194 {
195     return TELEPHONY_SUCCESS;
196 }
197 
CanSeparateConference()198 int32_t VoIPCall::CanSeparateConference()
199 {
200     return TELEPHONY_SUCCESS;
201 }
202 
CanKickOutFromConference()203 int32_t VoIPCall::CanKickOutFromConference()
204 {
205     return TELEPHONY_SUCCESS;
206 }
207 
GetMainCallId(int32_t & mainCallId)208 int32_t VoIPCall::GetMainCallId(int32_t &mainCallId)
209 {
210     return TELEPHONY_SUCCESS;
211 }
212 
GetSubCallIdList(std::vector<std::u16string> & callIdList)213 int32_t VoIPCall::GetSubCallIdList(std::vector<std::u16string> &callIdList)
214 {
215     return TELEPHONY_SUCCESS;
216 }
217 
GetCallIdListForConference(std::vector<std::u16string> & callIdList)218 int32_t VoIPCall::GetCallIdListForConference(std::vector<std::u16string> &callIdList)
219 {
220     return TELEPHONY_SUCCESS;
221 }
222 
IsSupportConferenceable()223 int32_t VoIPCall::IsSupportConferenceable()
224 {
225     return TELEPHONY_SUCCESS;
226 }
227 
LaunchConference()228 int32_t VoIPCall::LaunchConference()
229 {
230     return TELEPHONY_SUCCESS;
231 }
232 
ExitConference()233 int32_t VoIPCall::ExitConference()
234 {
235     return TELEPHONY_SUCCESS;
236 }
237 
HoldConference()238 int32_t VoIPCall::HoldConference()
239 {
240     return TELEPHONY_SUCCESS;
241 }
242 
GetVoipCallId()243 std::string VoIPCall::GetVoipCallId()
244 {
245     return voipCallId_;
246 }
247 
GetVoipBundleName()248 std::string VoIPCall::GetVoipBundleName()
249 {
250     return voipBundleName_;
251 }
252 
GetVoipUid()253 int32_t VoIPCall::GetVoipUid()
254 {
255     return uid_;
256 }
257 } // namespace Telephony
258 } // namespace OHOS
259