// Copyright 2018 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.ui.app;

using fuchsia.sys;

// NOTE: This is likely not the ViewProvider you are looking for!  This is
// the new ViewProvider interface that will be deprecating the old one soon.
// The old ViewProvider is in fuchsia.ui.viewsv1.ViewProvider.
// TODO(SCN-589): Remove this when old ViewProvider is deleted.
//
// ViewProvider is the standard mechanism for two modules to each obtain half
// of a shared eventpair token.  The shared token is a capability allowing the
// modules to ask Scenic to create a ViewHolder/View pair.  The resulting
// View and ViewHolder are linked together until either one is destroyed.
//
// Modules are free to use any other mechanism to agree upon the shared
// eventpair token, and use this to create the linked ViewHolder/View.
// ViewProvider is given for the convenience of clients that don't require
// a more complex implementation.
[Discoverable]
interface ViewProvider {
    // Creates a new View under the control of the ViewProvider.
    //
    // |token| is one half of the shared eventpair which will bind the new View
    // to its associated ViewHolder.  The ViewProvider will use |token| to
    // create its internal View representation.  The caller is expected to use
    // its half to create corresponding ViewHolder object.
    //
    // |incoming_services| allows clients to request services from the
    // ViewProvider implementation.  |outgoing_services| allows clients to
    // provide services of their own to the ViewProvider implementation.
    //
    // Clients can embed a ViewHolder (and by proxy the paired View) into their
    // scene graph by using |Node.AddChild()|.  The ViewHolder cannot itself
    // have any children. A ViewProvider implementation can nest scene objects
    // within its View by using |View.AddChild()|.  The View itself
    // cannot be a child of anything.
    //
    // Modules can use these mechanisms to establish a distributed,
    // inter-process scene graph.
    1: CreateView(handle<eventpair> token,
                  request<fuchsia.sys.ServiceProvider>? incoming_services,
                  fuchsia.sys.ServiceProvider? outgoing_services);
};