blob: 35b4ee952911a65a90c032842f9368dc15e9c2d3 [file] [log] [blame]
/******************************************************************************
*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
/* MCP Interface */
#define LOG_TAG "bt_btif_mcp"
#include "bt_target.h"
#include "bta_closure_api.h"
#include "bta_mcp_api.h"
#include "btif_common.h"
#include "btif_storage.h"
#include <base/bind.h>
#include <base/callback.h>
#include <hardware/bluetooth.h>
#include <hardware/bt_mcp.h>
using base::Bind;
using base::Unretained;
using base::Owned;
using bluetooth::Uuid;
using std::vector;
using base::Bind;
using base::Unretained;
using bluetooth::mcp_server::McpServerCallbacks;
using bluetooth::mcp_server::McpServerInterface;
namespace {
class McpServerInterfaceImpl;
std::unique_ptr<McpServerInterface> McpServerInstance;
class McpServerInterfaceImpl
: public McpServerInterface, public McpServerCallbacks {
~McpServerInterfaceImpl() = default;
void Init(McpServerCallbacks* callback, Uuid bt_uuid) override {
LOG(INFO) << __func__ ;
this->callbacks = callback;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::Initialize, this, bt_uuid));
}
void MediaState(uint8_t state) override {
LOG(INFO) << __func__ << ": state " << state;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::MediaState, Unretained(McpServer::Get()), state));
}
void MediaPlayerName(uint8_t* name) override {
LOG(INFO) << __func__ << ": name" << name;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::MediaPlayerName, Unretained(McpServer::Get()), name));
}
void MediaControlPointOpcodeSupported(uint32_t feature) override {
LOG(INFO) << __func__ << ": feature" << feature;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::MediaControlPointOpcodeSupported, Unretained(McpServer::Get()), feature));
}
void MediaControlPoint(uint8_t value) override {
LOG(INFO) << __func__ << ": value" << value;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::MediaControlPoint, Unretained(McpServer::Get()), value));
}
void TrackChanged(bool status) override {
LOG(INFO) << __func__ << ": status" << status;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::TrackChanged, Unretained(McpServer::Get()), status));
}
void TrackTitle(uint8_t* title) override {
LOG(INFO) << __func__ << ": title" << title;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::TrackTitle, Unretained(McpServer::Get()), title));
}
void TrackPosition(int32_t position) override {
LOG(INFO) << __func__ << ": position" << position;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::TrackPosition, Unretained(McpServer::Get()), position));
}
void TrackDuration(int32_t duration) override {
LOG(INFO) << __func__ << ": duration" << duration;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::TrackDuration, Unretained(McpServer::Get()), duration));
}
void ContentControlId(uint8_t ccid) override {
LOG(INFO) << __func__ << ": ccid" << ccid;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::ContentControlId, Unretained(McpServer::Get()), ccid));
}
void PlayingOrderSupported(uint16_t order) override {
LOG(INFO) << __func__ << ": order" << order;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::PlayingOrderSupported, Unretained(McpServer::Get()), order));
}
void PlayingOrder(uint8_t value) override {
LOG(INFO) << __func__ << ": value" << value;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::PlayingOrder, Unretained(McpServer::Get()), value));
}
void SetActiveDevice(const RawAddress& address, int set_id, int profile) override {
LOG(INFO) << __func__ << ": set_id" << set_id<< ": device"<< address;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::SetActiveDevice, Unretained(McpServer::Get()), address, set_id, profile));
}
void DisconnectMcp(const RawAddress& address) override {
LOG(INFO) << __func__ << ": device"<< address;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::DisconnectMcp, Unretained(McpServer::Get()), address));
}
void BondStateChange(const RawAddress& address, int state) override {
LOG(INFO) << __func__ << ": device"<< address << " state : " << state;
do_in_bta_thread(FROM_HERE,
Bind(&McpServer::BondStateChange, Unretained(McpServer::Get()), address, state));
}
void Cleanup(void) override {
LOG(INFO) << __func__;
do_in_bta_thread(FROM_HERE, Bind(&McpServer::CleanUp));
}
void OnConnectionStateChange(int status,
const RawAddress& address) override {
LOG(INFO) << __func__ << ": device=" << address << " state=" << (int)status;
do_in_jni_thread(FROM_HERE, Bind(&McpServerCallbacks::OnConnectionStateChange,
Unretained(callbacks), status, address));
}
void MediaControlPointChangeReq(uint8_t state,
const RawAddress& address) override {
LOG(INFO) << __func__ << ": device=" << address << " state=" << (int)state;
do_in_jni_thread(FROM_HERE, Bind(&McpServerCallbacks::MediaControlPointChangeReq,
Unretained(callbacks), state, address));
}
void TrackPositionChangeReq(int32_t position) override {
LOG(INFO) << __func__ << " position=" << (int)position;
do_in_jni_thread(FROM_HERE, Bind(&McpServerCallbacks::TrackPositionChangeReq,
Unretained(callbacks), position));
}
void PlayingOrderChangeReq(uint32_t order) override {
LOG(INFO) << __func__ << ": order=" << order;
do_in_jni_thread(FROM_HERE, Bind(&McpServerCallbacks::PlayingOrderChangeReq,
Unretained(callbacks), order));
}
private:
McpServerCallbacks* callbacks;
};
}//namespace
const McpServerInterface* btif_mcp_server_get_interface(void) {
LOG(INFO) << __func__;
if (!McpServerInstance)
McpServerInstance.reset(new McpServerInterfaceImpl());
return McpServerInstance.get();
}