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