// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.bluetooth.avrcp;

using fuchsia.bluetooth;

[Discoverable]
protocol AvrcpTest {
    /// Sets an implementation of target handler that will vend delegates for each incoming
    /// remote TG -> local CT connections to handle the commands being sent by the remote TG.
    /// If no target handler is set, a default handler will be used internally that will
    /// dispatch to the MediaSession service. This should only be used for debug and testing.
    RegisterIncomingTargetHandler(TargetHandler handler);

    /// Returns a test client to a remote target service at the address specified by |device_id|.
    /// This client is to be used in conjunction the non test client from the primary Avrcp service.
    /// The test client provides additional methods not exposed by normal client to be used
    /// for debugging and testing purposes.
    /// TODO (BT-305): change device_id to int.
    GetTestControllerForTarget(string device_id, request<TestController> test_controller) -> (fuchsia.bluetooth.Status status);
};

/// An implementation of this interface is registered with the AvrcpTest service to handle
/// incoming connections.
protocol TargetHandler {
    /// Called when an incoming target is connected. |delegate| should be fulfilled with an
    /// interface that will be used to handle commands from the connected Controller.
    /// TODO (BT-305): change device_id to int.
    ControllerConnected(string device_id, request<TargetDelegate> delegate);
};

/// Returned by an implementer of the TargetHandler interface.
/// Handles incoming connection commands by a remote CT device.
protocol TargetDelegate {
    /// Called after Panel key down and up events.
    OnCommand(AvcPanelCommand command) -> (fuchsia.bluetooth.Status status);
};

/// Provides methods not exposed in `Controller` that are strictly for testing and debug.
protocol TestController {
    /// Returns whether there is an underlying connection open with the remote device currently.
    IsConnected() -> (bool connected);

    /// Queries the target and returns what events are supported for notification.
    /// Sends GetCapabilties(0x03 (EVENTS_SUPPORTED)) command for all events supported by
    /// the negoitated version of AVRCP.
    GetEventsSupported() -> (fuchsia.bluetooth.Status status, vector<TargetEvent> events_supported);

    /// Explicitly connect to the remote device.
    Connect();

    /// Explicitly disconnect the L2CAP channel to the remote.
    /// Be warned that other clients may be sharing this L2CAP connection.
    Disconnect();
};
