1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "bluetooth_connection.h"
17 
18 #include "audio_control_manager.h"
19 #include "bluetooth_call_manager.h"
20 #include "telephony_log_wrapper.h"
21 #ifdef ABILITY_BLUETOOTH_SUPPORT
22 #include "bluetooth_host.h"
23 
24 constexpr int32_t PHONE_NUMBER_TYPE = 0x81;
25 #endif
26 
27 namespace OHOS {
28 namespace Telephony {
BluetoothConnection()29 BluetoothConnection::BluetoothConnection() : connectedScoAddr_("") {}
30 
~BluetoothConnection()31 BluetoothConnection::~BluetoothConnection()
32 {
33 #ifdef ABILITY_BLUETOOTH_SUPPORT
34     if (statusChangeListener_ != nullptr) {
35         auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
36         if (samgrProxy != nullptr) {
37             samgrProxy->UnSubscribeSystemAbility(BLUETOOTH_HOST_SYS_ABILITY_ID, statusChangeListener_);
38             statusChangeListener_ = nullptr;
39         }
40     }
41     std::lock_guard<std::mutex> lock(bluetoothMutex_);
42     mapConnectedBtDevices_.clear();
43 #endif
44 }
45 
Init()46 void BluetoothConnection::Init()
47 {
48 #ifdef ABILITY_BLUETOOTH_SUPPORT
49     statusChangeListener_ = new (std::nothrow) SystemAbilityListener();
50     if (statusChangeListener_ == nullptr) {
51         TELEPHONY_LOGE("failed to create statusChangeListener");
52         return;
53     }
54     auto managerPtr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
55     if (managerPtr == nullptr) {
56         TELEPHONY_LOGE("get system ability manager error");
57         return;
58     }
59     int32_t ret = managerPtr->SubscribeSystemAbility(BLUETOOTH_HOST_SYS_ABILITY_ID, statusChangeListener_);
60     if (ret != TELEPHONY_SUCCESS) {
61         TELEPHONY_LOGE("failed to subscribe bluetooth service SA:%{public}d", BLUETOOTH_HOST_SYS_ABILITY_ID);
62         return;
63     }
64     std::vector<Bluetooth::BluetoothRemoteDevice> devices;
65     Bluetooth::HandsFreeAudioGateway *profile = Bluetooth::HandsFreeAudioGateway::GetProfile();
66     if (profile == nullptr) {
67         TELEPHONY_LOGE("profile is nullptr");
68         return;
69     }
70     int32_t result = profile->GetConnectedDevices(devices);
71     if (result != TELEPHONY_SUCCESS) {
72         TELEPHONY_LOGE("get connected devices fail");
73         return;
74     }
75     for (auto device : devices) {
76         std::string macAddress = device.GetDeviceAddr();
77         std::string deviceName = device.GetDeviceName();
78         AddBtDevice(macAddress, device);
79         DelayedSingleton<AudioDeviceManager>::GetInstance()->AddAudioDeviceList(macAddress,
80             AudioDeviceType::DEVICE_BLUETOOTH_SCO, deviceName);
81     }
82     TELEPHONY_LOGI("BluetoothConnection init success!");
83 #endif
84 }
85 
86 #ifdef ABILITY_BLUETOOTH_SUPPORT
87 
IsBtAvailble()88 bool BluetoothConnection::IsBtAvailble()
89 {
90     std::lock_guard<std::mutex> lock(bluetoothMutex_);
91     if (mapConnectedBtDevices_.empty()) {
92         TELEPHONY_LOGE("mapConnectedBtDevices_ is empty");
93         return false;
94     }
95 
96     return true;
97 }
98 #endif
99 
SendBtCallState(int32_t numActive,int32_t numHeld,int32_t callState,const std::string & number)100 int32_t BluetoothConnection::SendBtCallState(
101     int32_t numActive, int32_t numHeld, int32_t callState, const std::string &number)
102 {
103 #ifdef ABILITY_BLUETOOTH_SUPPORT
104     Bluetooth::HandsFreeAudioGateway *profile = Bluetooth::HandsFreeAudioGateway::GetProfile();
105     if (profile == nullptr) {
106         TELEPHONY_LOGE("profile is nullptr");
107         return TELEPHONY_ERROR;
108     }
109 
110     std::string nickName = "";
111     profile->PhoneStateChanged(numActive, numHeld, callState, number, PHONE_NUMBER_TYPE, nickName);
112 #endif
113     TELEPHONY_LOGI("PhoneStateChanged,numActive:%{public}d,numHeld:%{public}d,callState:%{public}d", numActive, numHeld,
114         callState);
115     return TELEPHONY_SUCCESS;
116 }
117 
SendCallDetailsChange(int32_t callId,int32_t callState)118 int32_t BluetoothConnection::SendCallDetailsChange(int32_t callId, int32_t callState)
119 {
120 #ifdef ABILITY_BLUETOOTH_SUPPORT
121     Bluetooth::HandsFreeAudioGateway *profile = Bluetooth::HandsFreeAudioGateway::GetProfile();
122     if (profile == nullptr) {
123         TELEPHONY_LOGE("profile is nullptr");
124         return TELEPHONY_ERROR;
125     }
126 
127     profile->CallDetailsChanged(callId, callState);
128 #endif
129     TELEPHONY_LOGI("Send CallDetails");
130     return TELEPHONY_SUCCESS;
131 }
132 
IsAudioActivated()133 bool BluetoothConnection::IsAudioActivated()
134 {
135     return DelayedSingleton<AudioControlManager>::GetInstance()->IsAudioActivated();
136 }
137 
138 #ifdef ABILITY_BLUETOOTH_SUPPORT
139 
ResetBtConnection()140 void BluetoothConnection::ResetBtConnection()
141 {
142     std::lock_guard<std::mutex> lock(bluetoothMutex_);
143     mapConnectedBtDevices_.clear();
144 }
145 
RegisterObserver()146 void BluetoothConnection::RegisterObserver()
147 {
148     Bluetooth::HandsFreeAudioGateway *profile = Bluetooth::HandsFreeAudioGateway::GetProfile();
149     if (profile == nullptr) {
150         TELEPHONY_LOGE("BluetoothConnection RegisterObserver fail!");
151         return;
152     }
153 
154     profile->RegisterObserver(shared_from_this());
155 }
156 
AddBtDevice(const std::string & address,Bluetooth::BluetoothRemoteDevice device)157 void BluetoothConnection::AddBtDevice(const std::string &address, Bluetooth::BluetoothRemoteDevice device)
158 {
159     std::lock_guard<std::mutex> lock(bluetoothMutex_);
160     auto iter = mapConnectedBtDevices_.find(address);
161     if (iter != mapConnectedBtDevices_.end()) {
162         TELEPHONY_LOGI("device is existenced");
163     } else {
164         mapConnectedBtDevices_.insert(std::pair<std::string, const Bluetooth::BluetoothRemoteDevice>(address, device));
165         TELEPHONY_LOGI("AddBtDevice success");
166     }
167 }
168 
RemoveBtDevice(const std::string & address)169 void BluetoothConnection::RemoveBtDevice(const std::string &address)
170 {
171     std::lock_guard<std::mutex> lock(bluetoothMutex_);
172     if (mapConnectedBtDevices_.count(address) > 0) {
173         mapConnectedBtDevices_.erase(address);
174         TELEPHONY_LOGI("RemoveBtDevice success");
175     } else {
176         TELEPHONY_LOGE("device is not existenced");
177     }
178 }
179 
GetBtDevice(const std::string & address)180 Bluetooth::BluetoothRemoteDevice *BluetoothConnection::GetBtDevice(const std::string &address)
181 {
182     std::lock_guard<std::mutex> lock(bluetoothMutex_);
183     if (mapConnectedBtDevices_.count(address) > 0) {
184         auto iter = mapConnectedBtDevices_.find(address);
185         if (iter != mapConnectedBtDevices_.end()) {
186             return &iter->second;
187         }
188     }
189     TELEPHONY_LOGE("device is not existenced");
190     return nullptr;
191 }
192 
OnConnectionStateChanged(const Bluetooth::BluetoothRemoteDevice & device,int32_t state,int32_t cause)193 void BluetoothConnection::OnConnectionStateChanged(const Bluetooth::BluetoothRemoteDevice &device,
194     int32_t state, int32_t cause)
195 {
196     TELEPHONY_LOGI("BluetoothConnection::OnConnectionStateChanged state : %{public}d", state);
197     std::string macAddress = device.GetDeviceAddr();
198     std::string deviceName = device.GetDeviceName();
199     switch (state) {
200         case (int32_t)Bluetooth::BTConnectState::CONNECTED:
201             DelayedSingleton<AudioDeviceManager>::GetInstance()->AddAudioDeviceList(
202                 macAddress, AudioDeviceType::DEVICE_BLUETOOTH_SCO, deviceName);
203             AddBtDevice(macAddress, device);
204             /** try to connect sco while new bluetooth device connected
205              *  if connect sco successfully , should switch current audio device to bluetooth sco
206              */
207             break;
208         case (int32_t)Bluetooth::BTConnectState::DISCONNECTED:
209             DelayedSingleton<AudioDeviceManager>::GetInstance()->RemoveAudioDeviceList(
210                 macAddress, AudioDeviceType::DEVICE_BLUETOOTH_SCO);
211             RemoveBtDevice(macAddress);
212             break;
213         default:
214             break;
215     }
216 }
217 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)218 void SystemAbilityListener::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
219 {
220     TELEPHONY_LOGI("SA:%{public}d is added!", systemAbilityId);
221     if (!CheckInputSysAbilityId(systemAbilityId)) {
222         TELEPHONY_LOGE("added SA is invalid!");
223         return;
224     }
225     if (systemAbilityId != BLUETOOTH_HOST_SYS_ABILITY_ID) {
226         TELEPHONY_LOGE("added SA is not bluetooth service, ignored.");
227         return;
228     }
229 
230     DelayedSingleton<BluetoothConnection>::GetInstance()->RegisterObserver();
231 }
232 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)233 void SystemAbilityListener::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
234 {
235     TELEPHONY_LOGI("SA:%{public}d is removed!", systemAbilityId);
236     if (!CheckInputSysAbilityId(systemAbilityId)) {
237         TELEPHONY_LOGE("removed SA is invalid!");
238         return;
239     }
240     if (systemAbilityId != BLUETOOTH_HOST_SYS_ABILITY_ID) {
241         TELEPHONY_LOGE("removed SA is not bluetooth service, ignored.");
242         return;
243     }
244 
245     DelayedSingleton<BluetoothConnection>::GetInstance()->ResetBtConnection();
246     std::shared_ptr<AudioDeviceManager> audioDeviceManager = DelayedSingleton<AudioDeviceManager>::GetInstance();
247     audioDeviceManager->ResetBtAudioDevicesList();
248     audioDeviceManager->ProcessEvent(AudioEvent::INIT_AUDIO_DEVICE);
249 }
250 #endif
251 } // namespace Telephony
252 } // namespace OHOS
253