// 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.session;

using fuchsia.ui.views;

/// A `GraphicalPresenter` organizes and presents graphical views.
///
/// The presented views can be annotated with `fuchsia.session.Annotations` to communicate
/// presentation properties to the `GraphicalPresenter`.
///
/// The `GraphicalPresenter` protocol is used, for example, when a session component written
/// in Rust wants to delegate presenting element views to a child component written in
/// Flutter.
///
/// For example, a session component that manages the lifecycle of elements may delegate
/// presentation of element views to a different child component that implements
/// `GraphicalPresenter`.
[Discoverable]
protocol GraphicalPresenter {
    /// Presents the view described by `view_spec`.
    ///
    /// `view_controller_request` allows clients to control aspects of the presented view.
    /// If the `view_controller_request` is closed by the `GraphicalPresenter`, the client
    /// can assume that the view is no longer being presented.
    ///
    /// If the client closes the `view_controller_request`, or there is no request, the
    /// `GraphicalPresenter` may dismiss the view at any time with no signal to the
    /// client.
    ///
    /// The client is notified of view events via the `ViewController`.
    PresentView(ViewSpec view_spec, request<ViewController>? view_controller_request);
};

/// Errors returned by `GraphicalPresenter.PresentView`.
enum ViewControllerEpitaph {
    /// The provided `ViewSpec` was missing a valid `ViewHolderToken`.
    INVALID_VIEW_SPEC = 1;
    /// The presenter rejected the request to present the view.
    REJECTED = 2;
};

/// A `ViewSpec` contains all the information `GraphicalPresenter` needs to present a view.
table ViewSpec {
    /// The view holder token for the presented view.
    /// Required.
    1: fuchsia.ui.views.ViewHolderToken view_holder_token;

    /// The annotations associated with the presented view.
    ///
    /// The presenter must observe incoming annotations and update the presentation
    /// accordingly.
    ///
    /// For views that come from elements, the annotations are expected to be the same
    /// as the annotations for the element. For example, if the `GraphicalPresenter`
    /// component uses `ElementManager` to add an element to the session, and gives it
    /// an annotation, the presenter can expect that annotation to be passed back in
    /// `ViewSpec.annotations` for the associated view.
    ///
    /// Optional.
    2: Annotations annotations;
};

/// A `ViewController` gives clients of `GraphicalPresenter` control over the views
/// they present.
///
/// EPITAPH
///
/// This interface uses a FIDL epitaph to indicate that the view:
/// - failed to be presented: `INVALID_VIEW_SPEC`
/// - presentation was rejected: `REJECTED`
/// - view was dismissed: `ZX_OK`
protocol ViewController {
    /// Annotates the view with `annotations`.
    /// The presenter must observe incoming annotation requests and update
    /// the presentation accordingly.
    ///
    /// The presenter must adhere to the following rules for annotation updates:
    /// - Annotations are added when their `Annotation.key` was not present in a previous
    ///   set of annotations.
    /// - Annotations are updated when their `Annotation.value` is non-null.
    /// - Annotations are deleted when their `Annotation.value` is null.
    ///
    /// When the `Annotate` call returns, clients can assume that annotations have
    /// been updated and incorporated into the presentation.
    Annotate(Annotations annotations) -> ();

    /// Instructs the presenter to dismiss the associated view.
    ///
    /// This call results in the `ViewController` being closed with a
    /// `ZX_OK` epitaph once any exit animation has been performed, the
    /// view/view holder connection has been severed, and the component
    /// instance serving the view can be terminated.
    Dismiss();

    /// Informs the view controller that the view was presented successfully.
    -> OnPresented();
};
