// Copyright 2016 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 session shell and is used by the
/// sessionmgr to hand to the session shell views of stories, or to notify that
/// the view of a story is about to be closed.
[Discoverable]
protocol SessionShell {
    /// Displays the given story view. The story this view belongs to is
    /// identified by `view_id.story_id`.
    /// DEPRECATED.  For transitional purposes only.
    [Transitional]
    AttachView(ViewIdentifier view_id, fuchsia.ui.views.ViewHolderToken view_holder_token);
    [Transitional]
    AttachView2(ViewIdentifier view_id, fuchsia.ui.views.ViewHolderToken view_holder_token);

    /// Instructs the session shell to detach the view identified by `view_id`
    /// that was previously provided by AttachView() from the UI of the session
    /// shell. The view will be closed soon after DetachView() returns, or when a
    /// timeout is reached.
    ///
    /// It is customary for the session shell to display a placeholder before a
    /// view is attached for a given view identifier, or after it was detached.
    ///
    /// If the story identified by `view_id.story_id` is about to be deleted, the
    /// Shell will observe a call to StoryProviderWatcher.OnDelete() sometime
    /// after DetachView() returns.
    ///
    /// If the session for which this session shell is responsible for is being
    /// terminated, or the session shell is stopped because it's replaced by
    /// another session shell, DetachView() will *not* be called at all, and the
    /// shell will rather observe a call to Lifecycle.Terminate().
    DetachView(ViewIdentifier view_id) -> ();
};

/// Identifies a view provided to a session shell. The values of the `story_id`
/// field match those used in the `StoryProvider` interface, allowing
/// identification of the same story across interfaces.
///
/// This is a struct rather than a naked string:MAX to allow for future evolution of
/// the identifier without changing the `SessionShell` API itself.
struct ViewIdentifier {
    string:MAX story_id;
};

/// This interface allows a `SessionShell` to request capabilities from its
/// creator in a way that is more explicit about the services that are
/// offered than a generic `ServiceProvider`.
[Discoverable]
protocol SessionShellContext {
    GetComponentContext(request<ComponentContext> request);
    GetPresentation(request<fuchsia.ui.policy.Presentation> request);
    GetStoryProvider(request<StoryProvider> request);

    /// Restarts the session.
    Restart();

    /// Deprecated: Equivalent to Restart().
    [Transitional]
    Logout();
};
