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

// The basemgr application (there is no |Basemgr| service) requests
// an instance of this service in order to launch and display a |Sessionmgr|.
[Discoverable] // Created by sessionmgr application.
protocol Sessionmgr {
    // Launches a sessionmgr instance identified by a unique device-local
    // |session_id|. The uniqueness of |session_id| must be guaranteed by the
    // caller, because |sessionmgr| creates an Environment namespace with the
    // given |session_id|, and this will crash if we try to create an
    // environment with a pre-existing name, because the services sessionmgr
    // tries to access won't be available.
    //
    // TODO(MF-287): Address issues around client-generated session_id and
    // initialization pattern of sessionmgr.
    Initialize(string session_id,
               fuchsia.modular.auth.Account? account,
               fuchsia.modular.AppConfig session_shell,
               fuchsia.modular.AppConfig story_shell,
               bool use_session_shell_for_story_shell_factory,
               fuchsia.auth.TokenManager? ledger_token_manager,
               fuchsia.auth.TokenManager? agent_token_manager,
               SessionContext session_context,
               fuchsia.ui.views.ViewToken view_token);

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

// This interface is provided by basemgr to |Sessionmgr|.
protocol SessionContext {
    // See detailed comments in SessionShellContext.Logout(). Logs out all the
    // users in this session, then shut down the sessionmgr process.
    Logout();

    // Shut down the sessionmgr process. This method should be called if the
    // users of the session should remain logged in. Call Logout() if the intent
    // is to also log out the users from the session.
    Shutdown();

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