// Copyright 2022 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.accessibility.scene;

using fuchsia.ui.views;

@discoverable
protocol Provider {
    /// Prompts the server (a11y manager) to create a new accessibility `View`,
    /// which the client (scene manager) must connect to the root of the scene
    /// graph.
    ///
    /// The accessibility view is used to vend capabilities to a11y manager
    /// that a view confers, e.g. ability to request focus, consume and
    /// respond to input events, annotate underlying views, and apply
    /// coordinate transforms to its subtree.
    ///
    /// With the a11y view, the scene topology is roughly:
    ///
    ///          scene root (owned by scene manager)
    ///               |
    ///         a11y viewport (owned by scene manager)
    ///               |
    ///           a11y view (owned by a11y manager)
    ///               |
    ///        proxy viewport (owned by a11y manager)
    ///               |
    ///          proxy view (owned by scene manager)
    ///               |
    ///        client viewport (owned by scene manager)
    ///               |
    ///          client view (owned by UI client)
    ///
    /// ARGS
    ///
    /// a11y_view_token: Token generated by scene manager, which a11y manager
    /// uses to create the a11y view in its flatland instance.
    ///
    /// proxy_viewport_token: Token generated by scene manager, which a11y manager
    /// uses to create a "proxy viewport" within the a11y view. The client must
    /// subsequently create a "proxy view" using the corresponding view creation
    /// token it generated.
    ///
    /// SYNCHRONIZATION
    ///
    /// Callers may safely proceed once the accessibility `ViewRef` is returned
    /// to the accessibility `ViewPort` holder.
    ///
    /// LIFECYCLE
    ///
    /// The client is free to close the channel any time after calling CreateView().
    ///
    /// EPITAPH
    ///
    /// This method may return the following epitaphs:
    ///
    /// - ZX_ERR_INVALID_ARGS, if either of the provided tokens is invalid.
    /// - ZX_ERR_PEER_CLOSED, if Scenic fails creating the accessibility `Viewport`.
    CreateView(resource struct {
        a11y_view_token fuchsia.ui.views.ViewCreationToken;
        proxy_viewport_token fuchsia.ui.views.ViewportCreationToken;
    });
};
