• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "hfp_ag_service.h"
17 
18 #include "adapter_config.h"
19 #include "bluetooth_errorcode.h"
20 #include "class_creator.h"
21 #include "hfp_ag_defines.h"
22 #include "hfp_ag_system_interface.h"
23 #include "log_util.h"
24 #include "profile_service_manager.h"
25 #include "stub/telephone_service.h"
26 
27 namespace OHOS {
28 namespace bluetooth {
HfpAgService()29 HfpAgService::HfpAgService() : utility::Context(PROFILE_NAME_HFP_AG, "1.7.1")
30 {
31     LOG_INFO("[HFP AG]ProfileService:%{public}s Create", Name().c_str());
32 }
33 
~HfpAgService()34 HfpAgService::~HfpAgService()
35 {
36     LOG_INFO("[HFP AG]ProfileService:%{public}s Release", Name().c_str());
37 }
38 
GetContext()39 utility::Context *HfpAgService::GetContext()
40 {
41     return this;
42 }
43 
GetService()44 HfpAgService *HfpAgService::GetService()
45 {
46     auto servManager = IProfileManager::GetInstance();
47     return static_cast<HfpAgService *>(servManager->GetProfileService(PROFILE_NAME_HFP_AG));
48 }
49 
Enable()50 void HfpAgService::Enable()
51 {
52     LOG_INFO("[HFP AG]%{public}s():==========<enter>==========", __FUNCTION__);
53     HfpAgMessage event(HFP_AG_SERVICE_STARTUP_EVT);
54     PostEvent(event);
55 }
56 
Disable()57 void HfpAgService::Disable()
58 {
59     LOG_INFO("[HFP AG]%{public}s():==========<enter>==========", __FUNCTION__);
60     HfpAgMessage event(HFP_AG_SERVICE_SHUTDOWN_EVT);
61     PostEvent(event);
62 }
63 
StartUp()64 void HfpAgService::StartUp()
65 {
66     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
67     if (isStarted_ == true) {
68         GetContext()->OnEnable(PROFILE_NAME_HFP_AG, true);
69         LOG_WARN("[HFP AG]%{public}s():HfpAgService has already been started before.", __FUNCTION__);
70         return;
71     }
72 
73     maxConnectedNum_ = GetMaxConnectionDevicesNum();
74     HfpAgSystemEventProcesser::Start();
75     int ret = HfpAgProfile::RegisterService();
76     GetContext()->OnEnable(PROFILE_NAME_HFP_AG, ret ? false : true);
77     if (ret == 0) {
78         isStarted_ = true;
79         LOG_INFO("[HFP AG]%{public}s():HfpAgService started", __FUNCTION__);
80     }
81 }
82 
ShutDown()83 void HfpAgService::ShutDown()
84 {
85     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
86     if (isStarted_ == false) {
87         GetContext()->OnDisable(PROFILE_NAME_HFP_AG, true);
88         LOG_WARN("[HFP AG]%{public}s():HfpAgService has already been shutdown before.", __FUNCTION__);
89         return;
90     }
91 
92     isShuttingDown_ = true;
93     bool isDisconnected = false;
94     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
95         if ((it->second != nullptr) && (it->second->GetStateInt() > HFP_AG_STATE_DISCONNECTED)) {
96             Disconnect(RawAddress(it->first));
97             isDisconnected = true;
98         }
99     }
100 
101     if (!isDisconnected) {
102         ShutDownDone(true);
103     }
104 }
105 
ShutDownDone(bool isAllDisconnected)106 void HfpAgService::ShutDownDone(bool isAllDisconnected)
107 {
108     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
109     if (!isAllDisconnected) {
110         for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
111             if ((it->second != nullptr) && (it->second->GetStateInt() > HFP_AG_STATE_DISCONNECTED)) {
112                 return;
113             }
114         }
115     }
116 
117     stateMachines_.clear();
118     HfpAgSystemEventProcesser::Stop();
119     HfpAgProfile::SetActiveDevice(NULL_ADDRESS);
120 
121     isVrOpened_ = false;
122     isInbandRinging_ = false;
123     queryClccAddress_ = NULL_ADDRESS;
124     maxConnectedNum_ = MAX_DEFAULT_CONNECTIONS_NUM;
125 
126     if (dialingOutTimeout_ != nullptr) {
127         dialingOutTimeout_->Stop();
128         dialingOutTimeout_ = nullptr;
129     }
130 
131     if (ResponseClccTimeout_ != nullptr) {
132         ResponseClccTimeout_->Stop();
133         ResponseClccTimeout_ = nullptr;
134     }
135     if (voiceRecognitionTimeout_ != nullptr) {
136         voiceRecognitionTimeout_->Stop();
137         voiceRecognitionTimeout_ = nullptr;
138     }
139 
140     int ret = HfpAgProfile::DeregisterService();
141     GetContext()->OnDisable(PROFILE_NAME_HFP_AG, ret ? false : true);
142     if (ret == 0) {
143         isStarted_ = false;
144         LOG_INFO("[HFP AG]%{public}s():HfpAgService shutdown", __FUNCTION__);
145     }
146     isShuttingDown_ = false;
147 }
148 
Connect(const RawAddress & device)149 int HfpAgService::Connect(const RawAddress &device)
150 {
151     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
152     std::lock_guard<std::recursive_mutex> lk(mutex_);
153     std::string address = device.GetAddress();
154     auto it = stateMachines_.find(address);
155     if ((it != stateMachines_.end()) && (it->second != nullptr)) {
156         int state = it->second->GetStateInt();
157         if ((state >= HFP_AG_STATE_CONNECTED) || (state == HFP_AG_STATE_CONNECTING)) {
158             LOG_INFO("[HFP AG]%{public}s():state:%{public}d", __FUNCTION__, state);
159             return Bluetooth::BT_ERR_INTERNAL_ERROR;
160         }
161     }
162 
163     int size = GetConnectedDeviceNum();
164     if (size >= maxConnectedNum_) {
165         LOG_INFO("[HFP AG]%{public}s():Max connection has reached!", __FUNCTION__);
166         return Bluetooth::BT_ERR_INTERNAL_ERROR;
167     }
168 
169     HfpAgMessage event(HFP_AG_CONNECT_EVT);
170     event.dev_ = address;
171     PostEvent(event);
172     return HFP_AG_SUCCESS;
173 }
174 
Disconnect(const RawAddress & device)175 int HfpAgService::Disconnect(const RawAddress &device)
176 {
177     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
178     std::lock_guard<std::recursive_mutex> lk(mutex_);
179     std::string address = device.GetAddress();
180     auto it = stateMachines_.find(address);
181     if (it == stateMachines_.end() || it->second == nullptr) {
182         return Bluetooth::BT_ERR_INTERNAL_ERROR;
183     }
184 
185     int slcState = it->second->GetStateInt();
186     if ((slcState != HFP_AG_STATE_CONNECTING) && (slcState < HFP_AG_STATE_CONNECTED)) {
187         return Bluetooth::BT_ERR_INTERNAL_ERROR;
188     }
189 
190     HfpAgMessage event(HFP_AG_DISCONNECT_EVT);
191     event.dev_ = address;
192     PostEvent(event);
193     return HFP_AG_SUCCESS;
194 }
195 
GetConnectDevices()196 std::list<RawAddress> HfpAgService::GetConnectDevices()
197 {
198     std::lock_guard<std::recursive_mutex> lk(mutex_);
199     std::list<RawAddress> devList;
200     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
201         if ((it->second != nullptr) && (it->second->GetStateInt() >= HFP_AG_STATE_CONNECTED)) {
202             devList.push_back(RawAddress(it->first));
203         }
204     }
205     return devList;
206 }
207 
GetConnectState()208 int HfpAgService::GetConnectState()
209 {
210     std::lock_guard<std::recursive_mutex> lk(mutex_);
211     int result = 0;
212     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
213         if (it->second == nullptr) {
214             result |= PROFILE_STATE_DISCONNECTED;
215         } else if (it->second->GetStateInt() >= HFP_AG_STATE_CONNECTED) {
216             result |= PROFILE_STATE_CONNECTED;
217         } else if (it->second->GetStateInt() == HFP_AG_STATE_CONNECTING) {
218             result |= PROFILE_STATE_CONNECTING;
219         } else if (it->second->GetStateInt() == HFP_AG_STATE_DISCONNECTING) {
220             result |= PROFILE_STATE_DISCONNECTING;
221         } else if (it->second->GetStateInt() == HFP_AG_STATE_DISCONNECTED) {
222             result |= PROFILE_STATE_DISCONNECTED;
223         }
224     }
225     return result;
226 }
227 
GetDeviceState(const RawAddress & device)228 int HfpAgService::GetDeviceState(const RawAddress &device)
229 {
230     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
231     std::lock_guard<std::recursive_mutex> lk(mutex_);
232     std::string address = device.GetAddress();
233     auto it = stateMachines_.find(address);
234     if (it == stateMachines_.end() || it->second == nullptr) {
235         LOG_INFO("[HFP AG]%{public}s():the statemachine is not available", __FUNCTION__);
236         return stateMap_.at(HFP_AG_STATE_DISCONNECTED);
237     }
238 
239     if (it->second->GetStateInt() >= HFP_AG_STATE_CONNECTED) {
240         return stateMap_.at(HFP_AG_STATE_CONNECTED);
241     } else {
242         return stateMap_.at(it->second->GetStateInt());
243     }
244 }
245 
GetMaxConnectNum()246 int HfpAgService::GetMaxConnectNum()
247 {
248     std::lock_guard<std::recursive_mutex> lk(mutex_);
249     return maxConnectedNum_;
250 }
251 
PostEvent(const HfpAgMessage & event)252 void HfpAgService::PostEvent(const HfpAgMessage &event)
253 {
254     GetDispatcher()->PostTask(std::bind(&HfpAgService::ProcessEvent, this, event));
255 }
256 
ProcessEvent(const HfpAgMessage & event)257 void HfpAgService::ProcessEvent(const HfpAgMessage &event)
258 {
259     std::lock_guard<std::recursive_mutex> lk(mutex_);
260     HILOGI("addr: %{public}s, event_no: %{public}d", GetEncryptAddr(event.dev_).c_str(), event.what_);
261     switch (event.what_) {
262         case HFP_AG_SERVICE_STARTUP_EVT:
263             StartUp();
264             break;
265         case HFP_AG_SERVICE_SHUTDOWN_EVT:
266             ShutDown();
267             break;
268         case HFP_AG_CONNECT_EVT:
269         case HFP_AG_CONNECT_REQUEST_EVT:
270             ProcessConnectEvent(event);
271             break;
272         case HFP_AG_REMOVE_STATE_MACHINE_EVT:
273             ProcessRemoveStateMachine(event.dev_);
274             break;
275         case HFP_AG_VOICE_RECOGNITION_TIME_OUT_EVT:
276             ProcessVoiceRecognitionTimeOut(event);
277             break;
278         case HFP_AG_RESPONSE_CLCC_TIME_OUT_EVT:
279             ProcessResponseClccTimeOut(event);
280             break;
281         case HFP_AG_DIAL_TIME_OUT_EVT:
282             ProcessDialOutTimeOut();
283             break;
284         case HFP_AG_SET_VOLUME_EVT:
285         case HFP_AG_NOTIFY_SERVICE_STATE:
286         case HFP_AG_NOTIFY_ROAM_STATE:
287         case HFP_AG_NOTIFY_SIGNAL_STRENGTH:
288         case HFP_AG_NOTIFY_BATTERY_LEVEL:
289         case HFP_AG_CALL_STATE_CHANGE:
290         case HFP_AG_CALL_STATE_CHANGE_MOCK:
291         case HFP_AG_SEND_CCLC_RESPONSE:
292         case HFP_AG_DIALING_OUT_RESULT:
293         case HFP_AG_SET_INBAND_RING_TONE_EVT:
294         case HFP_AG_SEND_INCOMING_EVT:
295         case HFP_AG_SEND_CALL_SETUP_EVT:
296         case HFP_AG_SEND_BINP_EVT:
297         case HFP_AG_GET_BTRH_EVT:
298         case HFP_AG_SET_BTRH_EVT:
299         case HFP_AG_SEND_RESPONSE_HOLD_STATE:
300         case HFP_AG_SEND_BTRH_EVT:
301         case HFP_AG_SEND_NO_CARRIER:
302         case HFP_AG_START_MOCK:
303         case HFP_AG_SEND_CALL_HELD_EVT:
304             SendEventToEachStateMachine(event);
305             break;
306         default:
307             ProcessDefaultEvent(event);
308             break;
309     }
310 }
311 
GetDevicesByStates(std::vector<int> states)312 std::vector<RawAddress> HfpAgService::GetDevicesByStates(std::vector<int> states)
313 {
314     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
315     std::lock_guard<std::recursive_mutex> lk(mutex_);
316     std::vector<RawAddress> devices;
317     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
318         RawAddress device(it->first);
319         for (size_t i = 0; i < states.size(); i++) {
320             if (GetDeviceState(device) == states[i]) {
321                 devices.push_back(device);
322                 break;
323             }
324         }
325     }
326     return devices;
327 }
328 
ConnectSco()329 bool HfpAgService::ConnectSco()
330 {
331     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
332     std::lock_guard<std::recursive_mutex> lk(mutex_);
333     std::string activeDevice = HfpAgProfile::GetActiveDevice();
334     if (activeDevice == NULL_ADDRESS) {
335         LOG_DEBUG("[HFP AG]%{public}s():The active device is null!", __FUNCTION__);
336         return false;
337     }
338 
339     if (IsConnected(activeDevice) == false) {
340         return false;
341     }
342 
343     if (IsAudioConnected()) {
344         LOG_INFO("[HFP AG]%{public}s():Sco is not idle!", __FUNCTION__);
345         return false;
346     }
347 
348     HfpAgMessage event(HFP_AG_CONNECT_AUDIO_EVT);
349     event.dev_ = activeDevice;
350     PostEvent(event);
351     return true;
352 }
353 
DisconnectSco()354 bool HfpAgService::DisconnectSco()
355 {
356     std::lock_guard<std::recursive_mutex> lk(mutex_);
357     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
358     bool ret = false;
359     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
360         if ((it->second != nullptr) && (it->second->GetStateInt() > HFP_AG_AUDIO_STATE_DISCONNECTED) &&
361             (DisconnectSingleSco(it->first))) {
362             ret = true;
363         }
364     }
365 
366     if (!ret) {
367         LOG_DEBUG("[HFP AG]%{public}s(): No audio connection exist!!!", __FUNCTION__);
368     }
369     return ret;
370 }
371 
DisconnectSingleSco(const std::string & address)372 bool HfpAgService::DisconnectSingleSco(const std::string &address)
373 {
374     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
375     auto it = stateMachines_.find(address);
376     if (it == stateMachines_.end() || it->second == nullptr) {
377         HILOGE("[HFP AG] Invalid Device address:%{public}s", GetEncryptAddr(address).c_str());
378         return false;
379     }
380 
381     if (it->second->GetStateInt() == HFP_AG_AUDIO_STATE_DISCONNECTED) {
382         HILOGE("[HFP AG] Sco is already disconnected on specific device! address:%{public}s, state[%{public}d]",
383             GetEncryptAddr(address).c_str(), it->second->GetStateInt());
384         return false;
385     }
386 
387     HfpAgMessage event(HFP_AG_DISCONNECT_AUDIO_EVT);
388     event.dev_ = address;
389     PostEvent(event);
390     return true;
391 }
392 
GetScoState(const RawAddress & device)393 int HfpAgService::GetScoState(const RawAddress &device)
394 {
395     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
396     std::lock_guard<std::recursive_mutex> lk(mutex_);
397     std::string address = device.GetAddress();
398     auto it = stateMachines_.find(address);
399     if (it == stateMachines_.end() || it->second == nullptr) {
400         LOG_INFO("[HFP AG]%{public}s():the statemachine is not available.", __FUNCTION__);
401         return HFP_AG_AUDIO_STATE_DISCONNECTED;
402     }
403 
404     if (it->second->GetStateInt() <= HFP_AG_AUDIO_STATE_DISCONNECTED) {
405         return HFP_AG_AUDIO_STATE_DISCONNECTED;
406     } else {
407         return it->second->GetStateInt();
408     }
409 }
410 
IsAudioConnected() const411 bool HfpAgService::IsAudioConnected() const
412 {
413     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
414     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
415         if (it->second != nullptr) {
416             auto audioState = it->second->GetStateInt();
417             if (audioState > HFP_AG_AUDIO_STATE_DISCONNECTED) {
418                 return true;
419             }
420         }
421     }
422     return false;
423 }
424 
IsAudioIdle() const425 bool HfpAgService::IsAudioIdle() const
426 {
427     if (isVrOpened_) {
428         return false;
429     }
430 
431     const HfpAgSystemInterface &systemInterface = HfpAgSystemInterface::GetInstance();
432     if (systemInterface.IsInCall()) {
433         return false;
434     }
435 
436     if (systemInterface.IsRinging()) {
437         return false;
438     }
439 
440     return true;
441 }
442 
SendEventToEachStateMachine(const HfpAgMessage & event) const443 void HfpAgService::SendEventToEachStateMachine(const HfpAgMessage &event) const
444 {
445     HfpAgMessage curEvent = event;
446     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
447         if (it->second != nullptr) {
448             curEvent.dev_ = it->first;
449             it->second->ProcessMessage(curEvent);
450         }
451     }
452 }
453 
UpdateAgIndicators() const454 void HfpAgService::UpdateAgIndicators() const
455 {
456     HfpAgMessage evt(HFP_AG_NOTIFY_INDICATOR_EVT);
457     evt.type_ = HFP_AG_NOTIFY_INDICATOR_EVT;
458     for (auto it = stateMachines_.begin(); it != stateMachines_.end(); ++it) {
459         if (it->second != nullptr) {
460             evt.dev_ = it->first;
461             it->second->ProcessMessage(evt);
462         }
463     }
464 }
465 
UpdateMockCallList(int callState,const std::string & number,int type)466 void HfpAgService::UpdateMockCallList(int callState, const std::string &number, int type)
467 {
468     HfpAgMessage curEvent(HFP_AG_CALL_STATE_CHANGE_MOCK);
469     curEvent.state_.callState = callState;
470     curEvent.state_.number = number;
471     curEvent.state_.type = type;
472     PostEvent(curEvent);
473     MockCall call;
474     call.callstate = callState;
475     call.number = number;
476     call.type = CALL_TYPE_DEFAULT;
477     int sameindex = -1;
478     LOG_INFO("HFP AG MOCK moko changed number = %{public}s, state = %{public}d", number.c_str(), callState);
479 
480     std::lock_guard<std::recursive_mutex> lk(mutex_);
481     for (int i = 0; i < callList_.size(); i++) {
482         if (strcmp(callList_[i].number.c_str(), number.c_str()) == 0) {
483             sameindex = i;
484         }
485     }
486     if (sameindex != -1) {
487         callList_.erase(callList_.begin() + sameindex);
488     }
489     callList_.push_back(call);
490 }
491 
PhoneStateChanged(int numActive,int numHeld,int callState,const std::string & number,int type,const std::string & name)492 void HfpAgService::PhoneStateChanged(
493     int numActive, int numHeld, int callState, const std::string &number, int type, const std::string &name)
494 {
495     LOG_INFO("[HFP AG]%{public}s(): ==========<start>==========", __FUNCTION__);
496     if (mockState_ == HFP_AG_MOCK) {
497         UpdateMockCallList(callState, number, type);
498         return;
499     }
500     std::lock_guard<std::recursive_mutex> lk(mutex_);
501     if (dialingOutTimeout_ != nullptr) {
502         if ((callState == HFP_AG_CALL_STATE_ACTIVE) || (callState == HFP_AG_CALL_STATE_IDLE)) {
503             dialingOutTimeout_->Stop();
504             dialingOutTimeout_ = nullptr;
505         } else if (callState == HFP_AG_CALL_STATE_DIALING) {
506             dialingOutTimeout_->Stop();
507             dialingOutTimeout_ = nullptr;
508             HfpAgMessage event(HFP_AG_DIALING_OUT_RESULT, HFP_AG_RESULT_OK);
509             PostEvent(event);
510         }
511     }
512 
513     if ((numActive > 0) || (numHeld > 0) || (callState != HFP_AG_CALL_STATE_IDLE)) {
514         if (isVrOpened_) {
515             LOG_INFO("[HFP AG]%{public}s():close the voice recognition", __FUNCTION__);
516             CloseVoiceRecognition(RawAddress(HfpAgProfile::GetActiveDevice()));
517         }
518     }
519 
520     HfpAgSystemInterface::GetInstance().SetActiveCallNumber(numActive);
521     HfpAgSystemInterface::GetInstance().SetHeldCallNumber(numHeld);
522     HfpAgSystemInterface::GetInstance().SetCallState(callState);
523 
524     HfpAgMessage curEvent(HFP_AG_CALL_STATE_CHANGE);
525     curEvent.state_.activeNum = numActive;
526     curEvent.state_.heldNum = numHeld;
527     curEvent.state_.callState = callState;
528     curEvent.state_.number = number;
529     curEvent.state_.type = type;
530     curEvent.state_.name = name;
531     PostEvent(curEvent);
532     UpdateAgIndicators();
533 }
534 
ClccResponse(int index,int direction,int status,int mode,bool mpty,const std::string & number,int type)535 void HfpAgService::ClccResponse(
536     int index, int direction, int status, int mode, bool mpty, const std::string &number, int type)
537 {
538     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
539     std::lock_guard<std::recursive_mutex> lk(mutex_);
540     if (ResponseClccTimeout_ != nullptr) {
541         ResponseClccTimeout_->Stop();
542         queryClccAddress_ = NULL_ADDRESS;
543         ResponseClccTimeout_ = nullptr;
544     }
545 
546     HfpAgMessage curEvent(HFP_AG_SEND_CCLC_RESPONSE);
547     curEvent.call_.index = index;
548     curEvent.call_.dir = direction;
549     curEvent.call_.state = status;
550     curEvent.call_.mode = mode;
551     curEvent.call_.mpty = mpty;
552     curEvent.call_.type = type;
553     curEvent.call_.number = number;
554     PostEvent(curEvent);
555 }
556 
SendOpenVoiceEvent(const std::string & address,bool isRequestByHf)557 void HfpAgService::SendOpenVoiceEvent(const std::string &address, bool isRequestByHf)
558 {
559     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
560     if (isRequestByHf) {
561         HfpAgMessage evt(HFP_AG_VOICE_RECOGNITION_RESULT_EVT, 1);
562         evt.dev_ = address;
563         PostEvent(evt);
564     } else {
565         HfpAgMessage evt(HFP_AG_OPEN_VOICE_RECOGNITION_EVT);
566         evt.dev_ = address;
567         PostEvent(evt);
568     }
569     isVrOpened_ = true;
570 }
571 
OpenVoiceRecognition(const RawAddress & device)572 bool HfpAgService::OpenVoiceRecognition(const RawAddress &device)
573 {
574     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
575     std::lock_guard<std::recursive_mutex> lk(mutex_);
576     std::string address = device.GetAddress();
577     if (IsVoiceRecognitionAvailable(address) == false) {
578         return false;
579     }
580 
581     if (voiceRecognitionTimeout_ != nullptr) {
582         // VR is opening by handsfree unit, send result to handsfree unit
583         voiceRecognitionTimeout_->Stop();
584         voiceRecognitionTimeout_ = nullptr;
585         SendOpenVoiceEvent(address, true);
586     } else {
587         // VR is opening by audio gateway, notify handsfree unit
588         SendOpenVoiceEvent(address, false);
589     }
590 
591     return true;
592 }
593 
CloseVoiceRecognition(const RawAddress & device)594 bool HfpAgService::CloseVoiceRecognition(const RawAddress &device)
595 {
596     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
597     std::lock_guard<std::recursive_mutex> lk(mutex_);
598     if (!isVrOpened_) {
599         LOG_INFO("[HFP AG]%{public}s():The VR is not opened!", __FUNCTION__);
600         return false;
601     }
602 
603     std::string address = device.GetAddress();
604     if (IsConnected(address) == false) {
605         return false;
606     }
607 
608     if (IsActiveDevice(address) == false) {
609         return false;
610     }
611 
612     SendCloseVoiceEvent(address);
613     return true;
614 }
615 
SendCloseVoiceEvent(const std::string & address)616 void HfpAgService::SendCloseVoiceEvent(const std::string &address)
617 {
618     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
619     HfpAgMessage evt1(HFP_AG_CLOSE_VOICE_RECOGNITION_EVT);
620     evt1.dev_ = address;
621     PostEvent(evt1);
622 
623     HfpAgMessage evt2(HFP_AG_DISCONNECT_AUDIO_EVT);
624     evt2.dev_ = address;
625     PostEvent(evt2);
626 
627     isVrOpened_ = false;
628 }
629 
SendMockCmd(const HfpAgMessage & event)630 void HfpAgService::SendMockCmd(const HfpAgMessage &event)
631 {
632     SendEventToEachStateMachine(event);
633 }
634 
SetActiveDevice(const RawAddress & device)635 bool HfpAgService::SetActiveDevice(const RawAddress &device)
636 {
637     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
638     std::lock_guard<std::recursive_mutex> lk(mutex_);
639     std::string address = device.GetAddress();
640     if (address == NULL_ADDRESS) {
641         ClearActiveDevice();
642         return true;
643     }
644 
645     if (IsConnected(address) == false) {
646         return false;
647     }
648 
649     if (IsActiveDevice(address) == false) {
650         ModifyActiveDevice(address);
651     }
652 
653     return true;
654 }
655 
IntoMock(int state)656 bool HfpAgService::IntoMock(int state)
657 {
658     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
659     mockState_ = state;
660     HfpAgMessage evt(HFP_AG_START_MOCK);
661     evt.arg1_ = state;
662     PostEvent(evt);
663     if (state == HFP_AG_MOCK_DEFAULT) {
664         callList_.clear();
665     }
666     return true;
667 }
668 
SendNoCarrier(const RawAddress & device)669 bool HfpAgService::SendNoCarrier(const RawAddress &device)
670 {
671     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
672     std::lock_guard<std::recursive_mutex> lk(mutex_);
673     std::string address = device.GetAddress();
674     HfpAgMessage evt(HFP_AG_SEND_NO_CARRIER);
675     evt.dev_ = address;
676     PostEvent(evt);
677     return true;
678 }
679 
GetMockState()680 int HfpAgService::GetMockState()
681 {
682     return mockState_;
683 }
684 
GetCallList()685 std::vector<MockCall> HfpAgService::GetCallList()
686 {
687     return callList_;
688 }
689 
ClearActiveDevice()690 void HfpAgService::ClearActiveDevice()
691 {
692     std::string preActiveDevice = HfpAgProfile::GetActiveDevice();
693     if (isVrOpened_) {
694         HfpAgMessage evt(HFP_AG_CLOSE_VOICE_RECOGNITION_EVT);
695         evt.dev_ = preActiveDevice;
696         PostEvent(evt);
697     }
698     DisconnectSingleSco(preActiveDevice);
699     HfpAgProfile::SetActiveDevice(NULL_ADDRESS);
700     NotifyCurrentActiveDevice(RawAddress(NULL_ADDRESS));
701 }
702 
IsInbandRinging()703 bool HfpAgService::IsInbandRinging()
704 {
705     std::lock_guard<std::recursive_mutex> lk(mutex_);
706     return isInbandRinging_;
707 }
708 
IsIncall()709 bool HfpAgService::IsIncall()
710 {
711     const HfpAgSystemInterface &systemInterface = HfpAgSystemInterface::GetInstance();
712     return (systemInterface.IsInCall() || (systemInterface.IsRinging() && IsInbandRinging()));
713 }
714 
GetActiveDevice()715 std::string HfpAgService::GetActiveDevice()
716 {
717     LOG_INFO("[HFP AG]%{public}s():==========<start>==========", __FUNCTION__);
718     std::lock_guard<std::recursive_mutex> lk(mutex_);
719     return HfpAgProfile::GetActiveDevice();
720 }
721 
NotifyAgIndicatorStateChanged(int what,int state)722 void HfpAgService::NotifyAgIndicatorStateChanged(int what, int state)
723 {
724     HfpAgMessage curEvent(what, state);
725     PostEvent(curEvent);
726 }
727 
NotifyAgIncomingStateChanged(int what,std::string number,int type)728 void HfpAgService::NotifyAgIncomingStateChanged(int what, std::string number, int type)
729 {
730     LOG_INFO("[HFP AG]%{public}s():enter",  __FUNCTION__);
731     HfpAgMessage curEvent(what, type);
732     curEvent.str_ = number;
733     PostEvent(curEvent);
734 }
735 
NotifyAgResponseHoldStateChanged(int what,int state)736 void HfpAgService::NotifyAgResponseHoldStateChanged(int what, int state)
737 {
738     LOG_INFO("[HFP AG]%{public}s():enter",  __FUNCTION__);
739     HfpAgMessage curEvent(what, state);
740     PostEvent(curEvent);
741 }
742 
SendBinpNumber(std::string number)743 void HfpAgService::SendBinpNumber(std::string number)
744 {
745     HfpAgMessage curEvent(HFP_AG_SEND_BINP_EVT);
746     curEvent.str_ = number;
747     PostEvent(curEvent);
748 }
749 
RegisterObserver(HfpAgServiceObserver & observer)750 void HfpAgService::RegisterObserver(HfpAgServiceObserver &observer)
751 {
752     std::lock_guard<std::recursive_mutex> lk(mutex_);
753     std::list<HfpAgServiceObserver *>::iterator iter;
754     for (iter = observers_.begin(); iter != observers_.end(); ++iter) {
755         if (*iter == &observer) {
756             LOG_INFO("Already registered!");
757             return;
758         }
759     }
760     observers_.push_back(&observer);
761 }
762 
DeregisterObserver(HfpAgServiceObserver & observer)763 void HfpAgService::DeregisterObserver(HfpAgServiceObserver &observer)
764 {
765     std::lock_guard<std::recursive_mutex> lk(mutex_);
766     std::list<HfpAgServiceObserver *>::iterator iter;
767     for (iter = observers_.begin(); iter != observers_.end(); ++iter) {
768         if (*iter == &observer) {
769             break;
770         }
771     }
772 
773     if (iter != observers_.end()) {
774         observers_.erase(iter);
775     }
776     return;
777 }
778 
NotifySlcStateChanged(const RawAddress & device,int toState)779 void HfpAgService::NotifySlcStateChanged(const RawAddress &device, int toState)
780 {
781     HILOGI("[HFP AG] device:%{public}s, toState:%{public}d", GET_ENCRYPT_ADDR(device), toState);
782     std::list<HfpAgServiceObserver *>::iterator iter;
783     for (iter = observers_.begin(); iter != observers_.end(); ++iter) {
784         (*iter)->OnConnectionStateChanged(device, stateMap_.at(toState));
785     }
786 }
787 
NotifyAudioStateChanged(const RawAddress & device,int toState)788 void HfpAgService::NotifyAudioStateChanged(const RawAddress &device, int toState)
789 {
790     HILOGI("[HFP AG] device:%{public}s, toState:%{public}d", GET_ENCRYPT_ADDR(device), toState);
791     std::list<HfpAgServiceObserver *>::iterator iter;
792     for (iter = observers_.begin(); iter != observers_.end(); ++iter) {
793         (*iter)->OnScoStateChanged(device, toState);
794     }
795 }
796 
NotifyCurrentActiveDevice(const RawAddress & device)797 void HfpAgService::NotifyCurrentActiveDevice(const RawAddress &device)
798 {
799     LOG_INFO("[HFP AG]%{public}s():", __FUNCTION__);
800     std::list<HfpAgServiceObserver *>::iterator iter;
801     for (iter = observers_.begin(); iter != observers_.end(); ++iter) {
802         (*iter)->OnActiveDeviceChanged(device);
803     }
804 }
805 
NotifyHfEnhancedDriverSafety(const RawAddress & device,int indValue)806 void HfpAgService::NotifyHfEnhancedDriverSafety(const RawAddress &device, int indValue)
807 {
808     LOG_INFO("[HFP AG]%{public}s():", __FUNCTION__);
809     std::list<HfpAgServiceObserver *>::iterator iter;
810     for (iter = observers_.begin(); iter != observers_.end(); ++iter) {
811         (*iter)->OnHfEnhancedDriverSafetyChanged(device, indValue);
812     }
813 }
814 
NotifyHfBatteryLevel(const RawAddress & device,int indValue)815 void HfpAgService::NotifyHfBatteryLevel(const RawAddress &device, int indValue)
816 {
817     LOG_INFO("[HFP AG]%{public}s():", __FUNCTION__);
818     std::list<HfpAgServiceObserver *>::iterator iter;
819     for (iter = observers_.begin(); iter != observers_.end(); ++iter) {
820         (*iter)->OnHfBatteryLevelChanged(device, indValue);
821     }
822 }
823 
DialOutCallByHf(const std::string & address)824 bool HfpAgService::DialOutCallByHf(const std::string &address)
825 {
826     if (mockState_ == HFP_AG_MOCK) {
827         return true;
828     }
829     if (dialingOutTimeout_ != nullptr) {
830         LOG_ERROR("[HFP AG]%{public}s():already dialing out!", __FUNCTION__);
831         return false;
832     }
833 
834     if (!SetActiveDevice(RawAddress(address))) {
835         HILOGE("[HFP AG] It's failed to set active device to %{public}s", GetEncryptAddr(address).c_str());
836         return false;
837     }
838 
839     dialingOutTimeout_ =
840         std::make_unique<utility::Timer>(std::bind(&bluetooth::HfpAgService::DialOutCallTimeOut, this));
841     dialingOutTimeout_->Start(DIALING_OUT_TIMEOUT_TIME);
842     LOG_INFO("[HFP AG]%{public}s():start dial timer!", __FUNCTION__);
843     return true;
844 }
845 
DialOutCallTimeOut()846 void HfpAgService::DialOutCallTimeOut()
847 {
848     HfpAgMessage event(HFP_AG_DIAL_TIME_OUT_EVT);
849     PostEvent(event);
850 }
851 
OpenVoiceRecognitionByHf(const std::string & address)852 bool HfpAgService::OpenVoiceRecognitionByHf(const std::string &address)
853 {
854     // VR opening
855     if (voiceRecognitionTimeout_ != nullptr) {
856         LOG_ERROR("[HFP AG]%{public}s():voice recognition is opening", __FUNCTION__);
857         return false;
858     }
859 
860     // VR opened or in call
861     if (!IsAudioIdle()) {
862         LOG_INFO("[HFP AG]%{public}s():sco is not idle!", __FUNCTION__);
863         return false;
864     }
865 
866     if (!SetActiveDevice(RawAddress(address))) {
867         LOG_ERROR("[HFP AG]%{public}s():It's failed to set active device!", __FUNCTION__);
868         return false;
869     }
870 
871     voiceRecognitionTimeout_ =
872         std::make_unique<utility::Timer>(std::bind(&bluetooth::HfpAgService::VoiceRecognitionTimeOut, this));
873     voiceRecognitionTimeout_->Start(VOICE_RECOGNITION_TIMEOUT_TIME);
874     LOG_INFO("[HFP AG]%{public}s():start open voice recognition timer!", __FUNCTION__);
875     return true;
876 }
877 
CloseVoiceRecognitionByHf(const std::string & address)878 bool HfpAgService::CloseVoiceRecognitionByHf(const std::string &address)
879 {
880     if (IsActiveDevice(address) == false) {
881         return false;
882     }
883 
884     // VR not opening or opened
885     if (!isVrOpened_ && (voiceRecognitionTimeout_ == nullptr)) {
886         LOG_ERROR("[HFP AG]%{public}s():voice recognition is not opening or opened!", __FUNCTION__);
887         return false;
888     }
889 
890     // VR opening
891     if (voiceRecognitionTimeout_ != nullptr) {
892         voiceRecognitionTimeout_->Stop();
893         voiceRecognitionTimeout_ = nullptr;
894     }
895 
896     // VR opened
897     if (isVrOpened_) {
898         DisconnectSingleSco(address);
899         isVrOpened_ = false;
900     }
901 
902     const HfpAgSystemInterface &systemInterface = HfpAgSystemInterface::GetInstance();
903     systemInterface.StopVoiceRecogition(address);
904     return true;
905 }
906 
VoiceRecognitionTimeOut()907 void HfpAgService::VoiceRecognitionTimeOut()
908 {
909     HfpAgMessage event(HFP_AG_VOICE_RECOGNITION_TIME_OUT_EVT);
910     PostEvent(event);
911 }
912 
SetResponseClccTimer(const std::string & address)913 void HfpAgService::SetResponseClccTimer(const std::string &address)
914 {
915     if (ResponseClccTimeout_ != nullptr) {
916         ResponseClccTimeout_->Stop();
917         queryClccAddress_ = NULL_ADDRESS;
918         ResponseClccTimeout_ = nullptr;
919     }
920 
921     ResponseClccTimeout_ =
922         std::make_unique<utility::Timer>(std::bind(&bluetooth::HfpAgService::ResponseClccTimeOut, this));
923     ResponseClccTimeout_->Start(RESPONSE_CLCC_TIMEOUT_TIME);
924     queryClccAddress_ = address;
925     LOG_INFO("[HFP AG]%{public}s():start clcc timer!", __FUNCTION__);
926 }
927 
ResponseClccTimeOut()928 void HfpAgService::ResponseClccTimeOut()
929 {
930     HfpAgMessage event(HFP_AG_RESPONSE_CLCC_TIME_OUT_EVT);
931     PostEvent(event);
932 }
933 
SlcStateChanged(const std::string & address,int toState)934 void HfpAgService::SlcStateChanged(const std::string &address, int toState)
935 {
936     if (toState == HFP_AG_STATE_DISCONNECTED) {
937         if (HfpAgProfile::GetActiveDevice() == address) {
938             SetActiveDevice(RawAddress(NULL_ADDRESS));
939         }
940     }
941 }
942 
ScoStateChanged(const std::string & address,int fromState,int toState)943 void HfpAgService::ScoStateChanged(const std::string &address, int fromState, int toState)
944 {
945     if (toState == HFP_AG_AUDIO_STATE_DISCONNECTED) {
946         if (voiceRecognitionTimeout_) {
947             if (!CloseVoiceRecognitionByHf(address)) {
948                 LOG_ERROR("[HFP AG]%{public}s():Failed to close the voice recognition!", __FUNCTION__);
949             }
950         }
951     }
952 }
953 
GetConnectedDeviceNum() const954 int HfpAgService::GetConnectedDeviceNum() const
955 {
956     int size = 0;
957     for (auto iter = stateMachines_.begin(); iter != stateMachines_.end(); ++iter) {
958         if (iter->second != nullptr) {
959             auto connectionState = iter->second->GetStateInt();
960             if ((connectionState == HFP_AG_STATE_CONNECTING) || (connectionState >= HFP_AG_STATE_CONNECTED)) {
961                 size++;
962             }
963         }
964     }
965     return size;
966 }
967 
GetMaxConnectionDevicesNum() const968 int HfpAgService::GetMaxConnectionDevicesNum() const
969 {
970     int number = MAX_DEFAULT_CONNECTIONS_NUM;
971     if (!AdapterConfig::GetInstance()->GetValue(SECTION_HFP_AG_SERVICE, PROPERTY_MAX_CONNECTED_DEVICES, number)) {
972         LOG_INFO("[HFP HF]%{public}s():It's failed to get the max connection number", __FUNCTION__);
973     }
974     return number;
975 }
976 
NotifyRegistrationStatusChanged(int status)977 void HfpAgService::NotifyRegistrationStatusChanged(int status)
978 {
979     HfpAgSystemInterface::GetInstance().OnSubscriptionStateChanged(status);
980 }
981 
NotifySignalStrengthChanged(int signalStrength)982 void HfpAgService::NotifySignalStrengthChanged(int signalStrength)
983 {
984     HfpAgSystemInterface::GetInstance().OnSignalStrengthChanged(signalStrength);
985 }
986 
NotifyRoamingStatusChanged(int status)987 void HfpAgService::NotifyRoamingStatusChanged(int status)
988 {
989     HfpAgSystemInterface::GetInstance().OnRoamStateChanged(status);
990 }
991 
NotifyBatteryLevelChanged(int batteryLevel)992 void HfpAgService::NotifyBatteryLevelChanged(int batteryLevel)
993 {
994     HfpAgSystemInterface::GetInstance().OnBatteryLevel(batteryLevel);
995 }
996 
NotifyVolumeChanged(int type,int volume)997 void HfpAgService::NotifyVolumeChanged(int type, int volume)
998 {
999     HfpAgMessage event(HFP_AG_SET_VOLUME_EVT, type);
1000     event.arg3_ = volume;
1001     PostEvent(event);
1002 }
1003 
ProcessConnectEvent(const HfpAgMessage & event)1004 void HfpAgService::ProcessConnectEvent(const HfpAgMessage &event)
1005 {
1006     if (GetConnectedDeviceNum() < maxConnectedNum_) {
1007         auto it = stateMachines_.find(event.dev_);
1008         if (it != stateMachines_.end() && it->second != nullptr && it->second->IsRemoving()) {
1009             // peer device may send connect request before we remove statemachine for last connection.
1010             // so post this connect request, process it after we remove statemachine completely.
1011             PostEvent(event);
1012         } else if (it == stateMachines_.end() || it->second == nullptr) {
1013             stateMachines_[event.dev_] = std::make_unique<HfpAgStateMachine>(event.dev_);
1014             stateMachines_[event.dev_]->Init();
1015             stateMachines_[event.dev_]->ProcessMessage(event);
1016         } else {
1017             it->second->ProcessMessage(event);
1018         }
1019     }
1020 }
1021 
ProcessRemoveStateMachine(const std::string & address)1022 void HfpAgService::ProcessRemoveStateMachine(const std::string &address)
1023 {
1024     stateMachines_.insert_or_assign(address, nullptr);
1025     if (isShuttingDown_) {
1026         ShutDownDone(false);
1027     }
1028 }
1029 
ProcessDefaultEvent(const HfpAgMessage & event) const1030 void HfpAgService::ProcessDefaultEvent(const HfpAgMessage &event) const
1031 {
1032     auto it = stateMachines_.find(event.dev_);
1033     if ((it != stateMachines_.end()) && (it->second != nullptr)) {
1034         it->second->ProcessMessage(event);
1035     } else {
1036         HILOGI("addr: %{public}s", GetEncryptAddr(event.dev_).c_str());
1037     }
1038 }
1039 
ProcessVoiceRecognitionTimeOut(const HfpAgMessage & event)1040 void HfpAgService::ProcessVoiceRecognitionTimeOut(const HfpAgMessage &event)
1041 {
1042     if (voiceRecognitionTimeout_ != nullptr) {
1043         voiceRecognitionTimeout_ = nullptr;
1044     }
1045 
1046     SendEventToEachStateMachine(event);
1047 }
1048 
ProcessResponseClccTimeOut(const HfpAgMessage & event)1049 void HfpAgService::ProcessResponseClccTimeOut(const HfpAgMessage &event)
1050 {
1051     if (ResponseClccTimeout_ != nullptr) {
1052         if (queryClccAddress_ != event.dev_) {
1053             return;
1054         } else {
1055             queryClccAddress_ = NULL_ADDRESS;
1056             ResponseClccTimeout_ = nullptr;
1057         }
1058     }
1059 
1060     SendEventToEachStateMachine(event);
1061 }
1062 
ProcessDialOutTimeOut()1063 void HfpAgService::ProcessDialOutTimeOut()
1064 {
1065     if (dialingOutTimeout_ != nullptr) {
1066         dialingOutTimeout_ = nullptr;
1067     }
1068 
1069     HfpAgMessage event(HFP_AG_DIALING_OUT_RESULT, HFP_AG_RESULT_ERROR);
1070     PostEvent(event);
1071 }
1072 
IsVoiceRecognitionAvailable(const std::string & address) const1073 bool HfpAgService::IsVoiceRecognitionAvailable(const std::string &address) const
1074 {
1075     if (IsConnected(address) == false) {
1076         return false;
1077     }
1078 
1079     if (IsActiveDevice(address) == false) {
1080         return false;
1081     }
1082 
1083     if (IsAudioIdle() == false) {
1084         LOG_INFO("[HFP AG]%{public}s():sco is not idle!", __FUNCTION__);
1085         return false;
1086     }
1087     return true;
1088 }
1089 
SetInbandRing(bool action)1090 void HfpAgService::SetInbandRing(bool action)
1091 {
1092     std::lock_guard<std::recursive_mutex> lk(mutex_);
1093     isInbandRinging_ = action;
1094     HfpAgMessage curEvent(HFP_AG_SET_INBAND_RING_TONE_EVT, action);
1095     PostEvent(curEvent);
1096 }
1097 
ResponesOK(const std::string & address)1098 void HfpAgService::ResponesOK(const std::string &address)
1099 {
1100     HfpAgMessage event(HFP_AG_RESPONE_OK_EVT);
1101     event.dev_ = address;
1102     PostEvent(event);
1103 }
1104 
IsConnected(const std::string & address) const1105 bool HfpAgService::IsConnected(const std::string &address) const
1106 {
1107     auto it = stateMachines_.find(address);
1108     if (it == stateMachines_.end() || it->second == nullptr) {
1109         HILOGE("[HFP AG] Invalid Device address:%{public}s", GetEncryptAddr(address).c_str());
1110         return false;
1111     }
1112     if (it->second->GetStateInt() < HFP_AG_STATE_CONNECTED) {
1113         HILOGE("[HFP AG] Device not connected! address:%{public}s, state[%{public}d]",
1114             GetEncryptAddr(address).c_str(), it->second->GetStateInt());
1115         return false;
1116     }
1117     return true;
1118 }
1119 
IsActiveDevice(const std::string & address) const1120 bool HfpAgService::IsActiveDevice(const std::string &address) const
1121 {
1122     std::string activeDevice = HfpAgProfile::GetActiveDevice();
1123     if (activeDevice == address) {
1124         return true;
1125     } else {
1126         HILOGE("[HFP AG] Current Device is not active device, address:%{public}s, activeDevice:%{public}s",
1127             GetEncryptAddr(address).c_str(), GetEncryptAddr(activeDevice).c_str());
1128         return false;
1129     }
1130 }
1131 
ModifyActiveDevice(const std::string & newAddress)1132 void HfpAgService::ModifyActiveDevice(const std::string &newAddress)
1133 {
1134     std::string preActiveDevice = HfpAgProfile::GetActiveDevice();
1135     HILOGI("[HFP AG] preActiveDevice address:%{public}s, activeDevice newAddress:%{public}s",
1136         GetEncryptAddr(preActiveDevice).c_str(), GetEncryptAddr(newAddress).c_str());
1137 
1138     HfpAgProfile::SetActiveDevice(newAddress);
1139     if (IsIncall()) {
1140         DisconnectSingleSco(preActiveDevice);
1141         HfpAgMessage event(HFP_AG_CONNECT_AUDIO_EVT);
1142         event.dev_ = newAddress;
1143         PostEvent(event);
1144     } else if (isVrOpened_) {
1145         SendCloseVoiceEvent(preActiveDevice);
1146     }
1147 
1148     NotifyCurrentActiveDevice(RawAddress(newAddress));
1149 }
1150 
1151 REGISTER_CLASS_CREATOR(HfpAgService);
1152 }  // namespace bluetooth
1153 }  // namespace OHOS
1154