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