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