// Copyright 2020 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.ui.pointer;

using zx;

const TOUCH_MAX_EVENT uint32 = 128;

/// A method for a client to receive touch events and respond in a global
/// gesture disambiguation protocol.
///
/// The position of a touch event is defined in the context of a viewport,
/// situated in the view. The dimensions of the view and viewport, and their
/// spatial relationship (defined with a transform matrix), are supplied
/// synchronously in a |ViewParameter| table. A view may retrieve a pointer's
/// position in its local coordinate system by applying the viewport-to-view
/// transform matrix.
///
/// The viewport is embedded in an independent and stable coordinate system,
/// suitable for interpreting touch events in a scale-independent manner; a
/// swipe will be observed at a constant scale, even under effects such as
/// magnification or panning. However, other effects, such as enlargening the
/// view's clip bounds, may trigger a change in the viewport extents.
protocol TouchSource {
    /// A method for a client to receive touch pointer events.
    ///
    /// This call is formulated as a "hanging get" pattern: the client asks for
    /// a set of recent events, and receives them via the callback. This
    /// pull-based approach ensures that clients consume events at their own
    /// pace; events don't clog up the channel in an unbounded manner.
    ///
    /// Flow control. The caller is allowed at most one in-flight |Watch| call
    /// at a time; it is a logical error to have concurrent calls to |Watch|.
    /// Non-compliance results in channel closure.
    ///
    /// Client pacing. The server will dispatch events to the caller on a FIFO,
    /// lossless, best-effort basis, but the caller must allocate enough time to
    /// keep up with new events. An unresponsive client may be categorized as
    /// "App Not Responding" and targeted for channel closure.
    ///
    /// Responses. The gesture disambiguation scheme relies on the server
    /// receiving a |TouchResponse| for each |TouchEvent|.|TouchPointerSample|;
    /// non-sample events should return an empty |TouchResponse| table to the
    /// server. Responses for *previous* events are fed to the server on the
    /// *next* call of |Watch| [1]. Each element in the |responses| vector is
    /// interpreted as the pairwise response to the event in the previous
    /// |events| vector; the vector lengths must match. Note that the client's
    /// contract to respond to events starts as soon as it registers its
    /// endpoint with scenic, NOT when it first calls `Watch()`.
    ///
    /// Initial response. The first call to |Watch| must be an empty vector.
    ///
    /// Event times. The timestamps on each event in the event vector are *not*
    /// guaranteed monotonic; touch events from different devices may be
    /// injected into Scenic at different times. Generally, events from a single
    /// device are expected to have monotonically increasing timestamps.
    ///
    /// View parameters. Occasionally, changes in view or viewport require
    /// notifying the client. If a |TouchEvent| carries |ViewParameters|, these
    /// parameters apply to successive |TouchPointerSample|s until the next
    /// |ViewParameters|.
    ///
    /// [1] The hanging get pattern enables straightforward API evolution, but
    /// unfortunately does not admit an idiomatic matching of response to event.
    Watch(struct {
        responses vector<TouchResponse>:TOUCH_MAX_EVENT;
    }) -> (struct {
        events vector<TouchEvent>:TOUCH_MAX_EVENT;
    });

    /// The gesture protocol allows a client to enact a "hold" on an open
    /// interaction of touch events; it prevents resolution of interaction
    /// ownership, even after the interaction closes. This method updates the
    /// client's previous "hold" by replacing it with a response that allows
    /// ownership resolution to proceed.
    ///
    /// See |TouchInteractionId| for how a stream is structured into
    /// interactions.
    ///
    /// Flow control. The caller is allowed at most one |UpdateResponse| call
    /// per interaction, and it must be on a closed interaction. It is a logical
    /// error to call |UpdateResponse| when a normal response is possible with
    /// the |Watch| call.
    ///
    /// Validity. This TouchResponse must not be another "hold" response, and
    /// the overwritten response is expected to be a "hold" response.
    UpdateResponse(struct {
        interaction TouchInteractionId;
        response TouchResponse;
    }) -> ();
};

/// The self-sufficient, self-consistent collection of pointer-related data,
/// sent from server to client.
type TouchEvent = table {
    /// The time this event was observed.
    /// Required.
    1: timestamp zx.time;

    /// The parameters of the associated view and viewport, sufficient to
    /// correctly interpret the position, orientation, magnitude, and
    /// inter-event distance of touch events dispatched to a view.
    /// - It is issued on connection and on change.
    2: view_parameters ViewParameters;

    /// A description of the pointer device, sufficient to correctly interpret
    /// the capabilities and usage intent of the device.
    /// - It is issued once per device.
    3: device_info TouchDeviceInfo;

    /// A description of each sampled data point in an interaction of touch
    /// events.
    /// - It is issued on every sample in the interaction.
    4: pointer_sample TouchPointerSample;

    /// The result of gesture disambiguation for a interaction of touch events.
    /// - It is issued once per interaction.
    5: interaction_result TouchInteractionResult;

    /// An identifier to correlate this event's send/receive occurrence across
    /// component boundaries or abstraction layers.
    6: trace_flow_id uint64;
};

/// Information about a device that issues touch event streams.
type TouchDeviceInfo = table {
    /// An identifier for the touch device that issues touch event streams.
    /// A device may own multiple pointers, each with its own pointer id and its
    /// own touch event stream.
    /// Required.
    1: id uint32;
};

