// 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.internal;

using fuchsia.auth;
using fuchsia.modular;
using fuchsia.modular.auth;
using fuchsia.ui.policy;
using fuchsia.ui.viewsv1token;

// The basemgr application (there is no |Basemgr| service) requests
// an instance of this service in order to launch and display a |Sessionmgr| per
// user.
// TODO(alexmin): Re-word this bit once the Sessionmgr implementation is landed.
[Discoverable] // Created by sessionmgr application.
interface Sessionmgr {
    // Launches a sessionmgr instance for a user identified by |user_id| and
    // specific TokenManager handles for ledger and agent_runner.
    // TODO(alhaad): Fold paramters into |UserContext|.
    1: Initialize(fuchsia.modular.auth.Account? account,
                  fuchsia.modular.AppConfig session_shell,
                  fuchsia.modular.AppConfig story_shell,
                  fuchsia.auth.TokenManager? ledger_token_manager,
                  fuchsia.auth.TokenManager? agent_token_manager,
                  UserContext user_context,
                  request<fuchsia.ui.viewsv1token.ViewOwner>? view_owner);

    2: SwapSessionShell(fuchsia.modular.AppConfig session_shell) -> ();
};

// This interface is provided by basemgr to |Sessionmgr|.
interface UserContext {
    // See detailed comments in SessionShellContext.Logout().
    1: Logout();

    2: GetPresentation(request<fuchsia.ui.policy.Presentation> presentation);
};
