// 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.ui.app;

using fuchsia.sys;
using fuchsia.ui.views;
using zx;

/// ViewProvider is the standard mechanism for two modules to each obtain half
/// of a shared eventpair token.  The shared token is a capability allowing the
/// modules to ask Scenic to create a ViewHolder/View pair.  The resulting
/// View and ViewHolder are linked together until either one is destroyed.
///
/// Modules are free to use any other mechanism to agree upon the shared
/// eventpair token, and use this to create the linked ViewHolder/View.
/// ViewProvider is given for the convenience of clients that don't require
/// a more complex implementation.
[Discoverable]
protocol ViewProvider {
    /// Creates a new View under the control of the ViewProvider.
    ///
    /// `token` is one half of the shared eventpair which will bind the new View
    /// to its associated ViewHolder.  The ViewProvider will use `token` to
    /// create its internal View representation.  The caller is expected to use
    /// its half to create corresponding ViewHolder object.
    ///
    /// `incoming_services` allows clients to request services from the
    /// ViewProvider implementation.  `outgoing_services` allows clients to
    /// provide services of their own to the ViewProvider implementation.
    ///
    /// Clients can embed a ViewHolder (and by proxy the paired View) into their
    /// scene graph by using `Node.AddChild()`.  The ViewHolder cannot itself
    /// have any children. A ViewProvider implementation can nest scene objects
    /// within its View by using `View.AddChild()`.  The View itself
    /// cannot be a child of anything.
    ///
    /// Modules can use these mechanisms to establish a distributed,
    /// inter-process scene graph.
    CreateView(zx.handle:EVENTPAIR token,
               request<fuchsia.sys.ServiceProvider>? incoming_services,
               fuchsia.sys.ServiceProvider? outgoing_services);

    /// Creates a new View under the control of the ViewProvider.
    ///
    /// `token` is one half of the shared eventpair which will bind the new View
    /// to its associated ViewHolder.  The ViewProvider will use `token` to
    /// create its internal View representation.  The caller is expected to use
    /// its half to create corresponding ViewHolder object.
    ///
    /// `view_ref_control` and `view_ref` are two typed handles to each half of the
    /// same event pair. The `view_ref` can be cloned before passing it to this method,
    /// which will allow clients to track the view (e.g., in a focus chain update).
    ///
    /// `view_ref_control` must not have the ZX_RIGHT_DUPLICATE set, or view creation
    /// will fail.
    [Transitional]
    CreateViewWithViewRef(zx.handle:EVENTPAIR token,
                          fuchsia.ui.views.ViewRefControl view_ref_control,
                          fuchsia.ui.views.ViewRef view_ref);
};
