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