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 /**
17  * @addtogroup Bluetooth
18  * @{
19  *
20  * @brief Defines a bluetooth system that provides basic bluetooth connection and profile functions,
21  *        including A2DP, AVRCP, BLE, GATT, HFP, MAP, PBAP, and SPP, etc.
22  *
23  * @since 6
24  */
25 
26 /**
27  * @file bluetooth_hfp_ag.h
28  *
29  * @brief Declares HFP AG role framework functions, including basic and observer functions.
30  *
31  * @since 6
32  */
33 
34 #ifndef BLUETOOTH_HFP_AG_H
35 #define BLUETOOTH_HFP_AG_H
36 
37 #include <string>
38 #include <vector>
39 #include <memory>
40 #include <list>
41 
42 #include "bluetooth_def.h"
43 #include "bluetooth_types.h"
44 #include "bluetooth_remote_device.h"
45 #include "bluetooth_no_destructor.h"
46 
47 namespace OHOS {
48 namespace Bluetooth {
49 /**
50  * @brief Class for HandsFree AudioGateway observer functions.
51  *
52  * @since 6
53  */
54 class HandsFreeAudioGatewayObserver {
55 public:
56     /**
57      * @brief The observer function to notify connection state changed.
58      *
59      * @param device Remote device object.
60      * @param state Connection state.
61      * @param cause Connecton cause.
62      * @since 12
63      */
OnConnectionStateChanged(const BluetoothRemoteDevice & device,int32_t state,int32_t cause)64     virtual void OnConnectionStateChanged(const BluetoothRemoteDevice &device, int32_t state, int32_t cause)
65     {}
66 
67     /**
68      * @brief The observer function to notify audio connection state changed.
69      *
70      * @param device Remote device object.
71      * @param state Audio connection state.
72      * @param reason Reason for Audio status change.
73      * @since 6
74      */
OnScoStateChanged(const BluetoothRemoteDevice & device,int32_t state,int32_t reason)75     virtual void OnScoStateChanged(const BluetoothRemoteDevice &device, int32_t state, int32_t reason)
76     {}
77 
78     /**
79      * @brief The observer function to notify active device changed.
80      *
81      * @param device Remote active device object.
82      * @since 6
83      */
OnActiveDeviceChanged(const BluetoothRemoteDevice & device)84     virtual void OnActiveDeviceChanged(const BluetoothRemoteDevice &device)
85     {}
86 
87     /**
88      * @brief The observer function to notify enhanced driver safety changed.
89      *
90      * @param device Remote device object.
91      * @param indValue Enhanced driver safety value.
92      * @since 6
93      */
OnHfEnhancedDriverSafetyChanged(const BluetoothRemoteDevice & device,int32_t indValue)94     virtual void OnHfEnhancedDriverSafetyChanged(const BluetoothRemoteDevice &device, int32_t indValue)
95     {}
96 
97     /**
98      * @brief The observer function to notify audio framework the hfp stack changed.
99      *
100      * @param device Remote device object.
101      * @param action Action on the device.
102      * @since 11
103      */
OnHfpStackChanged(const BluetoothRemoteDevice & device,int32_t action)104     virtual void OnHfpStackChanged(const BluetoothRemoteDevice &device, int32_t action)
105     {}
106 
107     /**
108      * @brief Destroy the HandsFreeAudioGateway Observer object.
109      *
110      * @since 6
111      */
~HandsFreeAudioGatewayObserver()112     virtual ~HandsFreeAudioGatewayObserver()
113     {}
114 
115     /**
116      * @brief The observer function to notify virtual device changed.
117      *
118      * @param Action on the device.
119      * @param device bluetooth device address.
120      * @since 12
121      */
OnVirtualDeviceChanged(int32_t action,std::string address)122     virtual void OnVirtualDeviceChanged(int32_t action, std::string address)
123     {}
124 };
125 
126 /**
127  * @brief Class for HandsFree AudioGateway API.
128  *
129  * @since 6
130  */
131 class BLUETOOTH_API HandsFreeAudioGateway {
132 public:
133     /**
134      * @brief Get the instance of HandsFreeAudioGateway object.
135      *
136      * @return Returns the pointer to the HandsFreeAudioGateway instance.
137      * @since 6
138      */
139     static HandsFreeAudioGateway *GetProfile();
140 
141     /**
142      * @brief Get remote HF device list which are in the connected state.
143      *
144      * @return Returns the list of devices.
145      * @since 6
146      */
147     int32_t GetConnectedDevices(std::vector<BluetoothRemoteDevice>& devices);
148 
149     /**
150      * @brief Get remote HF device list which are in the specified states.
151      *
152      * @param states List of remote device states.
153      * @return Returns the list of devices.
154      * @since 6
155      */
156     std::vector<BluetoothRemoteDevice> GetDevicesByStates(std::vector<int> states);
157 
158     /**
159      * @brief Get the connection state of the specified remote HF device.
160      *
161      * @param device Remote device object.
162      * @return Returns the connection state of the remote device.
163      * @since 6
164      */
165     int32_t GetDeviceState(const BluetoothRemoteDevice &device, int32_t &state);
166 
167     /**
168      * @brief Initiate the establishment of a service level connection to remote HF device.
169      *
170      * @param device Remote device object.
171      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
172      * @since 6
173      */
174     int32_t Connect(const BluetoothRemoteDevice &device);
175 
176     /**
177      * @brief Release the audio connection from remote HF device.
178      *
179      * @param device Remote device object.
180      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
181      * @since 6
182      */
183     int32_t Disconnect(const BluetoothRemoteDevice &device);
184 
185     /**
186      * @brief Get the Audio connection state of the specified remote HF device.
187      *
188      * @param device Remote device object.
189      * @return Returns the Audio connection state.
190      * @since 6
191      */
192     int GetScoState(const BluetoothRemoteDevice &device) const;
193 
194     /**
195      * @brief Initiate the establishment of an audio connection to remote active HF device.
196      *
197      * @param callType the type of the call, Refer to enum BtCallType
198      * @return Returns <b>0</b> if the operation is successful; returns <b>Other</b> if the operation fails.
199      * @since 10
200      */
201     int32_t ConnectSco(uint8_t callType);
202 
203     /**
204      * @brief Release the audio connection from remote active HF device.
205      *
206      * @param callType the type of the call, Refer to enum BtCallType
207      * @return Returns <b>0</b> if the operation is successful; returns <b>Other</b> if the operation fails.
208      * @since 10
209      */
210     int32_t DisconnectSco(uint8_t callType);
211 
212     /**
213      * @brief Initiate the establishment of an audio connection to remote active HF device.
214      *
215      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
216      * @since 6
217      */
218     bool ConnectSco();
219 
220     /**
221      * @brief Release the audio connection from remote active HF device.
222      *
223      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
224      * @since 6
225      */
226     bool DisconnectSco();
227 
228     /**
229      * @brief This function used to Update changed phone call informations.
230      *
231      * @param numActive Active call number.
232      * @param numHeld Held call number.
233      * @param callState Current call state.
234      * @param number Phone call number.
235      * @param type Type of phone call number.
236      * @param name Name of phone call number.
237      * @since 6
238      */
239     void PhoneStateChanged(
240         int numActive, int numHeld, int callState, const std::string &number, int type, const std::string &name);
241 
242     /**
243      * @brief Send response for querying standard list current calls by remote Hf device.
244      *
245      * @param index Index of the current call.
246      * @param direction Direction of the current call.
247      * @param status Status of the current call.
248      * @param mode Source Mode of the current call.
249      * @param mpty Is this call a member of a conference call.
250      * @param number Phone call number.
251      * @param type Type of phone call number.
252      * @since 6
253      */
254     void ClccResponse(int index, int direction, int status, int mode, bool mpty, const std::string &number, int type);
255 
256     /**
257      * @brief Open the voice recognition.
258      *
259      * @param device Remote device object.
260      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
261      * @since 6
262      */
263     bool OpenVoiceRecognition(const BluetoothRemoteDevice &device);
264 
265     /**
266      * @brief Close the voice recognition.
267      *
268      * @param device Remote device object.
269      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
270      * @since 6
271      */
272     bool CloseVoiceRecognition(const BluetoothRemoteDevice &device);
273 
274     /**
275      * @brief Set the active device for audio connection.
276      *
277      * @param device Remote device object.
278      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
279      * @since 6
280      */
281     bool SetActiveDevice(const BluetoothRemoteDevice &device);
282 
283     bool IntoMock(const BluetoothRemoteDevice &device, int state);
284     bool SendNoCarrier(const BluetoothRemoteDevice &device);
285 
286     /**
287      * @brief Get the active device object.
288      *
289      * @param device Remote active device object.
290      * @return Returns <b>true</b> if the operation is successful; returns <b>false</b> if the operation fails.
291      * @since 6
292      */
293     BluetoothRemoteDevice GetActiveDevice() const;
294 
295     /**
296      * @brief Set connection strategy for peer bluetooth device.
297      *        If peer device is connected and the policy is set not allowed,then perform disconnect operation.
298      *        If peer device is disconnected and the policy is set allowed,then perform connect operation.
299      *
300      * @param device The address of the peer bluetooth device.
301      * @param strategy The device connect strategy.
302      * @return Returns <b>RET_NO_ERROR</b> if the operation is successful.
303      *         Returns <b>BT_ERR_PERMISSION_FAILED</b> Permission denied.
304      *         Returns <b>BT_ERR_INVALID_PARAM</b> Input error.
305      *         Returns <b>BT_ERR_INVALID_STATE</b> BT_ERR_INVALID_STATE.
306      *         Returns <b>BT_ERR_INTERNAL_ERROR</b> Operation failed.
307      * @since 10.0
308      */
309     int SetConnectStrategy(const BluetoothRemoteDevice &device, int strategy);
310 
311     /**
312      * @brief Get connection strategy of peer bluetooth device.
313      *
314      * @param device The address of the peer bluetooth device.
315      * @param strategy The device connect strategy.
316      * @return Returns <b>RET_NO_ERROR</b> if the operation is successful.
317      *         Returns <b>BT_ERR_PERMISSION_FAILED</b> Permission denied.
318      *         Returns <b>BT_ERR_INVALID_PARAM</b> Input error.
319      *         Returns <b>BT_ERR_INVALID_STATE</b> BT_ERR_INVALID_STATE.
320      *         Returns <b>BT_ERR_INTERNAL_ERROR</b> Operation failed.
321      * @since 10.0
322      */
323     int GetConnectStrategy(const BluetoothRemoteDevice &device, int &strategy) const;
324 
325     /**
326      * @brief Register HandsFree AudioGateway observer instance.
327      *
328      * @param observer HandsFree AudioGateway observer instance.
329      * @since 6
330      */
331     void RegisterObserver(std::shared_ptr<HandsFreeAudioGatewayObserver> observer);
332 
333     /**
334      * @brief Deregister HandsFree AudioGateway observer instance.
335      *
336      * @param observer HandsFree AudioGateway observer instance.
337      * @since 6
338      */
339     void DeregisterObserver(std::shared_ptr<HandsFreeAudioGatewayObserver> observer);
340 
341     /**
342      * @brief Get remote HF device list which are in the connected state.
343      *
344      * @return Returns the list of devices.
345      * @since 6
346      */
347     std::vector<BluetoothRemoteDevice> GetConnectedDevices() const;
348 
349     /**
350      * @brief Check whether in-band-ringing is enabled
351      *
352      * @return Returns <b>true</b> if the in-band-ringing is enbale;
353      * returns <b>false</b> if the in-band-ringing is disable.
354      * @since 11
355      */
356     int IsInbandRingingEnabled(bool &isEnabled) const;
357 
358     /**
359      * @brief This function used to update changed phone call state.
360      *
361      * @param callId Current call id.
362      * @param callState Current call state.
363      * @since 11
364      */
365     void CallDetailsChanged(int callId, int callState);
366 
367     /**
368      * @brief Enable or disable the bluetooth log.
369      *
370      * @param state True: enable log, false: diaable log.
371      * @since 11
372      */
373     void EnableBtCallLog(bool state);
374 
375     /**
376      * @brief Check whether vgs is supported.
377      *
378      * @param device The address of the peer bluetooth device.
379      * @param isSupported Whether vgs is supported.
380      * @return Returns <b>RET_NO_ERROR</b> if the operation is successful.
381      *         Returns <b>BT_ERR_PERMISSION_FAILED</b> Permission denied.
382      *         Returns <b>BT_ERR_INVALID_PARAM</b> Input error.
383      *         Returns <b>BT_ERR_INVALID_STATE</b> BT_ERR_INVALID_STATE.
384      *         Returns <b>BT_ERR_INTERNAL_ERROR</b> Operation failed.
385      * @since 12
386      */
387     int IsVgsSupported(const BluetoothRemoteDevice &device, bool &isSupported) const;
388 
389     /**
390      * get virtual device list.
391      *
392      * @param devices virtual device list.
393      * @since 12
394      */
395     void GetVirtualDeviceList(std::vector<std::string> &devices) const;
396 
397     /**
398      * @brief Static HandsFree AudioGateway observer instance.
399      *
400      * @since 6
401      */
402     static HandsFreeAudioGateway *instance_;
403 
404     /**
405      * @brief The external process calls the HfpAg profile interface before the Bluetooth process starts. At this
406      * time, it needs to monitor the start of the Bluetooth process, and then call this interface to initialize the
407      * HfpAg proflie.
408      */
409     void Init();
410 
411 private:
412     HandsFreeAudioGateway();
413     ~HandsFreeAudioGateway();
414     BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(HandsFreeAudioGateway);
415     BLUETOOTH_DECLARE_IMPL();
416 
417 #ifdef DTFUZZ_TEST
418     friend class BluetoothNoDestructor<HandsFreeAudioGateway>;
419 #endif
420 };
421 }  // namespace Bluetooth
422 }  // namespace OHOS
423 #endif  // BLUETOOTH_HFP_AG_H
424