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

/// An interface used to present graphical views.
///
/// The `GraphicalPresenter` protocol is typically implemented by a session component or
/// its child that presents element views.
///
/// The presented views can be annotated with `fuchsia.session.Annotations` to communicate
/// presentation properties to the `GraphicalPresenter`.
[Discoverable, Deprecated = "Use fuchsia.element.GraphicalPresenter"]
protocol GraphicalPresenter {
    /// Presents the view described by `view_spec`.
    ///
    /// ## ViewSpec
    ///
    /// `view_spec.view_holder_token` and `view_spec.view_ref` must be valid,
    /// otherwise `PresentView` will fail with `ViewControllerEpitaph.INVALID_VIEW_SPEC`.
    ///
    /// ## ViewController
    ///
    /// `view_controller_request` allows clients to receive a `ViewController` for the
    /// presented view. The client can use the `ViewController` to control the view's
    /// presentation and receive events.
    ///
    /// If `view_controller_request` is closed, the client can assume that the view is
    /// no longer being presented, and will not be presented in the future.
    ///
    /// If the client closes the `view_controller_request`, or does not provide a request
    /// to `PresentView`, the view may be dismissed at any time with no signal to the client.
    ///
    /// ## Errors
    ///
    /// `PresentView` errors are signaled by closing `view_controller_request`
    /// with an epitaph, `ViewControllerEpitaph`. See [`ViewController`].
    ///
    /// + `view_spec` describes the view to present
    /// + `view_controller_request` an optional request for a controller for the view
    PresentView(ViewSpec view_spec, request<ViewController>? view_controller_request);
};

/// Epitaph returned when `ViewController` is closed to signal an error.
[Deprecated = "Not applicable to fuchsia.element.GraphicalPresenter"]
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 description of a view that can be presented by a `GraphicalPresenter`.
[Deprecated = "Use fuchsia.element.ViewSpec"]
resource table ViewSpec {
    /// The view holder token for the presented view.
    1: fuchsia.ui.views.ViewHolderToken view_holder_token;

    /// The `ViewRef` of the presented view.
    2: fuchsia.ui.views.ViewRef view_ref;

    /// 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.
    3: Annotations annotations;
};

/// An interface that gives clients of `GraphicalPresenter` control over a view
/// that was presented.
///
/// ## Lifecycle
///
/// The client must keep `ViewController` connected to ensure the view is
/// presented. Once `ViewController` is closed, the view will be
/// permanently dismissed.
///
/// For example, if the view originates from an element, the component
/// that manages the element's lifecycle may choose to stop the element's
/// component once the `ViewController` is closed.
///
/// ## Epitaph
///
/// This protocol is closed with an epitaph:
///
/// * `ViewControllerEpitaph.INVALID_VIEW_SPEC` if the view failed to be
///   presented because of a malformed `ViewSpec`
///   (see [`GraphicalPresenter.PresentView`])
/// * `ViewControllerEpitaph.REJECTED` if the presenter rejected the request
///   to present the view (see [`GraphicalPresenter.PresentView`])
/// * `ViewControllerEpitaph.ZX_OK` when the view is dismissed
[Deprecated = "Use fuchsia.element.ViewController"]
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();
};
