blob: e0d7281abbee18c1ec6b036e9d44817b3d9d8580 [file] [log] [blame]
// 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.
#ifndef GARNET_BIN_DEVELOPER_TILES_TILES_H_
#define GARNET_BIN_DEVELOPER_TILES_TILES_H_
#include <fuchsia/developer/tiles/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <fuchsia/ui/app/cpp/fidl.h>
#include <fuchsia/ui/viewsv1/cpp/fidl.h>
#include <zx/eventpair.h>
#include "lib/component/cpp/startup_context.h"
#include "lib/svc/cpp/service_provider_bridge.h"
#include "lib/ui/scenic/cpp/resources.h"
#include "lib/ui/scenic/cpp/session.h"
namespace tiles {
class Tiles : public fuchsia::ui::viewsv1::ViewListener,
public fuchsia::ui::viewsv1::ViewContainerListener,
public fuchsia::developer::tiles::Controller {
public:
Tiles(component::StartupContext* startup_context,
zx::eventpair root_view_token, std::vector<std::string> urls,
int border);
~Tiles() final = default;
private:
struct ViewData {
explicit ViewData(const std::string& url, uint32_t key,
fuchsia::sys::ComponentControllerPtr controller,
scenic::Session* session, bool allow_focus);
~ViewData();
const std::string url;
const uint32_t key;
bool allow_focus;
fuchsia::sys::ComponentControllerPtr controller;
scenic::EntityNode host_node;
fuchsia::ui::viewsv1::ViewProperties view_properties;
fuchsia::ui::viewsv1::ViewInfo view_info;
};
// |fuchsia::ui::viewsv1::ViewListener|:
void OnPropertiesChanged(fuchsia::ui::viewsv1::ViewProperties properties,
OnPropertiesChangedCallback callback) final;
// |fuchsia::ui::viewsv1::ViewContainerListener|:
void OnChildAttached(uint32_t child_key,
fuchsia::ui::viewsv1::ViewInfo child_view_info,
OnChildAttachedCallback) final;
void OnChildUnavailable(uint32_t child_key,
OnChildUnavailableCallback callback) final;
// |fuchsia::developer::tiles::Controller|:
void AddTileFromURL(std::string url, bool allow_focus,
fidl::VectorPtr<std::string> args,
AddTileFromURLCallback callback) final;
void AddTileFromViewProvider(
std::string url,
fidl::InterfaceHandle<::fuchsia::ui::app::ViewProvider> provider,
AddTileFromViewProviderCallback callback) final;
void RemoveTile(uint32_t key) final;
void ListTiles(ListTilesCallback callback) final;
void Quit() final;
// Launches initial list of views, passed as command line parameters.
void AddChildView(uint32_t child_key, zx::eventpair view_holder_token,
const std::string& url,
fuchsia::sys::ComponentControllerPtr, bool allow_focus);
void InvalidateScene();
void Layout();
void PresentScene();
// Context inherited when TileView is launched.
component::StartupContext* startup_context_;
// Connection to the root view.
fidl::Binding<fuchsia::ui::viewsv1::ViewListener> root_view_listener_binding_;
fidl::Binding<fuchsia::ui::viewsv1::ViewContainerListener>
root_view_container_listener_binding_;
fuchsia::ui::viewsv1::ViewPtr root_view_;
fuchsia::ui::viewsv1::ViewContainerPtr root_view_container_;
scenic::Session session_;
scenic::ImportNode root_node_;
scenic::ShapeNode background_node_;
scenic::EntityNode container_node_;
fuchsia::sys::LauncherPtr launcher_;
fidl::BindingSet<fuchsia::developer::tiles::Controller> tiles_binding_;
fuchsia::math::SizeF size_;
// The key we will assigned to the next child view which is added.
uint32_t next_child_view_key_ = 1u;
async::TaskClosure present_scene_task_;
// Map from keys to |ViewData|
std::map<uint32_t, std::unique_ptr<ViewData>> views_;
// Border in logical pixels for each tile.
int border_;
};
} // namespace tiles
#endif // GARNET_BIN_DEVELOPER_TILES_TILES_H_