// 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(resource struct {
        view_id ViewIdentifier;
        view_holder_token fuchsia.ui.views.ViewHolderToken;
    });
    @transitional
    AttachView2(resource struct {
        view_id ViewIdentifier;
        view_holder_token fuchsia.ui.views.ViewHolderToken;
    });

    /// 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(struct {
        view_id ViewIdentifier;
    }) -> ();
};

/// 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.
type ViewIdentifier = struct {
    story_id string:MAX;
};

/// 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(resource struct {
        request server_end:ComponentContext;
    });
    GetPresentation(resource struct {
        request server_end:fuchsia.ui.policy.Presentation;
    });
    GetStoryProvider(resource struct {
        request server_end:StoryProvider;
    });

    /// Restarts the session.
    Restart();

    /// Deprecated: Equivalent to Restart().
    @transitional
    Logout();
};
