| // Copyright 2017 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.modular; |
| |
| using fuchsia.ui.policy; |
| using fuchsia.ui.views; |
| |
| /// This interface is implemented by a story shell. Dependencies are passed to it |
| /// in Initialize() on startup. The story shell is also expected to implement |
| /// Lifecycle in order to receive a Terminate() call on teardown. |
| /// |
| /// In one component instance there can only be one StoryShell service instance. |
| /// The view token is sent to the separate View service. This way, the story |
| /// shell may be implemented as a flutter component. |
| /// |
| /// Teardown may occur via the session shell calling StoryController.Stop(), the |
| /// sessionmgr being terminated, or by the system shutting down. |
| [Discoverable] // Created by story shell applications. |
| protocol StoryShell { |
| Initialize(StoryShellContext story_shell_context); |
| |
| /// Adds a new Surface and its corresponding view to be displayed by the |
| /// StoryShell. More context that allows the story shell to decide how |
| /// to layout will be added later. Also, interface to influence life cycle and |
| /// focus is obviously missing. |
| /// `view_connection` the new view and the associated Surface ID. |
| /// `surface_info` metadata relating to the Surface. |
| [Transitional = "Implement AddSurface3 instead"] |
| AddSurface(ViewConnection view_connection, SurfaceInfo surface_info); |
| /// DEPRECATED. For transition purposes only. |
| [Transitional = "Implement AddSurface3 instead"] |
| AddSurface2(ViewConnection2 view_connection, SurfaceInfo surface_info); |
| /// For transition purposes only. |
| [Transitional = "Only implement while AddSurface is transitional"] |
| AddSurface3(ViewConnection view_connection, SurfaceInfo2 surface_info); |
| |
| /// Focuses the surface with surface_id, bringing it to the foreground. |
| FocusSurface(string surface_id); |
| |
| /// Defocuses the surface with surface_id, dismissing it to the background. |
| DefocusSurface(string surface_id) -> (); |
| |
| /// Adds a container, with corresponding container layouts to the story. |
| /// Optionally provide a parent_id to connect to, if omitted adds the |
| /// Container node as the root of a new tree in the Story |
| /// DEPRECATED |
| [Transitional] |
| AddContainer(string containerName, string? parentId, |
| SurfaceRelation relation, // relation of container to parent |
| vector<ContainerLayout> layout, |
| vector<ContainerRelationEntry> relationships, |
| vector<ContainerView> views); |
| /// DEPRECATED. For transition purposes only. |
| [Transitional] |
| AddContainer2(string containerName, string? parentId, |
| SurfaceRelation relation, // relation of container to parent |
| vector<ContainerLayout> layout, |
| vector<ContainerRelationEntry> relationships, |
| vector<ContainerView2> views); |
| |
| /// Notify when a Surface is focused in the story. The focus could be from |
| /// a user interaction or requested by the framework through |
| /// StoryController#FocusModule. |
| /// EXPERIMENTAL |
| -> OnSurfaceFocused(string surface_id); |
| |
| /// Remove the Surface with surface_id from the StoryShell entirely. This is |
| /// final. The Surface is removed from the graph. If necessary, the |
| /// associated Surface is defocused. There is no expectation that |
| /// DefocusSurface is called before this. |
| RemoveSurface(string surface_id); |
| |
| /// Reconnect the view in viewConnection. |
| /// |
| /// Called to reconnect views that have previously been added to the story |
| /// shell via addSurface, and then disconnected. A ViewTokenPair is created |
| /// and the View token is given to the child view. The ViewHolder token |
| /// is notified if the View is destroyed before it is connected. Once the |
| /// ViewHolder has been created using a Scenic `Session`, the Session will be |
| /// notified when the view is available, if it becomes unavailable, or if |
| /// it is disconnected. |
| /// If a surface with a disconnected view is to be shown again, ReconnectView |
| /// is called. |
| /// |
| /// E.g. called in response to StoryShell calling RequestView(). |
| [Transitional] |
| ReconnectView(ViewConnection view_connection); |
| /// DEPRECATED. For transition purposes only. |
| [Transitional] |
| ReconnectView2(ViewConnection2 view_connection); |
| |
| /// Update the surface |
| /// This is called when the intent is to update the surface metadata in the |
| /// story graph in place. Any fields, except for the surface_id can be |
| /// updated. If no value or null is passed for a field it remains unchanged. |
| /// This includes the `view_holder_token` inside the connection. |
| /// |
| /// E.g called when an intent resolves to a module that is known by the |
| /// caller to already be running, to update associated metadata. |
| [Transitional = "Implement UpdateSurface3 instead"] |
| UpdateSurface(ViewConnection view_connection, SurfaceInfo surface_info); |
| /// DEPRECATED. For transition purposes only. |
| [Transitional = "Implement UpdateSurface3 instead"] |
| UpdateSurface2(ViewConnection2 view_connection, SurfaceInfo surface_info); |
| /// For transition purposes only. |
| [Transitional = "Only implement while UpdateSurface is transitional"] |
| UpdateSurface3(ViewConnection view_connection, SurfaceInfo2 surface_info); |
| }; |
| |
| /// A pair mapping a surface ID to a view (via `view_holder_token`). |
| struct ViewConnection { |
| /// The ID for the surface |
| string surface_id; |
| |
| /// Token for embedding the new view corresponding to the surface. |
| fuchsia.ui.views.ViewHolderToken view_holder_token; |
| }; |
| |
| /// DEPRECATED, for transition purposes only. |
| struct ViewConnection2 { |
| /// The ID for the surface |
| string surface_id; |
| |
| /// Token for embedding the new view corresponding to the surface. |
| fuchsia.ui.views.ViewHolderToken view_holder_token; |
| }; |
| |
| /// Contains metadata for a Surface. |
| struct SurfaceInfo { |
| /// ID of the view that is parent of this Surface. |
| string parent_id; |
| |
| /// The relationship between the parent Surface and this new Surface. Used |
| /// for layout optimization. |
| SurfaceRelation? surface_relation; |
| |
| /// Information about the module populates the view. |
| ModuleManifest? module_manifest; |
| |
| /// How the Surface was generated. By an action internal to the story or by |
| /// an external action. |
| ModuleSource module_source; |
| }; |
| |
| /// Contains metadata for a Surface. |
| table SurfaceInfo2 { |
| /// ID of the view that is parent of this Surface. |
| 1: string parent_id; |
| |
| /// The relationship between the parent Surface and this new Surface. Used |
| /// for layout optimization. |
| 2: SurfaceRelation surface_relation; |
| |
| /// Information about the module populates the view. |
| 3: ModuleManifest module_manifest; |
| |
| /// How the Surface was generated. By an action internal to the story or by |
| /// an external action. |
| 4: ModuleSource module_source; |
| }; |
| |
| struct ContainerView { |
| /// Name by which this container node is referenced in container layout and |
| /// surface relationship specifications (cf. container.fidl) |
| string node_name; |
| |
| /// Token for embedding the new view. The view is resolved from the intent |
| /// corresponding to `node_name`. |
| fuchsia.ui.views.ViewHolderToken view_holder_token; |
| }; |
| |
| /// DEPRECATED, for transition purposes only. |
| struct ContainerView2 { |
| /// Name by which this container node is referenced in container layout and |
| /// surface relationship specifications (cf. container.fidl) |
| string node_name; |
| |
| /// Token for embedding the new view. The view is resolved from the intent |
| /// corresponding to `node_name`. |
| fuchsia.ui.views.ViewHolderToken view_holder_token; |
| }; |
| |
| /// This interface provides the StoryShell instance with everything it needs to |
| /// know or be able to do about the Story. Not much right now, but we expect this |
| /// to increase. |
| protocol StoryShellContext { |
| /// Requests a Presentation connection from the SessionShell. See |
| /// SessionShellPresenationProvider in session_shell.fidl. |
| GetPresentation(request<fuchsia.ui.policy.Presentation> request); |
| |
| /// Starts watching Story shell's visual state. |
| WatchVisualState(StoryVisualStateWatcher watcher); |
| |
| /// Gets a Link instance that the story shell can use for persisting metadata. |
| GetLink(request<Link> request); |
| |
| /// Requests a view for a Surface. |
| /// Requests that a view for `surface_id` is provided through |
| /// StoryShell.ReconnectView(). |
| RequestView(string surface_id); |
| |
| /// Notification that the Surface is no longer on screen. |
| OnSurfaceOffScreen(string surface_id); |
| }; |
| |
| /// Implemented by StoryShell to get notified about visual state changes. |
| protocol StoryVisualStateWatcher { |
| OnVisualStateChange(StoryVisualState visual_state); |
| }; |
| |
| /// Defines the visual state of the Story shell. |
| enum StoryVisualState { |
| MINIMIZED = 0; |
| MAXIMIZED = 1; |
| MAXIMIZED_OVERLAYED = 2; |
| }; |