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

// This interface is implemented by a user shell. Dependencies are passed to it
// in Initialize() on startup. The user shell is also expected to implement
// Lifecycle in order to receive a Terminate() call on teardown.
//
// In one component instance there can only be one UserShell service instance.
// The ViewOwner request is sent to the separate ViewProvider service. This way,
// the user shell may be implemented as a flutter component.
//
// Teardown may be initiated by the user shell calling
// UserShellContext.Logout(), by the user runner being terminated, or by the
// system shutting down.
[Discoverable]  // Created by user shell components.
interface UserShell {
  1: Initialize(UserShellContext user_shell_context);
};

// This interface allows the |UserShell| to request capabilities from the
// |UserRunner| in a way that is more explicit about the services that are
// offered than a generic |ServiceProvider|.
interface UserShellContext {
  // 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);
  7: GetIntelligenceServices(request<IntelligenceServices> @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 device runner to tear down the
  // |UserRunner| instance of the user.
  16: Logout();
};

// User 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 DeviceShell and UserShell.
[Discoverable]  // Created by user shell components.
interface UserShellPresentationProvider {
  // 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);
};
