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