|  | // 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 SRC_UI_TOOLS_TILES_TILES_H_ | 
|  | #define SRC_UI_TOOLS_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/gfx/cpp/fidl.h> | 
|  | #include <fuchsia/ui/scenic/cpp/fidl.h> | 
|  | #include <fuchsia/ui/views/cpp/fidl.h> | 
|  | #include <lib/fidl/cpp/binding_set.h> | 
|  | #include <lib/ui/scenic/cpp/id.h> | 
|  | #include <lib/ui/scenic/cpp/resources.h> | 
|  |  | 
|  | #include "src/lib/ui/base_view/base_view.h" | 
|  |  | 
|  | #include <unordered_map> | 
|  |  | 
|  | namespace tiles { | 
|  |  | 
|  | class Tiles : public fuchsia::developer::tiles::Controller, public scenic::BaseView { | 
|  | public: | 
|  | Tiles(scenic::ViewContext view_context, std::vector<std::string> urls, int border = 0); | 
|  | ~Tiles() override = default; | 
|  |  | 
|  | private: | 
|  | struct ViewData { | 
|  | explicit ViewData(const std::string& url, bool allow_focus, | 
|  | fuchsia::sys::ComponentControllerPtr controller, scenic::EntityNode node, | 
|  | scenic::ViewHolder view_holder); | 
|  | ~ViewData() = default; | 
|  |  | 
|  | const std::string url; | 
|  | fuchsia::sys::ComponentControllerPtr controller; | 
|  | fuchsia::ui::gfx::ViewProperties view_properties; | 
|  | scenic::EntityNode host_node; | 
|  | scenic::ViewHolder host_view_holder; | 
|  | }; | 
|  |  | 
|  | // |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; | 
|  |  | 
|  | // |scenic::SessionListener| | 
|  | void OnScenicError(std::string error) final; | 
|  |  | 
|  | // |scenic::BaseView| | 
|  | void OnPropertiesChanged(fuchsia::ui::gfx::ViewProperties old_properties) final; | 
|  | void OnScenicEvent(fuchsia::ui::scenic::Event) final; | 
|  |  | 
|  | void AddTile(uint32_t child_key, fuchsia::ui::views::ViewHolderToken view_holder_token, | 
|  | const std::string& url, fuchsia::sys::ComponentControllerPtr, bool allow_focus); | 
|  | void Layout(); | 
|  |  | 
|  | fidl::BindingSet<fuchsia::developer::tiles::Controller> tiles_binding_; | 
|  | fuchsia::sys::LauncherPtr launcher_; | 
|  |  | 
|  | std::unordered_map<uint32_t, std::unique_ptr<ViewData>> views_; | 
|  | std::unordered_map<scenic::ResourceId, uint32_t> view_id_to_keys_; | 
|  | scenic::ShapeNode background_node_; | 
|  | scenic::EntityNode container_node_; | 
|  |  | 
|  | uint32_t next_child_view_key_ = 0; | 
|  | int border_ = 0;  // Border in logical pixels for each tile. | 
|  | }; | 
|  |  | 
|  | }  // namespace tiles | 
|  |  | 
|  | #endif  // SRC_UI_TOOLS_TILES_TILES_H_ |