• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_SHELL_PLATFORM_FUCHSIA_COMPONENT_H_
6 #define FLUTTER_SHELL_PLATFORM_FUCHSIA_COMPONENT_H_
7 
8 #include <array>
9 #include <memory>
10 #include <set>
11 
12 #include <fuchsia/io/cpp/fidl.h>
13 #include <fuchsia/sys/cpp/fidl.h>
14 #include <fuchsia/ui/app/cpp/fidl.h>
15 #include <lib/async-loop/cpp/loop.h>
16 #include <lib/async/default.h>
17 #include <lib/fidl/cpp/binding_set.h>
18 #include <lib/fidl/cpp/interface_request.h>
19 #include <lib/fit/function.h>
20 #include <lib/sys/cpp/service_directory.h>
21 #include <lib/vfs/cpp/pseudo_dir.h>
22 #include <lib/zx/eventpair.h>
23 
24 #include "engine.h"
25 #include "flutter/common/settings.h"
26 #include "flutter/fml/macros.h"
27 
28 #include "thread.h"
29 #include "unique_fdio_ns.h"
30 
31 namespace flutter_runner {
32 
33 // Represents an instance of a Flutter application that contains one of more
34 // Flutter engine instances.
35 class Application final : public Engine::Delegate,
36                           public fuchsia::sys::ComponentController,
37                           public fuchsia::ui::app::ViewProvider {
38  public:
39   using TerminationCallback = fit::function<void(const Application*)>;
40 
41   // Creates a dedicated thread to run the application and constructions the
42   // application on it. The application can be accessed only on this thread.
43   // This is a synchronous operation.
44   static std::pair<std::unique_ptr<Thread>, std::unique_ptr<Application>>
45   Create(TerminationCallback termination_callback,
46          fuchsia::sys::Package package,
47          fuchsia::sys::StartupInfo startup_info,
48          std::shared_ptr<sys::ServiceDirectory> runner_incoming_services,
49          fidl::InterfaceRequest<fuchsia::sys::ComponentController> controller);
50 
51   // Must be called on the same thread returned from the create call. The thread
52   // may be collected after.
53   ~Application();
54 
55   const std::string& GetDebugLabel() const;
56 
57 #if !defined(DART_PRODUCT)
58   void WriteProfileToTrace() const;
59 #endif  // !defined(DART_PRODUCT)
60 
61  private:
62   flutter::Settings settings_;
63   TerminationCallback termination_callback_;
64   const std::string debug_label_;
65   UniqueFDIONS fdio_ns_ = UniqueFDIONSCreate();
66   fml::UniqueFD application_directory_;
67   fml::UniqueFD application_assets_directory_;
68 
69   fidl::Binding<fuchsia::sys::ComponentController> application_controller_;
70   fuchsia::io::DirectoryPtr directory_ptr_;
71   fuchsia::io::NodePtr cloned_directory_ptr_;
72   fidl::InterfaceRequest<fuchsia::io::Directory> directory_request_;
73   std::unique_ptr<vfs::PseudoDir> outgoing_dir_;
74   std::shared_ptr<sys::ServiceDirectory> svc_;
75   std::shared_ptr<sys::ServiceDirectory> runner_incoming_services_;
76   fidl::BindingSet<fuchsia::ui::app::ViewProvider> shells_bindings_;
77 
78   fml::RefPtr<flutter::DartSnapshot> isolate_snapshot_;
79   fml::RefPtr<flutter::DartSnapshot> shared_snapshot_;
80   std::set<std::unique_ptr<Engine>> shell_holders_;
81   std::pair<bool, uint32_t> last_return_code_;
82   fml::WeakPtrFactory<Application> weak_factory_;
83 
84   Application(
85       TerminationCallback termination_callback,
86       fuchsia::sys::Package package,
87       fuchsia::sys::StartupInfo startup_info,
88       std::shared_ptr<sys::ServiceDirectory> runner_incoming_services,
89       fidl::InterfaceRequest<fuchsia::sys::ComponentController> controller);
90 
91   // |fuchsia::sys::ComponentController|
92   void Kill() override;
93 
94   // |fuchsia::sys::ComponentController|
95   void Detach() override;
96 
97   // |fuchsia::ui::app::ViewProvider|
98   void CreateView(
99       zx::eventpair view_token,
100       fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
101       fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services)
102       override;
103 
104   // |flutter::Engine::Delegate|
105   void OnEngineTerminate(const Engine* holder) override;
106 
107   void AttemptVMLaunchWithCurrentSettings(const flutter::Settings& settings);
108 
109   FML_DISALLOW_COPY_AND_ASSIGN(Application);
110 };
111 
112 }  // namespace flutter_runner
113 
114 #endif  // FLUTTER_SHELL_PLATFORM_FUCHSIA_COMPONENT_H_
115