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