// 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.modular.auth;
using fuchsia.speech;
using fuchsia.ui.policy;
using fuchsia.ui.viewsv1token;


// 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]
interface SessionShell {
    // Displays the given story view. The story this view belongs to is
    // identified by |view_id.story_id|.
    AttachView(ViewIdentifier view_id, fuchsia.ui.viewsv1token.ViewOwner view_owner);

    // 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 to allow for future evolution of
// the identifier without changing the |SessionShell| API itself.
struct ViewIdentifier {
  string 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]
interface SessionShellContext {
    // The account associated with the currently logged-in user. It's NULL if
    // logged into GUEST mode.
    1: GetAccount() -> (fuchsia.modular.auth.Account? account);
    2: GetAgentProvider(request<AgentProvider> request);
    3: GetComponentContext(request<ComponentContext> request);
    4: GetDeviceName() -> (string device_name);
    5: GetFocusController(request<FocusController> request);
    6: GetFocusProvider(request<FocusProvider> request);
    8: GetLink(request<Link> request);
    9: GetPresentation(request<fuchsia.ui.policy.Presentation> request);
    10: GetSpeechToText(request<fuchsia.speech.SpeechToText> request);
    11: GetStoryProvider(request<StoryProvider> request);
    12: GetSuggestionProvider(request<SuggestionProvider> request);
    13: GetVisibleStoriesController(request<VisibleStoriesController> request);

    // Requests logout of the user. This causes the basemgr to tear down the
    // |Sessionmgr| instance of the user.
    16: Logout();
};

// Session shell provides this service to the framework which may plumb it to
// different subscribers, such as story shell and intelligence provider.
//
// EXPERIMENTAL Service that allows consumers of a given story to get a
// connection to a Presentation, and visual state services provided by the user
// shell. This allows story shell implementations to coordinate event and focus
// handling. An analog mechanism exists between BaseShell and SessionShell.
[Discoverable] // Created by session shell components.
interface SessionShellPresentationProvider {
    // When a StoryShell calls StoryShellContext.GetPresentation(), this request
    // arrives here.
    1: GetPresentation(string story_id, request<fuchsia.ui.policy.Presentation> request);

    // When a StoryShell calls StoryShellContext.WatchVisualState(), this request
    // arrives here.
    2: WatchVisualState(string story_id, StoryVisualStateWatcher watcher);
};