/// A unique identifier for a "interaction" of touch events in an event stream.
/// Touch events are observed as a succession of interactions, as fingers engage
/// and disengage with the display.
///
/// A finite sequence of pointer events that follows the `EventPhase` state
/// machine, starting from the initial state ADD, is called an **interaction**.
/// A closed (or past) interaction is one where it has reached the terminal
/// state (REMOVE or CANCEL); an open (or current) interaction is one where it
/// has not.
///
/// For a given device pointer, a stream of events is observed as a succession
/// of zero or more closed interactions (the past history of user engagement),
/// followed by at most one open interaction (the current user engagement).
///
/// Because we need to group pointer events by their interaction, touch event
/// carries an **interaction id** that is unique in that pointer stream. This
/// common reference makes it possible to operate on a closed interaction, as
/// well as an open interaction.
///
/// Also see `EventPhase` for a discussion on event streams by mice.
type TouchInteractionId = struct {
    /// An identifier for the pointer device that issues touch event streams.
    /// A device may own multiple pointers, each with its own |pointer_id|.
    device_id uint32;

    /// An identifier of the pointer that issued this event. It is unique only
    /// to a specific |device_id|. Each (device_id, pointer_id) pair issues at
    /// most one open interaction at a time.
    pointer_id uint32;

    /// An identifier of the interaction. It is unique only to a specific
    /// (device_id, pointer_id) pair.
    interaction_id uint32;
};

/// A description of each sampled data point in a touch event stream.
/// All fields are required.
type TouchPointerSample = table {
    /// The interaction that this pointer sample belongs to.
    1: interaction TouchInteractionId;

    /// The state of this event in the interaction's state machine.
    2: phase EventPhase;

    /// The position of this event, in the viewport's coordinate system.
    3: position_in_viewport Point2;
};

/// The result of gesture disambiguation for a interaction of touch events, sent
/// from server to client.
type TouchInteractionResult = struct {
    /// The interaction that this pointer sample belongs to.
    interaction TouchInteractionId;

    /// The interaction's disposition, sent from server to client.
    status TouchInteractionStatus;
};

/// A description of the interaction's relationship to this client.
type TouchInteractionStatus = strict enum {
    /// The client has been denied ownership of the interaction.
    DENIED = 1;

    /// The client has been granted ownership of the interaction.
    GRANTED = 2;
};

/// A feedback event per |Event|, sent from client to server.
///
/// Only |TouchPointerSample| requires a |TouchResponseType|; for other events,
/// the server expects an empty |TouchResponse| table.
type TouchResponse = table {
    /// The interaction disposition that a client responds with for a given
    /// |TouchPointerSample|.
    1: response_type TouchResponseType;

    /// An identifier to correlate this response's send/receive occurrence across
    /// component boundaries or abstraction layers.
    2: trace_flow_id uint64;
};

/// The possible interaction dispositions that a client can respond with to a
/// given |TouchPointerSample|. Used as part of a gesture disambiguation scheme.
///
/// The responses are based on the idea of an ownership claim on a interaction.
/// Clients may assert a claim of ownership on an open interaction, but only one
/// client's claim is granted by the server; other clients' claims are denied.
type TouchResponseType = strict enum {
    /// The client has no further interest in this interaction; it declines
    /// ownership of the interaction. The client will stop receiving events for
    /// this interaction.
    NO = 1;

    /// The client is interested in this interaction, but needs to see more
    /// events to decide; the client has not yet claimed ownership of this
    /// interaction.
    MAYBE = 2;

    /// The client is interested in this interaction, but needs to see more
    /// events to decide; the client has not yet claimed ownership of the
    /// interaction. During ownership resolution, it exerts its priority over
    /// lower-priority "maybe" claims, but always loses to a "yes" claim.
    MAYBE_PRIORITIZE = 3;

    /// The client is interested in this interaction, but needs to see more
    /// events to decide; the client has not yet claimed ownership of the
    /// interaction. Moreover, it suppresses lower-priority claims that try to
    /// resolve interaction ownership.
    MAYBE_SUPPRESS = 4;

    /// The client is interested in this interaction, but needs to see more
    /// events to decide; the client has not yet claimed ownership of the
    /// interaction. Moreover, it suppresses lower-priority claims that try to
    /// resolve interaction ownership. During ownership resolution, it exerts
    /// its priority over lower-priority "maybe" claims, but always loses to a
    /// "yes" claim.
    MAYBE_PRIORITIZE_SUPPRESS = 5;

    /// The client is interested in this interaction, but needs to see a
    /// subsequent interaction to decide; the client has not yet claimed
    /// ownership of this interaction. It prevents ownership resolution when the
    /// interaction closes.
    HOLD = 6;

    /// The client is interested in this interaction, but needs to see a
    /// subsequent interaction to decide; the client has not yet claimed
    /// ownership of this interaction. It prevents ownership resolution when the
    /// interaction closes. Moreover, it suppresses lower-priority claims that
    /// try to resolve interaction ownership.
    HOLD_SUPPRESS = 7;

    /// The client wishes exclusive access to the remaining events in this
    /// interaction; it claims ownership of this interaction (but that claim may
    /// be granted or denied). During ownership resolution, it yields its
    /// priority to lower-priority "yes" claims.
    YES = 8;

    /// The client wishes exclusive access to the remaining events in this
    /// interaction; it claims ownership of this interaction (but that claim may
    /// be granted or denied). During ownership resolution, it exerts its
    /// priority over lower-priority "yes" claims.
    YES_PRIORITIZE = 9;
};
