|  | // 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(); | 
|  | }; |