blob: 144c78ba7921d1877021fc570c097f940f320d2e [file] [log] [blame]
// Copyright 2022 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.
#ifndef SRC_EMBEDDER_FLATLAND_VIEW_PROVIDER_H_
#define SRC_EMBEDDER_FLATLAND_VIEW_PROVIDER_H_
#include <fuchsia/ui/app/cpp/fidl.h>
#include <lib/syslog/global.h>
#include <lib/ui/scenic/cpp/view_identity.h>
#include <lib/ui/scenic/cpp/view_ref_pair.h>
#include <memory>
#include "logging.h"
#include "src/embedder/engine/embedder.h"
#include "src/embedder/flatland_connection.h"
#include "src/embedder/flatland_ids.h"
#include "src/embedder/logging.h"
namespace embedder {
/// Implements ViewProvider by using Flatland to create a view.
class FlatlandViewProvider final : public fuchsia::ui::app::ViewProvider {
public:
using PixelRatioCallback = std::function<void(float)>;
FlatlandViewProvider(FlatlandConnection* flatland_connection, scenic::ViewRefPair view_ref_pair,
fuchsia::ui::composition::ViewBoundProtocols flatland_view_protocols)
: flatland_connection_(flatland_connection),
flatland_view_protocols_(std::move(flatland_view_protocols)) {
view_identity_ = {.view_ref = std::move(view_ref_pair.view_ref),
.view_ref_control = std::move(view_ref_pair.control_ref)};
pixel_ratio_callback_ = [](float) {};
}
~FlatlandViewProvider() override {}
FlatlandViewProvider(const FlatlandViewProvider&) = delete;
FlatlandViewProvider& operator=(const FlatlandViewProvider&) = delete;
void CreateView(zx::eventpair token,
fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) override {
FX_LOG(ERROR, kLogTag, "ViewProvider::CreateView not implemented.");
}
void CreateViewWithViewRef(zx::eventpair view_token,
fuchsia::ui::views::ViewRefControl control_ref,
fuchsia::ui::views::ViewRef view_ref) override {
FX_LOG(ERROR, kLogTag, "ViewProvider::CreateViewWithViewRef not implemented.");
}
void CreateView2(fuchsia::ui::app::CreateView2Args view_args) override {
auto* flatland = flatland_connection_->flatland();
flatland->CreateView2(
std::move(*view_args.mutable_view_creation_token()), std::move(view_identity_),
std::move(flatland_view_protocols_) /* protocols */, parent_viewport_watcher_.NewRequest());
flatland->CreateTransform({kRootTransformId});
flatland->SetRootTransform({kRootTransformId});
parent_viewport_watcher_->GetLayout(fit::bind_member(this, &FlatlandViewProvider::OnGetLayout));
}
void OnGetLayout(fuchsia::ui::composition::LayoutInfo info) {
if (info.has_device_pixel_ratio()) {
pixel_ratio_callback_(info.device_pixel_ratio().x);
}
parent_viewport_watcher_->GetLayout(fit::bind_member(this, &FlatlandViewProvider::OnGetLayout));
}
void SetPixelRatioCallback(PixelRatioCallback callback) { pixel_ratio_callback_ = callback; }
private:
FlatlandConnection* flatland_connection_ = nullptr;
fuchsia::ui::composition::ViewBoundProtocols flatland_view_protocols_;
fuchsia::ui::views::ViewIdentityOnCreation view_identity_;
fuchsia::ui::composition::ParentViewportWatcherPtr parent_viewport_watcher_;
PixelRatioCallback pixel_ratio_callback_;
};
} // namespace embedder
#endif // SRC_EMBEDDER_FLATLAND_VIEW_PROVIDER_H_