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  * @file bluetooth_avrcp_ct.h
18  *
19  * @brief Declares the class of the AVRCP controller framework, including attributes and methods.
20  *
21  * @since 6
22  */
23 
24 #ifndef BLUETOOTH_AVRCP_CT_H
25 #define BLUETOOTH_AVRCP_CT_H
26 
27 #include <vector>
28 
29 #include "bluetooth_def.h"
30 #include "bluetooth_types.h"
31 #include "bluetooth_remote_device.h"
32 #include "bluetooth_no_destructor.h"
33 
34 namespace OHOS {
35 namespace Bluetooth {
36 /**
37  * @brief This class provides the attribute of the result of the actions.
38  *
39  * @since 6
40  */
41 class AvrcpCtResponse {
42 public:
43     /**
44      * @brief This struct declares the attributes of the button.
45      *
46      * @since 6
47      */
48     class Button {
49     public:
Button(uint8_t code)50         explicit Button(uint8_t code) : code_(code)
51         {};
~Button()52         ~Button()
53         {};
54         uint8_t code_;  // The value of the button.
55 
56     private:
57         Button() = delete;
58     };
59 
60     /**
61      * @brief This struct declares a set of capabilities supported by TG.
62      *
63      * @since 6
64      */
65     class Capabilities {
66     public:
Capabilities(std::vector<uint32_t> companies)67         explicit Capabilities(std::vector<uint32_t> companies) : companies_(companies)
68         {};
Capabilities(std::vector<uint8_t> events)69         explicit Capabilities(std::vector<uint8_t> events) : events_(events)
70         {};
~Capabilities()71         ~Capabilities()
72         {
73             events_.clear();
74             companies_.clear();
75         }
76         std::vector<uint32_t> companies_;
77         std::vector<uint8_t> events_;
78 
79     private:
80         Capabilities() = delete;
81     };
82 
83     /**
84      * @brief This struct declares a set of attributes of the player application setting.
85      *
86      * @since 6
87      */
88     class PlayerSettingAttributes {
89     public:
PlayerSettingAttributes(std::vector<uint8_t> attributes)90         explicit PlayerSettingAttributes(std::vector<uint8_t> attributes) : attributes_(attributes)
91         {};
~PlayerSettingAttributes()92         ~PlayerSettingAttributes()
93         {
94             attributes_.clear();
95         };
96         std::vector<uint8_t> attributes_;  // The attribute of the player application setting.
97 
98     private:
99         PlayerSettingAttributes() = delete;
100     };
101 
102     /**
103      * @brief This struct declares a set of attributes of the player application setting values.
104      *
105      * @since 6
106      */
107     class PlayerSettingValues {
108     public:
PlayerSettingValues(uint8_t attribute,const std::vector<uint8_t> & values)109         PlayerSettingValues(uint8_t attribute, const std::vector<uint8_t> &values)
110             : attribute_(attribute), values_(values)
111             {};
~PlayerSettingValues()112         ~PlayerSettingValues()
113         {
114             values_.clear();
115         };
116         uint8_t attribute_;            // The attribute of the player application setting.
117         std::vector<uint8_t> values_;  // The values of the specified attribute of the player application setting.
118 
119     private:
120         PlayerSettingValues() = delete;
121     };
122 
123     /**
124      * @brief This struct declares a set of attributes of the current player application setting value.
125      *
126      * @since 6
127      */
128     class PlayerSettingCurrentValue {
129     public:
PlayerSettingCurrentValue(const std::vector<uint8_t> & attributes,const std::vector<uint8_t> & values)130         PlayerSettingCurrentValue(const std::vector<uint8_t> &attributes, const std::vector<uint8_t> &values)
131             : attributes_(attributes), values_(values)
132             {};
~PlayerSettingCurrentValue()133         ~PlayerSettingCurrentValue()
134         {
135             attributes_.clear();
136             values_.clear();
137         };
138         std::vector<uint8_t> attributes_;  // The attribute of the player application settings.
139         std::vector<uint8_t> values_;      // The value of the specified attribute of the player application settings.
140 
141     private:
142         PlayerSettingCurrentValue() = delete;
143     };
144 
145     /**
146      * @brief This struct declares a set of attributes of the player application getting attribtue text.
147      *
148      * @since 6
149      */
150     class PlayerGettingText {
151     public:
PlayerGettingText(const std::vector<uint8_t> & attributes,const std::vector<std::string> & attrStr)152         PlayerGettingText(const std::vector<uint8_t> &attributes, const std::vector<std::string> &attrStr)
153             : attributes_(attributes), attrStr_(attrStr)
154             {};
~PlayerGettingText()155         ~PlayerGettingText()
156         {
157             attributes_.clear();
158             attrStr_.clear();
159         };
160         std::vector<uint8_t> attributes_;   // The attribute of the player application settings.
161         std::vector<std::string> attrStr_;  // The values associated witch the attribute.
162 
163     private:
164         PlayerGettingText() = delete;
165     };
166 
167     /**
168      * @brief This struct declares a set of element attribute.
169      *
170      * @since 6
171      */
172     class ElementAttributes {
173     public:
ElementAttributes(const std::vector<uint32_t> & attributes,const std::vector<std::string> & values)174         ElementAttributes(const std::vector<uint32_t> &attributes, const std::vector<std::string> &values)
175             : attributes_(attributes), values_(values)
176             {};
~ElementAttributes()177         ~ElementAttributes()
178         {
179             attributes_.clear();
180             values_.clear();
181         };
182         std::vector<uint32_t> attributes_;  // The attribute of the player application settings.
183         std::vector<std::string> values_;   // The value of the specified attribute of the player application settings.
184 
185     private:
186         ElementAttributes() = delete;
187     };
188 
189     /**
190      * @brief This struct declares the attributes of the player status.
191      *
192      * @since 6
193      */
194     class PlayStatus {
195     public:
PlayStatus(uint32_t songLength,uint32_t songPosition,uint8_t playStatus)196         PlayStatus(uint32_t songLength, uint32_t songPosition, uint8_t playStatus)
197             : songLength_(songLength), songPosition_(songPosition), playStatus_(playStatus)
198             {};
~PlayStatus()199         ~PlayStatus()
200         {};
201         uint32_t songLength_;    // The total length of the playing song in milliseconds.
202         uint32_t songPosition_;  // The current position of the playing in milliseconds elapsed.
203         uint8_t playStatus_;     // The current status of playing. Refer to <b>AvrcPlayStatus</b>.
204 
205     private:
206         PlayStatus() = delete;
207     };
208 
209     /**
210      * @brief This struct declares the attributes of the media item.
211      *
212      * @since 6
213 
214      */
215     class MediaItems {
216     public:
217         struct MediaItem {
218             // The value of the "Folder Type" and the "Media Type". Refer to <b>AvrcMediaFolderType</b> and
219             // <b>AvrcMediaElementType</b>.
220             uint8_t type_ {AVRC_MEDIA_ELEMENT_TYPE_RESERVED};
221             // The value of the "Is Playable". Refer to <b>AvrcMediaFolderPlayable</b>.
222             uint8_t playable_ {AVRC_MEDIA_FOLDER_PLAYABLE_RESERVED};
223             uint64_t uid_ {0xFFFFFFFFFFFFFFFF};
224             // The value of the "Displayable Name".
225             std::string name_;
226             // The list of the "Attribute ID".  Refer to <b>AvrcMediaAttribute</b>.
227             std::vector<uint32_t> attributes_;
228             // The list of the "Attribute Value".
229             std::vector<std::string> values_;
230         };
MediaItems(uint16_t uidCounter,const std::vector<MediaItem> & mediaItems)231         MediaItems(uint16_t uidCounter, const std::vector<MediaItem> &mediaItems)
232             : uidCounter_(uidCounter), mediaItems_(mediaItems)
233             {};
~MediaItems()234         ~MediaItems()
235         {};
236 
237         uint16_t uidCounter_ {0xFFFF};
238         std::vector<MediaItem> mediaItems_;
239 
240     private:
241         MediaItems() = delete;
242     };
243 
244         /**
245      * @brief This struct declares the the media player list.
246      *
247      * @since 6
248      */
249     class MediaPlayers {
250     public:
251         struct MediaPlayer {
252             /// The value of the "Folder Type" and the "Media Type". Refer to <b>AvrcMediaFolderType</b> and
253             /// <b>AvrcMediaElementType</b>.
254             uint8_t itemType_ {AVRC_MEDIA_ELEMENT_TYPE_RESERVED};
255             /// The value of the "Is Playable". Refer to <b>AvrcMediaFolderPlayable</b>.
256             uint16_t playerId_ {AVRC_MEDIA_FOLDER_PLAYABLE_RESERVED};
257             ///< The value of the "Major Player Type". Refer to <b>AvrcMediaMajorPlayerType</b>.
258             uint8_t majorType_ = 0x00;
259             ///< The value of the "Player Sub Type". Refer to <b>AvrcMediaPlayerSubType</b>.
260             uint32_t subType_ = 0x00;
261             ///< The value of the "Play Status". Refer to <b>AvrcPlayStatus</b>.
262             uint8_t playStatus_ = 0x00;
263             ///< The value of the "Feature Bit Mask".
264             std::vector<uint8_t> features_;
265             ///< The value of the "Displayable Name".
266             std::string name_ = "\0";
267         };
MediaPlayers(uint16_t uidCounter,const std::vector<MediaPlayer> & mediaPlayers)268         MediaPlayers(uint16_t uidCounter, const std::vector<MediaPlayer> &mediaPlayers)
269             : uidCounter_(uidCounter), mediaPlayers_(mediaPlayers)
270             {};
~MediaPlayers()271         ~MediaPlayers()
272         {};
273 
274         uint16_t uidCounter_ {0xFFFF};
275         std::vector<MediaPlayer> mediaPlayers_;
276 
277     private:
278         MediaPlayers() = delete;
279     };
280 
281     /**
282      * @brief This struct declares the attributes of the media item attribute.
283      *
284      * @since 6
285      */
286     class ItemAttributes {
287     public:
288         struct ItemAttribute {
289             uint32_t attribute_;
290             std::string value_;
291         };
ItemAttributes(const std::vector<ItemAttribute> & itemAttrs)292         explicit ItemAttributes(const std::vector<ItemAttribute> &itemAttrs) : itemAttrs_(itemAttrs)
293         {};
~ItemAttributes()294         ~ItemAttributes()
295         {};
296         std::vector<ItemAttribute> itemAttrs_;
297 
298     private:
299         ItemAttributes() = delete;
300     };
301 
302     /**
303      * @brief This struct declares a set of attributes of the player application setting values.
304      *
305      * @since 6
306      */
307     class TotalNumberOfItems {
308     public:
TotalNumberOfItems(uint16_t uidCounter,uint32_t numOfItems)309         TotalNumberOfItems(uint16_t uidCounter, uint32_t numOfItems)
310             : uidCounter_(uidCounter), numOfItems_(numOfItems)
311             {};
~TotalNumberOfItems()312         ~TotalNumberOfItems()
313         {};
314         uint16_t uidCounter_;  // The value of the uid counter.
315         uint32_t numOfItems_;  // The number of items in the directory.
316 
317     private:
318         TotalNumberOfItems() = delete;
319     };
320 
321     /**
322      * @brief This struct declares a set of attributes of the player application setting values.
323      *
324      * @since 6
325      */
326     class AbsoluteVolume {
327     public:
AbsoluteVolume(uint8_t volume)328         explicit AbsoluteVolume(uint8_t volume) : volume_(volume)
329         {};
~AbsoluteVolume()330         ~AbsoluteVolume()
331         {};
332         uint8_t volume_;  // The percentage of the absolute volume.Refer to <b> AvrcAbsoluteVolume</ b>.
333 
334     private:
335         AbsoluteVolume() = delete;
336     };
337 
338     /**
339      * @brief This struct declares a set of attributes of the notifications.
340      *
341      * @since 6
342      */
343     class Notification {
344     public:
Notification(uint8_t playStatus,uint8_t volume)345         Notification(uint8_t playStatus, uint8_t volume) : playStatus_(playStatus), volume_(volume)
346         {};
Notification(uint64_t uid)347         explicit Notification(uint64_t uid) : uid_(uid)
348         {};
Notification(uint32_t playbackPos)349         explicit Notification(uint32_t playbackPos) : playbackPos_(playbackPos)
350         {};
Notification(const std::vector<uint8_t> & attributes,const std::vector<uint8_t> & values)351         Notification(const std::vector<uint8_t> &attributes, const std::vector<uint8_t> &values)
352             : attributes_(attributes), values_(values)
353             {};
Notification(uint16_t playerId,uint16_t uidCounter)354         Notification(uint16_t playerId, uint16_t uidCounter) : playerId_(playerId), uidCounter_(uidCounter)
355         {};
Notification(uint16_t uidCounter)356         explicit Notification(uint16_t uidCounter) : uidCounter_(uidCounter)
357         {};
~Notification()358         ~Notification()
359         {};
360         uint8_t playStatus_ {AVRC_PLAY_STATUS_ERROR};    // The value of the "PlayStatus".
361         uint64_t uid_ {0xFFFFFFFFFFFFFFFF};              // The value of the "Identifier".
362         uint32_t playbackPos_ {0x00000000};              // The value of the "Playback position".
363         std::vector<uint8_t> attributes_;             // The value of the "PlayerApplicationSettingAttributeID".
364         std::vector<uint8_t> values_;                 // The value of the "PlayerApplicationSettingValueID".
365         uint16_t playerId_ {0xFFFF};                     // The value of the "Player Id".
366         uint16_t uidCounter_ {0xFFFF};                   // The value of the "UID Counter".
367         uint8_t volume_ {AVRC_ABSOLUTE_VOLUME_INVALID};  // The value of the "Absolute Volume".
368     private:
369         Notification() = delete;
370     };
371 
372     AvrcpCtResponse(uint8_t type, int resp);
373     ~AvrcpCtResponse();
374 
375     uint8_t type_;  // The type of the action.
376     int resp_;      // The result of the called action.
377     // The unique pointer to the <b>AvrcpCtResponse::Button</b> class.
378     std::unique_ptr<Button> button_ {nullptr};
379     // The unique pointer to the <b>AvrcpCtResponse::GetCapabilities</b> class.
380     std::unique_ptr<Capabilities> capabilities_ {nullptr};
381     // The unique pointer to the <b>AvrcpCtResponse::PlayerSettingAttributes</b> class.
382     std::unique_ptr<PlayerSettingAttributes> playerAttrs_ {nullptr};
383     // The unique pointer to the <b>AvrcpCtResponse::PlayerSettingValues</b> class.
384     std::unique_ptr<PlayerSettingValues> playerVals_ {nullptr};
385     // The unique pointer to the <b>AvrcpCtResponse::PlayerSettingCurrentValue</b> class.
386     std::unique_ptr<PlayerSettingCurrentValue> playerCurVal_ {nullptr};
387     // The unique pointer to the <b>AvrcpCtResponse::PlayerGettingAttribtueText</b> class.
388     std::unique_ptr<PlayerGettingText> playerText_ {nullptr};
389     // The unique pointer to the <b>AvrcpCtResponse::GetElementAttributes</b> class.
390     std::unique_ptr<ElementAttributes> eleSts_ {nullptr};
391     // The unique pointer to the <b>AvrcpCtResponse::PlayStatus</b> class.
392     std::unique_ptr<PlayStatus> playSts_ {nullptr};
393     // The unique pointer to the <b>AvrcpCtResponse::MediaItem</b> class.
394     std::unique_ptr<MediaItems> mediaItems_ {nullptr};
395     ///< The unique pointer to the <b>AvrcpCtResponse::MediaPlayer</b> class.
396     std::unique_ptr<MediaPlayers> mediaPlayers_ {nullptr};
397     ///< The unique pointer to the <b>AvrcpCtResponse::ItemAttributes</b> class.
398     std::unique_ptr<ItemAttributes> itemAttrs_ {nullptr};
399     // The unique pointer to the <b>AvrcpCtResponse::TotalNumberOfItems</b> class.
400     std::unique_ptr<TotalNumberOfItems> totalItems_ {nullptr};
401     // The unique pointer to the <b>AvrcpCtResponse::AbsoluteVolume</b> class.
402     std::unique_ptr<AbsoluteVolume> absVolume_ {nullptr};
403     // The unique pointer to the <b>AvrcpCtResponse::Notification</b> class.
404     std::unique_ptr<Notification> notify_ {nullptr};
405 
406 private:
407     AvrcpCtResponse() = delete;
408 };
409 
410 /**
411  * @brief This class provides a set of methods for operating the AVRCP controller.
412  *
413  * @since 6
414  */
415 class BLUETOOTH_API AvrcpController {
416 public:
417     /**
418      * @brief This abstract class declares a set of methods for observing the <b>AvrcpController::IObserver</b> class.
419      *
420      * @since 6
421      */
422     class IObserver {
423     public:
424         /**
425          * @brief A constructor used to create an <b>AvrcpController::IObserver</b> instance.
426          *
427          * @since 6
428          */
429         IObserver() = default;
430 
431         /**
432          * @brief A destructor used to delete the <b>AvrcpController::IObserver</b> instance.
433          *
434          * @since 6
435          */
436         virtual ~IObserver() = default;
437 
438         /**
439          * @brief Observes the state of the connection.
440          *
441          * @param[in] device The bluetooth device.
442          * @param[in] state  The connection state. Refer to <b>BTConnectState</b>.
443          * @param[in] cause  The connection change cause.
444          *
445          * @since 12
446          */
447         virtual void OnConnectionStateChanged(const BluetoothRemoteDevice &device, int state, int cause) = 0;
448 
449         /**
450          * @brief Observes the status of the other actions.
451          *
452          * @param[in] device The bluetooth device.
453          * @param[in] resp   The result of the called action.
454          *
455          * @since 6
456          */
457         virtual void OnActionCompleted(const BluetoothRemoteDevice &device, const AvrcpCtResponse &resp) = 0;
458     };
459 
460     /**
461      * @brief Gets the static instance of the <b>AvrcpController</b> class.
462      *
463      * @return The static instance.
464      *
465      * @since 6
466      */
467     static AvrcpController *GetProfile(void);
468 
469     /******************************************************************
470      * REGISTER / UNREGISTER OBSERVER                                 *
471      ******************************************************************/
472 
473     /**
474      * @brief Registers the observer.
475      *
476      * @param[in] observer The pointer to the <b>AvrcpController::IObserver</b>.
477      * @since 6
478      */
479     void RegisterObserver(std::shared_ptr<AvrcpController::IObserver> observer);
480 
481     /**
482      * @brief Unregisters the observer.
483      *
484      * @param[in] observer The pointer to the <b>AvrcpController::IObserver</b>.
485      * @since 6
486      */
487     void UnregisterObserver(std::shared_ptr<AvrcpController::IObserver> observer);
488 
489     /******************************************************************
490      * CONNECTION                                                     *
491      ******************************************************************/
492 
493     /**
494      * @brief Gets the connected devices.
495      *
496      * @return The list of the instance of the <b>BluetoothRemoteDevice</b> class.
497      *
498      * @since 6
499      */
500     std::vector<BluetoothRemoteDevice> GetConnectedDevices(void);
501 
502     /**
503      * @brief Gets the devices of the specified states.
504      *
505      * @param[in] states The connection states. Refer to <b>BTConnectState</b>.
506      * @return The list of the instance of the <b>BluetoothRemoteDevice</b> class.
507      *
508      * @since 6
509      */
510     std::vector<BluetoothRemoteDevice> GetDevicesByStates(const std::vector<int> &states);
511 
512     /**
513      * @brief Gets the connection state of the specified bluetooth device.
514      *
515      * @param[in] device The bluetooth device.
516      * @return The connection state. Refer to <b>BTConnectState</b>.
517      *
518      * @since 6
519      */
520     int GetDeviceState(const BluetoothRemoteDevice &device);
521 
522     /**
523      * @brief Connects to the AVRCP TG service.
524      *
525      * @param[in] device The bluetooth device.
526      * @return The result of the method execution.
527      * @retval true  command send success.
528      * @retval false command seend failed.
529      *
530      * @since 6
531      */
532     bool Connect(const BluetoothRemoteDevice &device);
533 
534     /**
535      * @brief Disconnects from the AVRCP TG service.
536      *
537      * @param[in] device The bluetooth device.
538      * @return The result of the method execution.
539      * @retval true  command send success.
540      * @retval false command seend failed.
541      *
542      * @since 6
543      */
544     bool Disconnect(const BluetoothRemoteDevice &device);
545 
546     /******************************************************************
547      * BUTTON OPERATION                                               *
548      ******************************************************************/
549 
550     /**
551      * @brief Presses the button.
552      *
553      * @param[in] device The bluetooth device.
554      * @param[in] button The value of the key operation. Refer to <b>AvrcKeyOperation</b>
555      * @return The result of the method execution.
556      * @retval RET_NO_ERROR   Execute success.
557      * @retval RET_NO_SUPPORT Not support.
558      * @retval RET_BAD_PARAM  Bad parameters.
559      * @retval RET_BAD_STATUS Execute failure.
560      *
561      * @since 6
562      */
563     int PressButton(const BluetoothRemoteDevice &device, uint8_t button);
564 
565     /**
566      * @brief Releases the button.
567      *
568      * @param[in] device The bluetooth device.
569      * @param[in] button The value of the key operation. Refer to <b>AvrcKeyOperation</b>
570      * @return The result of the method execution.
571      * @retval RET_NO_ERROR   Execute success.
572      * @retval RET_NO_SUPPORT Not support.
573      * @retval RET_BAD_PARAM  Bad parameters.
574      * @retval RET_BAD_STATUS Execute failure.
575      *
576      * @since 6
577      */
578     int ReleaseButton(const BluetoothRemoteDevice &device, uint8_t button);
579 
580     /******************************************************************
581      * UNIT INFO / SUB UNIT INFO                                      *
582      ******************************************************************/
583 
584     // TEMP
585     /**
586      * @brief Gets the unit information.
587      *
588      * @param[in] device The bluetooth device.
589      * @return The result of the method execution.
590      * @retval RET_NO_ERROR   Execute success.
591      * @retval RET_NO_SUPPORT Not support.
592      * @retval RET_BAD_STATUS Execute failure.
593      *
594      * @since 6
595      */
596     int GetUnitInfo(const BluetoothRemoteDevice &device);
597 
598     // TEMP
599     /**
600      * @brief Gets the sub unit information.
601      *
602      * @param[in] device The bluetooth device.
603      * @return The result of the method execution.
604      * @retval RET_NO_ERROR   Execute success.
605      * @retval RET_NO_SUPPORT Not Support.
606      * @retval RET_BAD_STATUS Execute failure.
607      *
608      * @since 6
609      */
610     int GetSubUnitInfo(const BluetoothRemoteDevice &device);
611 
612     /******************************************************************
613      * Media Player Selection                                         *
614      ******************************************************************/
615 
616     // TEMP
617     /**
618      * @brief Informs which media player wishes to control.
619      *
620      * @param[in] device   The bluetooth device.
621      * @param[in] playerId The unique media player id.
622      * @return The result of the method execution.
623      * @retval RET_NO_ERROR   Execute success.
624      * @retval RET_NO_SUPPORT Not Support.
625      * @retval RET_BAD_STATUS Execute failure.
626      *
627      * @since 6
628      */
629     int SetAddressedPlayer(const BluetoothRemoteDevice &device, uint16_t playerId);
630 
631     /**
632      * @brief Informs to which player browsing commands should be routed.
633      *
634      * @param[in] device   The bluetooth device.
635      * @param[in] playerId The unique media player id.
636      * @return The result of the method execution.
637      * @retval RET_NO_ERROR   Execute success.
638      * @retval RET_NO_SUPPORT Not Support.
639      * @retval RET_BAD_STATUS Execute failure.
640      *
641      * @since 6
642      */
643     int SetBrowsedPlayer(const BluetoothRemoteDevice &device, uint16_t playerId);
644 
645     /******************************************************************
646      * Capabilities                                                   *
647      ******************************************************************/
648 
649     /**
650      * @brief Get the supported companies by remote device.
651      *
652      * @details This is sent by CT to get the capabilities of the peer device.
653      * @param[in] rawAddr      The address of the bluetooth device.
654      * @return The result of the method execution.
655      * @retval RET_NO_ERROR   Execute success.
656      * @retval RET_NO_SUPPORT Not Support.
657      * @retval RET_BAD_STATUS Execute failure.
658      *
659      * @since 6
660      */
661     int GetSupportedCompanies(const BluetoothRemoteDevice &device);
662 
663     /**
664      * @brief Get the supported events by remote device.
665      *
666      * @details This is sent by CT to get the capabilities of the peer device.
667      * @param[in] rawAddr      The address of the bluetooth device.
668      * @return The result of the method execution.
669      * @retval RET_NO_ERROR   Execute success.
670      * @retval RET_NO_SUPPORT Not Support.
671      * @retval RET_BAD_STATUS Execute failure.
672      *
673      * @since 6
674      */
675     int GetSupportedEvents(const BluetoothRemoteDevice &device);
676     /******************************************************************
677      * PLAYER APPLICATION SETTINGS                                    *
678      ******************************************************************/
679 
680     /**
681      * @brief Gets the attribute of the player application.
682      *
683      * @param[in] device The bluetooth device.
684      * @return The result of the method execution.
685      * @retval RET_NO_ERROR   Execute success.
686      * @retval RET_NO_SUPPORT Not support.
687      * @retval RET_BAD_PARAM  Bad parameters.
688      * @retval RET_BAD_STATUS Execute failure.
689      *
690      * @since 6
691      */
692     int GetPlayerAppSettingAttributes(const BluetoothRemoteDevice &device);
693 
694     /**
695      * @brief Gets the values of the specified attribute of the player application.
696      *
697      * @param[in] device    The bluetooth device.
698      * @param[in] attribute The attribute of the player application setting. Refer to <b>AvrcPlayerAttribute</b>.
699      * @return The result of the method execution.
700      * @retval RET_NO_ERROR   Execute success.
701      * @retval RET_NO_SUPPORT Not support.
702      * @retval RET_BAD_PARAM  Bad parameters.
703      * @retval RET_BAD_STATUS Execute failure.
704      *
705      * @since 6
706      */
707     int GetPlayerAppSettingValues(const BluetoothRemoteDevice &device, uint8_t attribute);
708 
709     /**
710      * @brief Gets the current set values on the target for the provided player application setting attributes list.
711      *
712      * @param[in] device     The bluetooth device.
713      * @param[in] attributes The attribute of the player application settings. Refer to <b>AvrcPlayerAttribute</b>.
714      * @return The result of the method execution.
715      * @retval RET_NO_ERROR   Execute success.
716      * @retval RET_NO_SUPPORT Not Support.
717      * @retval RET_BAD_STATUS Execute failure.
718      *
719      * @since 6
720      */
721     int GetPlayerAppSettingCurrentValue(const BluetoothRemoteDevice &device, const std::vector<uint8_t> &attributes);
722 
723     /**
724      * @brief Sets the player application setting list of player application setting values on the target device for the
725      * corresponding defined list of AvrcPlayerAttribute.
726      *
727      * @param[in] device     The bluetooth device.
728      * @param[in] attributes The attribute of the player application settings. Refer to <b>AvrcPlayerAttribute</b>.
729      * @param[in] values     The value of the player application setting attribute.
730      * @return The result of the method execution.
731      * @retval RET_NO_ERROR   Execute success.
732      * @retval RET_NO_SUPPORT Not Support.
733      * @retval RET_BAD_STATUS Execute failure.
734      *
735      * @since 6
736      */
737     int SetPlayerAppSettingCurrentValue(const BluetoothRemoteDevice &device, const std::vector<uint8_t> &attributes,
738         const std::vector<uint8_t> &values);
739 
740     /**
741      * @brief  provide supported player application setting attribute displayable text.
742      *
743      * @details Switch to the thread of the AVRCP CT service in this method.
744      * @param[in] rawAddr    The address of the bluetooth device.
745      * @param[in] attributes The attribute of the player application settings.
746      * @return The result of the method execution.
747      * @retval RET_NO_ERROR   Execute success.
748      * @retval RET_NO_SUPPORT Not Support.
749      * @retval RET_BAD_STATUS Execute failure.
750      *
751      * @since 6
752      */
753     int GetPlayerApplicationSettingAttributeText(
754         const BluetoothRemoteDevice &device, const std::vector<uint8_t> &attributes);
755 
756     /**
757      * @brief  request the target device to provide target supported player application setting value displayable text.
758      *
759      * @details Switch to the thread of the AVRCP CT service in this method.
760      * @param[in] rawAddr     The address of the bluetooth device.
761      * @param[in] attributeId Player application setting attribute ID.
762      * @param[in] values      Player application setting value ID.
763      * @return The result of the method execution.
764      * @retval RET_NO_ERROR   Execute success.
765      * @retval RET_NO_SUPPORT Not Support.
766      * @retval RET_BAD_STATUS Execute failure.
767      *
768      * @since 6
769      */
770     int GetPlayerApplicationSettingValueText(
771         const BluetoothRemoteDevice &device, uint8_t attributeId, const std::vector<uint8_t> &values);
772 
773     /******************************************************************
774      * MEDIA INFORMATION PDUS                                         *
775      ******************************************************************/
776 
777     /**
778      * @brief Requests the TG to provide the attributes of the element specified in the parameter.
779      *
780      * @details Switch to the thread of the AVRCP CT service in this function.
781      * @param[in] device     The bluetooth device.
782      * @param[in] attributes Specifies the attribute ID for the attributes to be retrieved
783      *            @c RET_NO_ERROR   : The action is successful.
784      *            @c RET_NO_SUPPORT : The action is not supported.
785      *            @c RET_BAD_STATUS : The action is failed.
786      */
787 
788     int GetElementAttributes(const BluetoothRemoteDevice &device, const std::vector<uint32_t> &attributes);
789 
790     /******************************************************************
791      * PLAY                                                           *
792      ******************************************************************/
793 
794     /**
795      * @brief Gets the play status.
796      *
797      * @param[in] device The bluetooth device.
798      * @return The result of the method execution.
799      * @retval RET_NO_ERROR   Execute success.
800      * @retval RET_NO_SUPPORT Not Support.
801      * @retval RET_BAD_STATUS Execute failure.
802      *
803      * @since 6
804      */
805     int GetPlayStatus(const BluetoothRemoteDevice &device);
806 
807     /**
808      * @brief Starts playing an item indicated by the UID.
809      *
810      * @param[in] device     The bluetooth device.
811      * @param[in] scope      The scope in which media content navigation may take place. Refer to <b>AvrcMediaScope</b>.
812      * @param[in] uid        The unique ID of media item.
813      * @param[in] uidCounter The UID counter shall be incremented every time the TG makes an update.
814      * @return The result of the method execution.
815      * @retval RET_NO_ERROR   Execute success.
816      * @retval RET_NO_SUPPORT Not Support.
817      * @retval RET_BAD_STATUS Execute failure.
818      *
819      * @since 6
820      */
821     int PlayItem(const BluetoothRemoteDevice &device, uint64_t uid, uint16_t uidCounter);
822 
823     // TEMP
824     /**
825      * @brief Adds an item indicated by the UID to the Now Playing queue.
826      *
827      * @param[in] device     The bluetooth device.
828      * @param[in] scope      The scope in which media content navigation may take place. Refer to <b>AvrcMediaScope</b>.
829      * @param[in] uid        The UID of the media element item or folder item.
830      * @param[in] uidCounter The UID Counter.
831      * @return The result of the method execution.
832      * @retval RET_NO_ERROR   Execute success.
833      * @retval RET_NO_SUPPORT Not support.
834      * @retval RET_BAD_STATUS Execute failure.
835      *
836      * @since 6
837      */
838     int AddToNowPlaying(const BluetoothRemoteDevice &device, uint64_t uid, uint16_t uidCounter);
839 
840     /******************************************************************
841      * CONTINUING RESPONSE / ABORT CONTINUING RESPONSE                *
842      ******************************************************************/
843 
844     /**
845      * @brief Requests continuing response.
846      *
847      * @param[in] device  The bluetooth device.
848      * @param[in] pduId   The PDU ID which wants to request.
849      * @return The result of the method execution.
850      * @retval RET_NO_ERROR   Execute success.
851      * @retval RET_NO_SUPPORT Not Support.
852      * @retval RET_BAD_STATUS Execute failure.
853      */
854     int RequestContinuingResponse(const BluetoothRemoteDevice &device, uint8_t pduId);
855 
856     /**
857      * @brief Aborts continuing response.
858      *
859      * @param[in] device  The bluetooth device.
860      * @param[in] pduId   The PDU ID which wants to abort.
861      * @return The result of the method execution.
862      * @retval RET_NO_ERROR   Execute success.
863      * @retval RET_NO_SUPPORT Not Support.
864      * @retval RET_BAD_STATUS Execute failure.
865      *
866      * @since 6.0
867      */
868     int AbortContinuingResponse(const BluetoothRemoteDevice &device, uint8_t pduId);
869 
870     /******************************************************************
871      * OPERATE THE VIRTUAL FILE SYSTEM                                *
872      ******************************************************************/
873 
874     /**
875      * @brief Navigates one level up or down in the virtual file system.
876      *
877      * @param[in] device     The bluetooth device.
878      * @param[in] uidCounter The value of the uid counter.
879      * @param[in] direction  The flag of the navigation. Refer to <b>bluetooth::AvrcFolderDirection</b>.
880      * @param[in] folderUid  The UID of the folder to navigate to. This may be retrieved via a GetFolderItems command.
881      * If the navigation command is Folder Up this field is reserved.
882      * @return The result of the method execution.
883      * @retval RET_NO_ERROR   Execute success.
884      * @retval RET_NO_SUPPORT Not support.
885      * @retval RET_BAD_PARAM  Bad parameters.
886      * @retval RET_BAD_STATUS Execute failure.
887      *
888      * @since 6
889      */
890     int ChangePath(const BluetoothRemoteDevice &device, uint16_t uidCounter, uint16_t direction, uint64_t folderUid);
891 
892     /**
893      * @brief Retrieves a listing of the contents of a folder.
894      *
895      * @param[in] device     The bluetooth device.
896      * @param[in] startItem  The offset within the listing of the item, which should be the first returned item. The
897      * first element in the listing is at offset 0.
898      * @param[in] endItem    The offset within the listing of the item which should be the final returned item. If this
899      * is set to a value beyond what is available, the TG shall return items from the provided Start Item index to the
900      * index of the final item. If the End Item index is smaller than the Start Item index, the TG shall return an
901      * error. If CT requests too many items, TG can respond with a sub-set of the requested items.
902      * @param[in] attributes The list of media attributes.
903      * @return The result of the method execution.
904      * @retval RET_NO_ERROR   Execute success.
905      * @retval RET_NO_SUPPORT Not support.
906      * @retval RET_BAD_STATUS Execute failure.
907      *
908      * @since 6
909      */
910     int GetFolderItems(const BluetoothRemoteDevice &device, uint32_t startItem, uint32_t endItem,
911         const std::vector<uint32_t> &attributes);
912 
913         /**
914      * @brief Retrieves a listing of the contents of a folder.
915      *
916      * @param[in] device     The bluetooth device.
917      * @param[in] startItem  The offset within the listing of the item, which should be the first returned item. The
918      * first element in the listing is at offset 0.
919      * @param[in] endItem    The offset within the listing of the item which should be the final returned item. If this
920      * is set to a value beyond what is available, the TG shall return items from the provided Start Item index to the
921      * index of the final item. If the End Item index is smaller than the Start Item index, the TG shall return an
922      * error. If CT requests too many items, TG can respond with a sub-set of the requested items.
923      * @return The result of the method execution.
924      * @retval RET_NO_ERROR   Execute success.
925      * @retval RET_NO_SUPPORT Not support.
926      * @retval RET_BAD_STATUS Execute failure.
927      *
928      * @since 6
929      */
930     int GetMeidaPlayerList(const BluetoothRemoteDevice &device, uint32_t startItem, uint32_t endItem);
931 
932     /**
933      * @brief Retrieves the metadata attributes for a particular media element item or folder item.
934      *
935      * @param[in] device     The bluetooth device.
936      * @param[in] uid        The UID of the media element item or folder item.
937      * @param[in] uidCounter The UID Counter.
938      * @param[in] attributes The list of media attributes.
939      * @return The result of the method execution.
940      * @retval RET_NO_ERROR   Execute success.
941      * @retval RET_NO_SUPPORT Not support.
942      * @retval RET_BAD_STATUS Execute failure.
943      *
944      * @since 6
945      */
946     int GetItemAttributes(const BluetoothRemoteDevice &device, uint64_t uid, uint16_t uidCounter,
947         const std::vector<uint32_t> &attributes);
948 
949     /**
950      * @brief Gets the number of items in the now playing scope.
951      *
952      * @param[in] device The bluetooth device.
953      * @return The result of the method execution.
954      * @retval RET_NO_ERROR   Execute success.
955      * @retval RET_NO_SUPPORT Not support.
956      * @retval RET_BAD_STATUS Execute failure.
957      *
958      * @since 6
959      */
960     int GetTotalNumberOfItems(const BluetoothRemoteDevice &device);
961 
962     /******************************************************************
963      * ABSOLUTE VOLUME                                                *
964      ******************************************************************/
965 
966     /**
967      * @brief Sets an absolute volume to be used by the rendering device.
968      *
969      * @param[in] device The bluetooth device.
970      * @param[in] volume The percentage of the absolute volume. Refer to <b>AvrcAbsoluteVolume</b>.
971      * @return The result of the method execution.
972      * @retval RET_NO_ERROR   Execute success.
973      * @retval RET_NO_SUPPORT Not support.
974      * @retval RET_BAD_STATUS Execute failure.
975      *
976      * @since 6
977      */
978     int SetAbsoluteVolume(const BluetoothRemoteDevice &device, uint8_t volume);
979 
980     /******************************************************************
981      * NOTIFICATION                                                   *
982      ******************************************************************/
983 
984     /**
985      * @brief Enables for receiving notifications asynchronously based on specific events occurring.
986      *
987      * @details Switch to the thread of the AVRCP CT service in this method.
988      * @param[in] rawAddr  The address of the bluetooth device.
989      * @param[in] events   The event for which the requires notification. Refer to <b>AvrcEventId</b>.
990      * @param[in] interval The specifies the time interval (in seconds) at which the change in playback position will be
991      * notified.
992      * @return The result of the method execution.
993      * @retval RET_NO_ERROR   Execute success.
994      * @retval RET_NO_SUPPORT Not support.
995      * @retval RET_BAD_STATUS Execute failure.
996      *
997      * @since 6
998      */
999     int EnableNotification(const BluetoothRemoteDevice &device, const std::vector<uint8_t> &events,
1000         uint32_t interval = AVRC_PLAYBACK_INTERVAL_1_SEC);
1001 
1002     /**
1003      * @brief Disables for receiving notifications asynchronously based on specific events occurring.
1004      *
1005      * @details Switch to the thread of the AVRCP CT service in this method.
1006      * @param[in] rawAddr The address of the bluetooth device.
1007      * @param[in] events  The event for which the requires notification. Refer to <b>AvrcEventId</b>.
1008      * @return The result of the method execution.
1009      * @retval RET_NO_ERROR   Execute success.
1010      * @retval RET_NO_SUPPORT Not support.
1011      * @retval RET_BAD_STATUS Execute failure.
1012      *
1013      * @since 6
1014      */
1015     int DisableNotification(const BluetoothRemoteDevice &device, const std::vector<uint8_t> &events);
1016 
1017     /**
1018      * @brief The external process calls the A2dpsrc profile interface before the Bluetooth process starts. At this
1019      * time, it needs to monitor the start of the Bluetooth process, and then call this interface to initialize the
1020      * A2dpsrc proflie.
1021      */
1022     void Init();
1023 
1024 private:
1025     /**
1026      * @brief A constructor used to create an <b>AvrcpController</b> instance.
1027      *
1028      * @since 6
1029      */
1030     AvrcpController();
1031 
1032     /**
1033      * @brief A destructor used to delete the <b>AvrcpController</b> instance.
1034      *
1035      * @since 6
1036      */
1037     virtual ~AvrcpController();
1038 
1039     BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(AvrcpController);
1040     BLUETOOTH_DECLARE_IMPL();
1041 
1042 #ifdef DTFUZZ_TEST
1043     friend class BluetoothNoDestructor<AvrcpController>;
1044 #endif
1045 };
1046 }  // namespace Bluetooth
1047 }  // namespace OHOS
1048 #endif  // !BLUETOOTH_AVRCP_CT_H
1049