// 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.
@available(added=7)
library fuchsia.accessibility.gesture;
// Evolution. This listener protocol is expected to be exclusively consumed by
// clients in a single out-of-tree repository, so the evolution burden (e.g.,
// adding enums or methods) is expected to be minimal.

/// Maximum size of a returned utterance.
const MAX_UTTERANCE_SIZE uint64 = 16384;

/// Gestures types that accessibility offers to a UI component for listening.
type Type = strict enum {
    /// A three-finger swipe up.
    THREE_FINGER_SWIPE_UP = 1;
    /// A three-finger swipe down.
    THREE_FINGER_SWIPE_DOWN = 2;
    /// A three-finger swipe right.
    THREE_FINGER_SWIPE_RIGHT = 3;
    /// A three-finger swipe left.
    THREE_FINGER_SWIPE_LEFT = 4;
};

/// An interface to listen for accessibility gestures.
///
/// Accessibility services offer a set of gestures defined in Type above, which
/// can be targeted by a system UI.
/// Generally, in a touch screen system, there is a set of system-wide gestures
/// which can be performed anywhere, triggering an action that changes some
/// state of the UI.
/// For example, some can offer a way to close an application and go back to
/// their home screen, while others can offer a way to bring a list of running
/// applications that users can choose from.
/// Because those gestures can conflict with assistive technology gestures,
/// accessibility services offer some alternative ones which can be bound to the
/// UI actions.
protocol Listener {
    /// When accessibility services detect a gesture, the listener is informed
    /// of which gesture was performed. The listener has the chance to handle
    /// the gesture, setting the result in |handled|. In addition, an
    /// |utterance| is also passed back to accessibility, with a custom message
    /// to be spoken. The message is expected to be localized, matching the
    /// same locale that the UI component is displaying its content.
    /// If the utterance is empty, it is assumed that no spoken output is
    /// necessary to describe the result of the action.
    OnGesture(struct {
        gesture_type Type;
    }) -> (struct {
        handled bool;
        utterance string:<MAX_UTTERANCE_SIZE, optional>;
    });
};

/// An interface for registering a listener of accessibility gestures.
@discoverable
protocol ListenerRegistry {
    /// A UI registers itself to start listening for accessibility gestures
    /// through `listener`.
    /// Only one listener can be registered at a time.
    /// This registry honors the last Register() call, and a previous listener
    /// is closed.
    /// In case of any failure, the channel of the listener is closed with an
    /// epitaph.
    Register(resource struct {
        listener client_end:Listener;
    }) -> ();
};
