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

/// Sessionmgr passes a connection to this service to the SessionShell so it can
/// operate on stories for the user.
///
/// Closing a `StoryProvider` connection has no effect on the state of the
/// framework.
@discoverable
closed protocol StoryProvider {
    /// Returns a list of existing stories. If `watcher` is provided, the client will
    /// be notified of story changes (new stories, deleted stories, runtime
    /// state changes).
    strict GetStories(resource struct {
        watcher client_end:<StoryProviderWatcher, optional>;
    }) -> (struct {
        story_infos vector<StoryInfo>:MAX;
    });
    /// For transition purposes only.
    strict GetStories2(resource struct {
        watcher client_end:<StoryProviderWatcher, optional>;
    }) -> (resource struct {
        story_infos vector<StoryInfo2>:MAX;
    });

    /// Requests detailed information about the given story. If the story doesn't
    /// exist, returns null.
    strict GetStoryInfo(struct {
        story_id string:MAX;
    }) -> (struct {
        story_info box<StoryInfo>;
    });
    /// For transition purposes only.
    strict GetStoryInfo2(struct {
        story_id string:MAX;
    }) -> (resource struct {
        story_info StoryInfo2;
    });

    /// Obtains a controller for a previously created story identified by its story
    /// ID. Obtaining the controller doesn't run it yet. If the story doesn't
    /// exist, the interface request is closed.
    strict GetController(resource struct {
        story_id string:MAX;
        request server_end:StoryController;
    });

    /// Registers a watcher for changes in the story collection.
    /// DEPRECATED: In favor of GetStories().
    strict Watch(resource struct {
        watcher client_end:StoryProviderWatcher;
    });
};

/// Implemented by clients of StoryProvider.
closed protocol StoryProviderWatcher {
    /// Called in three different situations:
    ///
    ///  * Immediately when a new watcher is registered with one OnChange()
    ///    invocation with the current infor and state of each story known on the
    ///    current device.
    ///
    ///  * Every time a change to StoryInfo is applied to the record of the story.
    ///
    ///  * Every time the StoryState of the story changes.
    ///
    /// The ID of the story the notifications are about are part of StoryInfo.
    ///
    /// `story_state` is STOPPED if the story was just created or just became known
    /// on this device and was not yet started on the current device. It's RUNNING
    /// when the story is started on the current device.
    ///
    /// `story_visibility_state` is deprecated and will always have a value of DEFAULT.
    strict OnChange(struct {
        story_info StoryInfo;
        story_state StoryState;
        story_visibility_state StoryVisibilityState;
    });
    /// For transition purposes only.
    strict OnChange2(resource struct {
        story_info StoryInfo2;
        story_state StoryState;
        story_visibility_state StoryVisibilityState;
    });

    /// Called when a story record is permanently deleted. The deletion could
    /// have originated on this or on another device.
    ///
    /// If the story is running on this device at the time it is deleted,
    /// OnChange() will not be called first.
    strict OnDelete(struct {
        story_id string:MAX;
    });
};

// Deprecated.
type StoryVisibilityState = strict enum {
    DEFAULT = 1;
    IMMERSIVE = 2;
};
