| // 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] |
| AddSurface(ViewConnection view_connection, SurfaceInfo surface_info); |
| // DEPRECATED. For transition purposes only. |
| [Transitional] |
| AddSurface2(ViewConnection2 view_connection, SurfaceInfo 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] |
| UpdateSurface(ViewConnection view_connection, SurfaceInfo surface_info); |
| // DEPRECATED. For transition purposes only. |
| [Transitional] |
| UpdateSurface2(ViewConnection2 view_connection, SurfaceInfo 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; |
| }; |
| |
| // Contain 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; |
| }; |
| |
| // Maps the node_name to the specific scenic view resulting from resolving and |
| // launching the intent specified in a Container node. |
| 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; |
| }; |