// Copyright 2021 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.session.scene;

using fuchsia.ui.app;
using fuchsia.ui.views;

/// A protocol used to manage the scene graph of the session.
///
/// This protocol is exposed by the `scene_manager` component. The `scene_manager`
/// component configures and constructs a scene graph in Scenic. A product may
/// use the `scene_manager` to reduce Scenic-related configuration code in their session.
@discoverable
protocol Manager {
    /// Sets the root view of the scene graph to the view provided by `view_provider`.
    ///
    /// Subsequent calls will replace the view tree with the one starting at the new root view.
    /// The root view is shared between all clients of `Manager`.
    ///
    /// Returns a `fuchsia.ui.views.ViewRef` referencing the view provided by `view_provider`.
    /// If this ViewRef cannot be returned (e.g. in Flatland case, if the ViewCreationToken is
    /// dropped before it is given to Scenic), then the connection to the `Manager` will be closed.
    ///
    /// NOTE: the ViewRef is only returned after the child view is connected to the scene graph.
    /// Therefore, the caller must guarantee that the child view will eventually be connected before
    /// waiting for the ViewRef; if the child view doesn't connect, it is possible to deadlock.
    SetRootView(resource struct {
        view_provider client_end:fuchsia.ui.app.ViewProvider;
    }) -> (resource struct {
        view_ref fuchsia.ui.views.ViewRef;
    });
};
