blob: c96304ec6bf3f9a248e05e4f424a54667dce1faf [file] [log] [blame]
// 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;
};