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

#include "src/ui/examples/embedder/example_view_provider_service.h"

#include <lib/ui/scenic/cpp/view_token_pair.h>

#include "src/lib/fxl/logging.h"

namespace embedder {

ExampleViewProviderService::ExampleViewProviderService(sys::ComponentContext* component_ctx,
                                                       ViewFactory factory)
    : component_ctx_(component_ctx), view_factory_fn_(std::move(factory)) {
  FX_DCHECK(component_ctx_);

  component_ctx->outgoing()->AddPublicService<fuchsia::ui::app::ViewProvider>(
      [this](fidl::InterfaceRequest<fuchsia::ui::app::ViewProvider> request) {
        bindings_.AddBinding(this, std::move(request));
      },
      "view_provider");
}

ExampleViewProviderService::~ExampleViewProviderService() {
  component_ctx_->outgoing()->RemovePublicService<fuchsia::ui::app::ViewProvider>();
}

void ExampleViewProviderService::CreateView(
    zx::eventpair token, fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
    fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) {
  // Services in CreateView() API are from the client's perspective.
  // Services in the ViewContext are from the view's perspective.
  ViewContext view_ctx{
      .component_context = component_ctx_,
      .token = scenic::ToViewToken(std::move(token)),
      .incoming_services = std::move(outgoing_services),
      .outgoing_services = std::move(incoming_services),
  };
  view_factory_fn_(std::move(view_ctx));
}

}  // namespace embedder
