// Copyright 2019 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.views;

/// A View is an interface that a component implements to offer Scenic view(s)
/// to its clients.
///
/// A Scenic view contains a tree of Scenic graph nodes which is used to render
/// a graphical user interface, such as a module, shell, or on-screen keyboard.
/// Other Scenic views can be embedded within this tree of nodes.  This creates
/// a scene graph describing the UI of the entire system, rooted at the
/// top-most view.  Different processes can contribute branches to the scene
/// graph, and their content will be rendered together in a shared space.
///
/// # Offering a View
///
/// A component that wishes to offer a `View` can do so in one of two ways:
///
/// 1. Expose a `View` interface as a service. This is usually done by components
///    that provide a single view, or have a clearly defined "main" view.
///    In this case, the component may obtain relevant properties for configuring
///    the view using services that may be available in its namespace, such as:
///    - `fuchsia.intl.PropertyProvider`
///    - `fuchsia.accessibility.PropertyProvider`
///
/// 2. Offer a domain-specific interface that provides `View`s using a
///    `request<View>` parameter.  In this case, the component may obtain relevant
///    properties for configuring the view using services that may be provided by its
///    client as part of the request.
///
///    For example, an encyclopedia component might offer a method to expose article views:
///
///      GetArticleView(string article_id,
///                     fuchsia.intl.PropertyProvider intl_properties,
///                     fuchsia.accessibility.PropertyProvider accessibility_properties,
///                     request<View> view_request);
///
///    This latter case is probably less common, as controlling domain-specific
///    views tends to be the job of the component that creates them.
///
/// # Presenting a View
///
/// A client of the `View` interface will:
///
/// 1. Launch (or bind to) the component that provides the interface.
/// 2. Connect to the component's `View` interface.
/// 3. Call `Present()` to give the `View` an attachment point into the scene graph
///    via the `view_token`.  Subsequent calls to `Present()` will generate an error
///    and cause the connection to be closed.
///
/// When the client no longer needs the View, it should disconnect from the
/// interface.
///
/// NOTE: The client owns the `View` instance and must retain it for the
/// lifetime of the UI that it displays. If the `View` instance is destroyed,
/// the connection will be dropped and all UI content will be destroyed.
///
/// # Implementing a View
///
/// On the implementation side, a component that exposes the `View` interface
/// has the following responsibilities:
///
/// * When `Present()` is called, create a root for the `View`'s content in the
///   Scenic scene graph by passing the provided `view_token`.
/// * Provide graphical content for the view and attach it to the root.
/// * Adjust the appearance and/or contents of the view's content based on
///   relevant internationalization and/or accessibility properties as described
///   above.
/// * Handle user interface events such as touches, key presses, and
///   `fuchsia.ui.gfx.ViewProperty` changes using other Scenic interfaces such
///   as `fuchsia.ui.Scenic` and `fuchsia.ui.SessionListener`.
///
/// See also: `fuchsia.intl.PropertyProvider`, `fuchsia.accessibility.PropertyProvider`.
///
/// TODO(SCN-1198): Migrate all implementations of `ViewProvider` to use `View`.
[Discoverable]
protocol View {

    /// Provides the View with an attachment point to Scenic's scene graph.
    ///
    /// When `Present()` is called the View's implementation should create a
    /// View resource within Scenic by providing it with the `view_token` (using
    /// a `fuchsia.ui.gfx.CreateResourceCmd` and `fuchsia.ui.gfx.ViewArgs`).
    ///
    /// Then the implementation should attach its graphical content to the
    /// newly-created View resource using a `fuchsia.ui.gfx.AddChildCmd`.
    ///
    /// If the implementation already owns a View resource (because `Present()`
    /// had already been called before), then it should terminate the connection
    /// with an error.
    ///
    /// TODO(SCN-1271): Allow re-parenting `View`s with a new `Present()` call.
    [Transitional]
    Present(ViewToken view_token);
};
