// 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
closed 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.
    strict AttachView(resource struct {
        view_id ViewIdentifier;
        view_holder_token fuchsia.ui.views.ViewHolderToken;
    });
    strict AttachView2(resource struct {
        view_id ViewIdentifier;
        view_holder_token fuchsia.ui.views.ViewHolderToken;
    });
    @available(added=9)
    strict AttachView3(resource struct {
        view_id ViewIdentifier;
        viewport_creation_token fuchsia.ui.views.ViewportCreationToken;
    });

    /// 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().
    strict 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
closed protocol SessionShellContext {
    strict GetComponentContext(resource struct {
        request server_end:ComponentContext;
    });

    strict GetPresentation(resource struct {
        @available(deprecated=10, note="implementation deleted")
        request server_end:fuchsia.ui.policy.Presentation;
    });

    strict GetStoryProvider(resource struct {
        request server_end:StoryProvider;
    });

    /// Restarts the session.
    strict Restart();

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