1 /*
2 * Copyright (C) 2021 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 "bluetooth_call_service.h"
17
18 #include "audio_device_manager.h"
19 #include "bluetooth_call_manager.h"
20 #include "call_manager_errors.h"
21 #include "telephony_errors.h"
22 #include "telephony_log_wrapper.h"
23 #include "telephony_permission.h"
24 #include "audio_control_manager.h"
25 #include "ffrt.h"
26 #include "call_superprivacy_control_manager.h"
27
28
29 namespace OHOS {
30 namespace Telephony {
31 const uint64_t DELAY_STOP_PLAY_TIME = 3000000;
BluetoothCallService()32 BluetoothCallService::BluetoothCallService()
33 : callControlManagerPtr_(DelayedSingleton<CallControlManager>::GetInstance()),
34 sendDtmfState_(false), sendDtmfCallId_(ERR_ID)
35 {}
36
~BluetoothCallService()37 BluetoothCallService::~BluetoothCallService()
38 {}
39
AnswerCall()40 int32_t BluetoothCallService::AnswerCall()
41 {
42 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
43 TELEPHONY_LOGE("Permission denied!");
44 return TELEPHONY_ERR_PERMISSION_ERR;
45 }
46 int32_t callId = ERR_ID;
47 int32_t ret = AnswerCallPolicy(callId);
48 if (ret != TELEPHONY_SUCCESS) {
49 TELEPHONY_LOGE("AnswerCallPolicy failed!");
50 if (IsVoipCallExist()) {
51 sendEventToVoip(CallAbilityEventId::EVENT_ANSWER_VOIP_CALL);
52 }
53 return ret;
54 }
55 sptr<CallBase> call = GetOneCallObject(callId);
56 if (call == nullptr) {
57 TELEPHONY_LOGE("the call object is nullptr, callId:%{public}d", callId);
58 return TELEPHONY_ERR_LOCAL_PTR_NULL;
59 }
60 VideoStateType videoState = call->GetVideoStateType();
61 if (videoState != VideoStateType::TYPE_VOICE && videoState != VideoStateType::TYPE_VIDEO) {
62 TELEPHONY_LOGE("get original call type!");
63 videoState = static_cast<VideoStateType>(call->GetOriginalCallType());
64 }
65 if (callControlManagerPtr_ != nullptr) {
66 if (DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->
67 GetCurrentIsSuperPrivacyMode()) {
68 DelayedSingleton<AudioControlManager>::GetInstance()->PlayWaitingTone();
69 ffrt::submit_h([]() {
70 DelayedSingleton<AudioControlManager>::GetInstance()->StopWaitingTone();
71 }, {}, {}, ffrt::task_attr().delay(DELAY_STOP_PLAY_TIME));
72 }
73 return callControlManagerPtr_->AnswerCall(callId, static_cast<int32_t>(videoState));
74 } else {
75 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
76 return TELEPHONY_ERR_LOCAL_PTR_NULL;
77 }
78 }
79
RejectCall()80 int32_t BluetoothCallService::RejectCall()
81 {
82 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
83 TELEPHONY_LOGE("Permission denied!");
84 return TELEPHONY_ERR_PERMISSION_ERR;
85 }
86 int32_t callId = ERR_ID;
87 bool rejectWithMessage = false;
88 std::u16string textMessage = Str8ToStr16("");
89 int32_t ret = RejectCallPolicy(callId);
90 if (ret != TELEPHONY_SUCCESS) {
91 TELEPHONY_LOGE("RejectCallPolicy failed!");
92 if (IsVoipCallExist()) {
93 sendEventToVoip(CallAbilityEventId::EVENT_REJECT_VOIP_CALL);
94 }
95 return ret;
96 }
97 if (callControlManagerPtr_ != nullptr) {
98 return callControlManagerPtr_->RejectCall(callId, rejectWithMessage, textMessage);
99 } else {
100 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
101 return TELEPHONY_ERR_LOCAL_PTR_NULL;
102 }
103 }
104
HangUpCall()105 int32_t BluetoothCallService::HangUpCall()
106 {
107 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
108 TELEPHONY_LOGE("Permission denied!");
109 return TELEPHONY_ERR_PERMISSION_ERR;
110 }
111 int32_t callId = ERR_ID;
112 int32_t ret = HangUpPolicy(callId);
113 if (ret != TELEPHONY_SUCCESS) {
114 TELEPHONY_LOGE("HangUpPolicy Voip Call!");
115 if (IsVoipCallExist()) {
116 sendEventToVoip(CallAbilityEventId::EVENT_HANGUP_VOIP_CALL);
117 }
118 DeleteOneVoipCallObject(callId);
119 return ret;
120 }
121 if (callId >= VOIP_CALL_MINIMUM && IsVoipCallExist()) {
122 sendEventToVoip(CallAbilityEventId::EVENT_HANGUP_VOIP_CALL);
123 DeleteOneVoipCallObject(callId);
124 return CALL_ERR_ILLEGAL_CALL_OPERATION;
125 }
126 if (callControlManagerPtr_ != nullptr) {
127 return callControlManagerPtr_->HangUpCall(callId);
128 } else {
129 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
130 return TELEPHONY_ERR_LOCAL_PTR_NULL;
131 }
132 }
133
sendEventToVoip(CallAbilityEventId eventId)134 void BluetoothCallService::sendEventToVoip(CallAbilityEventId eventId)
135 {
136 CallEventInfo eventInfo;
137 (void)memset_s(&eventInfo, sizeof(CallEventInfo), 0, sizeof(CallEventInfo));
138 eventInfo.eventId = eventId;
139 DelayedSingleton<CallControlManager>::GetInstance()->NotifyCallEventUpdated(eventInfo);
140 }
141
GetCallState()142 int32_t BluetoothCallService::GetCallState()
143 {
144 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
145 return TELEPHONY_ERR_PERMISSION_ERR;
146 }
147 TELEPHONY_LOGI("Entry BluetoothCallService GetCallState");
148 int32_t numActive = 0;
149 int32_t numHeld = 0;
150 int32_t callState = static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE);
151 std::string number = "";
152 std::vector<int32_t> carrierCallInfo = getCarrierCallInfoNum(callState, number);
153 if (!carrierCallInfo.empty()) {
154 numActive = carrierCallInfo[0];
155 numHeld = carrierCallInfo[1];
156 }
157 if (IsVoipCallExist() && numActive == 0) {
158 GetVoipCallState(numActive, callState, number);
159 }
160 return DelayedSingleton<BluetoothCallManager>::GetInstance()->
161 SendBtCallState(numActive, numHeld, callState, number);
162 }
163
getCarrierCallInfoNum(int32_t & callState,std::string & number)164 std::vector<int32_t> BluetoothCallService::getCarrierCallInfoNum(int32_t &callState, std::string &number)
165 {
166 int32_t numActive = GetCallNum(TelCallState::CALL_STATUS_ACTIVE, false);
167 int32_t numHeld = GetCallNum(TelCallState::CALL_STATUS_HOLDING, false);
168 int32_t numDial = GetCallNum(TelCallState::CALL_STATUS_DIALING, false);
169 int32_t numAlert = GetCallNum(TelCallState::CALL_STATUS_ALERTING, false);
170 int32_t numIncoming = GetCallNum(TelCallState::CALL_STATUS_INCOMING, false);
171 int32_t numWait = GetCallNum(TelCallState::CALL_STATUS_WAITING, false);
172 int32_t numDisconnected = GetCallNum(TelCallState::CALL_STATUS_DISCONNECTED, false);
173 int32_t numDisconnecting = GetCallNum(TelCallState::CALL_STATUS_DISCONNECTING, false);
174 if (numHeld > 0) {
175 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE);
176 number = GetCallNumber(TelCallState::CALL_STATUS_HOLDING, false);
177 }
178 if (numActive > 0) {
179 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE);
180 number = GetCallNumber(TelCallState::CALL_STATUS_ACTIVE, false);
181 }
182 if (numDial > 0) {
183 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_DIALING);
184 number = GetCallNumber(TelCallState::CALL_STATUS_DIALING, false);
185 }
186 if (numAlert > 0) {
187 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_ALERTING);
188 number = GetCallNumber(TelCallState::CALL_STATUS_ALERTING, false);
189 }
190 if (numIncoming > 0) {
191 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_INCOMING);
192 number = GetCallNumber(TelCallState::CALL_STATUS_INCOMING, false);
193 }
194 if (numWait > 0) {
195 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_INCOMING);
196 number = GetCallNumber(TelCallState::CALL_STATUS_WAITING, false);
197 }
198 if (numDisconnected > 0) {
199 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE);
200 number = GetCallNumber(TelCallState::CALL_STATUS_DISCONNECTED, false);
201 }
202 if (numDisconnecting > 0) {
203 callState = static_cast<int32_t>(TelCallState::CALL_STATUS_DISCONNECTED);
204 number = GetCallNumber(TelCallState::CALL_STATUS_DISCONNECTING, false);
205 }
206 return {numActive, numHeld};
207 }
208
GetVoipCallState(int32_t & numActive,int32_t & callState,std::string & number)209 void BluetoothCallService::GetVoipCallState(int32_t &numActive, int32_t &callState, std::string &number)
210 {
211 TELEPHONY_LOGI("GetVoipCallState start,callState:%{public}d", callState);
212 CallAttributeInfo callAttributeInfo = GetVoipCallInfo();
213 if (callState == (int32_t)TelCallState::CALL_STATUS_IDLE && number == "") {
214 switch (callAttributeInfo.callState) {
215 case TelCallState::CALL_STATUS_IDLE:
216 numActive = 1;
217 break;
218 case TelCallState::CALL_STATUS_WAITING:
219 callState = (int32_t)TelCallState::CALL_STATUS_INCOMING;
220 break;
221 case TelCallState::CALL_STATUS_INCOMING:
222 callState = (int32_t)TelCallState::CALL_STATUS_INCOMING;
223 break;
224 case TelCallState::CALL_STATUS_ALERTING:
225 callState = (int32_t)TelCallState::CALL_STATUS_ALERTING;
226 break;
227 default:
228 TELEPHONY_LOGI("voip call state need not handle");
229 break;
230 }
231 number = callAttributeInfo.accountNumber;
232 }
233
234 if (numActive == 0 && callAttributeInfo.callState == TelCallState::CALL_STATUS_ACTIVE) {
235 numActive = 1;
236 }
237 TELEPHONY_LOGI("GetVoipCallState finish,callState:%{public}d, numActive:%{public}d", callState, numActive);
238 }
239
HoldCall()240 int32_t BluetoothCallService::HoldCall()
241 {
242 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
243 TELEPHONY_LOGE("Permission denied!");
244 return TELEPHONY_ERR_PERMISSION_ERR;
245 }
246 int32_t callId = ERR_ID;
247 int32_t ret = HoldCallPolicy(callId);
248 if (ret != TELEPHONY_SUCCESS) {
249 TELEPHONY_LOGE("HoldCallPolicy failed!");
250 return ret;
251 }
252 if (callControlManagerPtr_ != nullptr) {
253 return callControlManagerPtr_->HoldCall(callId);
254 } else {
255 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
256 return TELEPHONY_ERR_LOCAL_PTR_NULL;
257 }
258 }
259
UnHoldCall()260 int32_t BluetoothCallService::UnHoldCall()
261 {
262 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
263 TELEPHONY_LOGE("Permission denied!");
264 return TELEPHONY_ERR_PERMISSION_ERR;
265 }
266 int32_t callId = ERR_ID;
267 int32_t ret = UnHoldCallPolicy(callId);
268 if (ret != TELEPHONY_SUCCESS) {
269 TELEPHONY_LOGE("UnHoldCallPolicy failed!");
270 return ret;
271 }
272 if (callControlManagerPtr_ != nullptr) {
273 return callControlManagerPtr_->UnHoldCall(callId);
274 } else {
275 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
276 return TELEPHONY_ERR_LOCAL_PTR_NULL;
277 }
278 }
279
SwitchCall()280 int32_t BluetoothCallService::SwitchCall()
281 {
282 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
283 TELEPHONY_LOGE("Permission denied!");
284 return TELEPHONY_ERR_PERMISSION_ERR;
285 }
286 int32_t callId = ERR_ID;
287 int32_t ret = SwitchCallPolicy(callId);
288 if (ret != TELEPHONY_SUCCESS) {
289 TELEPHONY_LOGE("SwitchCallPolicy failed!");
290 return ret;
291 }
292 if (callControlManagerPtr_ != nullptr) {
293 return callControlManagerPtr_->SwitchCall(callId);
294 } else {
295 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
296 return TELEPHONY_ERR_LOCAL_PTR_NULL;
297 }
298 }
299
StartDtmf(char str)300 int32_t BluetoothCallService::StartDtmf(char str)
301 {
302 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
303 TELEPHONY_LOGE("Permission denied!");
304 return TELEPHONY_ERR_PERMISSION_ERR;
305 }
306 int32_t callId = ERR_ID;
307 int32_t ret = StartDtmfPolicy(callId);
308 if (ret != TELEPHONY_SUCCESS) {
309 TELEPHONY_LOGE("StartDtmfPolicy failed!");
310 return ret;
311 }
312 if (callControlManagerPtr_ != nullptr) {
313 {
314 std::lock_guard<std::mutex> guard(lock_);
315 sendDtmfState_ = true;
316 sendDtmfCallId_ = callId;
317 }
318 return callControlManagerPtr_->StartDtmf(callId, str);
319 } else {
320 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
321 return TELEPHONY_ERR_LOCAL_PTR_NULL;
322 }
323 }
324
StopDtmf()325 int32_t BluetoothCallService::StopDtmf()
326 {
327 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
328 TELEPHONY_LOGE("Permission denied!");
329 return TELEPHONY_ERR_PERMISSION_ERR;
330 }
331 int32_t callId = ERR_ID;
332 if (callControlManagerPtr_ != nullptr) {
333 {
334 std::lock_guard<std::mutex> guard(lock_);
335 callId = sendDtmfCallId_;
336 sendDtmfState_ = false;
337 sendDtmfCallId_ = ERR_ID;
338 }
339 return callControlManagerPtr_->StopDtmf(callId);
340 } else {
341 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
342 return TELEPHONY_ERR_LOCAL_PTR_NULL;
343 }
344 }
345
CombineConference()346 int32_t BluetoothCallService::CombineConference()
347 {
348 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
349 TELEPHONY_LOGE("Permission denied!");
350 return TELEPHONY_ERR_PERMISSION_ERR;
351 }
352 int32_t callId = ERR_ID;
353 int32_t ret = CombineConferencePolicy(callId);
354 if (ret != TELEPHONY_SUCCESS) {
355 TELEPHONY_LOGE("CombineConferencePolicy failed!");
356 return ret;
357 }
358 if (callControlManagerPtr_ != nullptr) {
359 return callControlManagerPtr_->CombineConference(callId);
360 } else {
361 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
362 return TELEPHONY_ERR_LOCAL_PTR_NULL;
363 }
364 }
365
SeparateConference()366 int32_t BluetoothCallService::SeparateConference()
367 {
368 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
369 TELEPHONY_LOGE("Permission denied!");
370 return TELEPHONY_ERR_PERMISSION_ERR;
371 }
372 int32_t callId = ERR_ID;
373 if (callControlManagerPtr_ != nullptr) {
374 return callControlManagerPtr_->SeparateConference(callId);
375 } else {
376 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
377 return TELEPHONY_ERR_LOCAL_PTR_NULL;
378 }
379 }
380
KickOutFromConference()381 int32_t BluetoothCallService::KickOutFromConference()
382 {
383 if (!TelephonyPermission::CheckPermission(Permission::ANSWER_CALL)) {
384 TELEPHONY_LOGE("Permission denied!");
385 return TELEPHONY_ERR_PERMISSION_ERR;
386 }
387 int32_t callId = ERR_ID;
388 if (callControlManagerPtr_ != nullptr) {
389 return callControlManagerPtr_->KickOutFromConference(callId);
390 } else {
391 TELEPHONY_LOGE("callControlManagerPtr_ is nullptr!");
392 return TELEPHONY_ERR_LOCAL_PTR_NULL;
393 }
394 }
395
GetCurrentCallList(int32_t slotId)396 std::vector<CallAttributeInfo> BluetoothCallService::GetCurrentCallList(int32_t slotId)
397 {
398 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
399 TELEPHONY_LOGE("BluetoothCallService::GetCurrentCallList, Permission denied!");
400 std::vector<CallAttributeInfo> vec;
401 vec.clear();
402 return vec;
403 }
404 if (slotId < 0) {
405 return GetAllCallInfoList(false);
406 }
407 return GetCallInfoList(slotId, false);
408 }
409
AddAudioDeviceList(const std::string & address,int32_t deviceType,const std::string & name)410 int32_t BluetoothCallService::AddAudioDeviceList(const std::string &address, int32_t deviceType,
411 const std::string &name)
412 {
413 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
414 TELEPHONY_LOGE("AddAudioDeviceList, Permission denied!");
415 return TELEPHONY_ERR_PERMISSION_ERR;
416 }
417 if (deviceType != static_cast<int32_t>(AudioDeviceType::DEVICE_NEARLINK) &&
418 deviceType != static_cast<int32_t>(AudioDeviceType::DEVICE_BLUETOOTH_HEARING_AID)) {
419 TELEPHONY_LOGE("AddAudioDeviceList, invalid device type!");
420 return TELEPHONY_ERR_ARGUMENT_INVALID;
421 }
422 DelayedSingleton<AudioDeviceManager>::GetInstance()->AddAudioDeviceList(address,
423 static_cast<AudioDeviceType>(deviceType), name);
424 return TELEPHONY_SUCCESS;
425 }
426
RemoveAudioDeviceList(const std::string & address,int32_t deviceType)427 int32_t BluetoothCallService::RemoveAudioDeviceList(const std::string &address, int32_t deviceType)
428 {
429 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
430 TELEPHONY_LOGE("RemoveAudioDeviceList, Permission denied!");
431 return TELEPHONY_ERR_PERMISSION_ERR;
432 }
433 if (deviceType != static_cast<int32_t>(AudioDeviceType::DEVICE_NEARLINK) &&
434 deviceType != static_cast<int32_t>(AudioDeviceType::DEVICE_BLUETOOTH_HEARING_AID)) {
435 TELEPHONY_LOGE("RemoveAudioDeviceList, invalid device type!");
436 return TELEPHONY_ERR_ARGUMENT_INVALID;
437 }
438 DelayedSingleton<AudioDeviceManager>::GetInstance()->RemoveAudioDeviceList(address,
439 static_cast<AudioDeviceType>(deviceType));
440 return TELEPHONY_SUCCESS;
441 }
442
ResetNearlinkDeviceList()443 int32_t BluetoothCallService::ResetNearlinkDeviceList()
444 {
445 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
446 TELEPHONY_LOGE("ResetNearlinkDeviceList, Permission denied!");
447 return TELEPHONY_ERR_PERMISSION_ERR;
448 }
449 DelayedSingleton<AudioDeviceManager>::GetInstance()->ResetNearlinkAudioDevicesList();
450 return TELEPHONY_SUCCESS;
451 }
452
ResetBtHearingAidDeviceList()453 int32_t BluetoothCallService::ResetBtHearingAidDeviceList()
454 {
455 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
456 TELEPHONY_LOGE("ResetBtHearingAidDeviceList, Permission denied!");
457 return TELEPHONY_ERR_PERMISSION_ERR;
458 }
459 DelayedSingleton<AudioDeviceManager>::GetInstance()->ResetBtHearingAidDeviceList();
460 return TELEPHONY_SUCCESS;
461 }
462 } // namespace Telephony
463 } // namespace OHOS
464