1/* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#pragma once 18 19#include <map> 20#include <memory> 21 22#include "avrcp.h" 23#include "connection_handler.h" 24#include "osi/include/properties.h" 25#include "raw_address.h" 26 27namespace bluetooth { 28namespace avrcp { 29 30/** 31 * AvrcpService is the management interface for AVRCP Target. It handles any 32 * required thread switching, interface registration, and provides an API 33 * for connecting and disconnecting devices. 34 * TODO (apanicke): Instead of providing a service interface implementation, 35 * have the AvrcpService itself be its interface so we don't have to access 36 * it indirectly. 37 */ 38class AvrcpService : public MediaCallbacks { 39 public: 40 /** 41 * Gets a handle to the AvrcpService 42 * 43 * Currently used by A2DP to tell AVRCP to initiate a connection to the 44 * remote device. 45 */ 46 static AvrcpService* Get(); 47 48 /** 49 * Returns an interface to control this service. The Avrcp::ServiceInterface 50 * handles all thread switching between the caller thread and the thread the 51 * service runs on, that way whoever uses the interface doesn't need to be 52 * aware which thread the service runs on. 53 */ 54 static ServiceInterface* GetServiceInterface(); 55 56 void Init(MediaInterface* media_interface, VolumeInterface* volume_interface); 57 void Cleanup(); 58 59 void ConnectDevice(const RawAddress& bdaddr); 60 void DisconnectDevice(const RawAddress& bdaddr); 61 62 // Functions inherited from MediaCallbacks in order to receive updates 63 void SendMediaUpdate(bool track_changed, bool play_state, 64 bool queue) override; 65 void SendFolderUpdate(bool available_players, bool addressed_player, 66 bool queue) override; 67 void SendActiveDeviceChanged(const RawAddress& address) override; 68 69 class ServiceInterfaceImpl : public ServiceInterface { 70 public: 71 void Init(MediaInterface* media_interface, 72 VolumeInterface* volume_interface) override; 73 bool ConnectDevice(const RawAddress& bdaddr) override; 74 bool DisconnectDevice(const RawAddress& bdaddr) override; 75 bool Cleanup() override; 76 77 private: 78 std::mutex service_interface_lock_; 79 }; 80 81 static void DebugDump(int fd); 82 83 protected: 84 void DeviceCallback(std::shared_ptr<Device> device); 85 86 private: 87 static AvrcpService* instance_; 88 static ServiceInterfaceImpl* service_interface_; 89 90 MediaInterface* media_interface_ = nullptr; 91 VolumeInterface* volume_interface_ = nullptr; 92 93 ConnectionHandler* connection_handler_; 94}; 95 96} // namespace avrcp 97} // namespace bluetooth 98 99inline bool is_new_avrcp_enabled() { 100 return osi_property_get_bool("persist.bluetooth.enablenewavrcp", true); 101}