Flutter iOS Embedder
platform_view_ios.h
Go to the documentation of this file.
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_DARWIN_IOS_PLATFORM_VIEW_IOS_H_
6 #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_PLATFORM_VIEW_IOS_H_
7 
8 #include <memory>
9 
10 #include "flutter/fml/closure.h"
11 #include "flutter/fml/macros.h"
12 #include "flutter/shell/common/platform_view.h"
22 
24 
25 namespace flutter {
26 
27 /**
28  * A bridge connecting the platform agnostic shell and the iOS embedding.
29  *
30  * The shell provides and requests for UI related data and this PlatformView subclass fulfills
31  * it with iOS specific capabilities. As an example, the iOS embedding (the `FlutterEngine` and the
32  * `FlutterViewController`) sends pointer data to the shell and receives the shell's request for a
33  * Impeller AiksContext and supplies it.
34  *
35  * Despite the name "view", this class is unrelated to UIViews on iOS and doesn't have the same
36  * lifecycle. It's a long lived bridge owned by the `FlutterEngine` and can be attached and
37  * detached sequentially to multiple `FlutterViewController`s and `FlutterView`s.
38  */
39 class PlatformViewIOS final : public PlatformView {
40  public:
41  PlatformViewIOS(PlatformView::Delegate& delegate,
42  const std::shared_ptr<IOSContext>& context,
43  __weak FlutterPlatformViewsController* platform_views_controller,
44  const flutter::TaskRunners& task_runners);
45 
46  explicit PlatformViewIOS(
47  PlatformView::Delegate& delegate,
48  IOSRenderingAPI rendering_api,
49  __weak FlutterPlatformViewsController* platform_views_controller,
50  const flutter::TaskRunners& task_runners,
51  const std::shared_ptr<fml::ConcurrentTaskRunner>& worker_task_runner,
52  const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch);
53 
54  ~PlatformViewIOS() override;
55 
56  /**
57  * Returns the `FlutterViewController` currently attached to the `FlutterEngine` owning
58  * this PlatformViewIOS.
59  */
60  FlutterViewController* GetOwnerViewController() const __attribute__((cf_audited_transfer));
61 
62  /**
63  * Updates the `FlutterViewController` currently attached to the `FlutterEngine` owning
64  * this PlatformViewIOS. This should be updated when the `FlutterEngine`
65  * is given a new `FlutterViewController`.
66  */
67  void SetOwnerViewController(__weak FlutterViewController* owner_controller);
68 
69  /**
70  * Called one time per `FlutterViewController` when the `FlutterViewController`'s
71  * UIView is first loaded.
72  *
73  * Can be used to perform late initialization after `FlutterViewController`'s
74  * init.
75  */
76  void attachView();
77 
78  /**
79  * Called through when an external texture such as video or camera is
80  * given to the `FlutterEngine` or `FlutterViewController`.
81  */
82  void RegisterExternalTexture(int64_t id, NSObject<FlutterTexture>* texture);
83 
84  // |PlatformView|
85  PointerDataDispatcherMaker GetDispatcherMaker() override;
86 
87  // |PlatformView|
88  void SetSemanticsEnabled(bool enabled) override;
89 
90  // |PlatformView|
91  void HandlePlatformMessage(std::unique_ptr<flutter::PlatformMessage> message) override;
92 
93  // |PlatformView|
94  std::unique_ptr<Surface> CreateRenderingSurface() override;
95 
96  // |PlatformView|
97  std::shared_ptr<ExternalViewEmbedder> CreateExternalViewEmbedder() override;
98 
99  // |PlatformView|
100  std::shared_ptr<impeller::Context> GetImpellerContext() const override;
101 
102  // |PlatformView|
103  void SetAccessibilityFeatures(int32_t flags) override;
104 
105  // |PlatformView|
106  void UpdateSemantics(int64_t view_id,
107  flutter::SemanticsNodeUpdates update,
108  flutter::CustomAccessibilityActionUpdates actions) override;
109 
110  // |PlatformView|
111  std::unique_ptr<VsyncWaiter> CreateVSyncWaiter() override;
112 
113  // |PlatformView|
114  void OnPreEngineRestart() const override;
115 
116  // |PlatformView|
117  std::unique_ptr<std::vector<std::string>> ComputePlatformResolvedLocales(
118  const std::vector<std::string>& supported_locale_data) override;
119 
120  /** Accessor for the `IOSContext` associated with the platform view. */
121  const std::shared_ptr<IOSContext>& GetIosContext() { return ios_context_; }
122 
123  std::shared_ptr<PlatformMessageHandlerIos> GetPlatformMessageHandlerIos() const {
124  return platform_message_handler_;
125  }
126 
127  std::shared_ptr<PlatformMessageHandler> GetPlatformMessageHandler() const override {
128  return platform_message_handler_;
129  }
130 
131  private:
132  /// Smart pointer for use with objective-c observers.
133  /// This guarantees we remove the observer.
134  class ScopedObserver {
135  public:
136  ScopedObserver();
137  ~ScopedObserver();
138  void reset(id<NSObject> observer);
139  ScopedObserver(const ScopedObserver&) = delete;
140  ScopedObserver& operator=(const ScopedObserver&) = delete;
141 
142  private:
143  id<NSObject> observer_ = nil;
144  };
145 
146  /// Wrapper that guarantees we communicate clearing Accessibility
147  /// information to Dart.
148  class AccessibilityBridgeManager {
149  public:
150  explicit AccessibilityBridgeManager(const std::function<void(bool)>& set_semantics_enabled);
151  AccessibilityBridgeManager(const std::function<void(bool)>& set_semantics_enabled,
152  AccessibilityBridge* bridge);
153  explicit operator bool() const noexcept { return static_cast<bool>(accessibility_bridge_); }
154  AccessibilityBridge* get() const noexcept { return accessibility_bridge_.get(); }
155  void Set(std::unique_ptr<AccessibilityBridge> bridge);
156  void Clear();
157 
158  private:
159  FML_DISALLOW_COPY_AND_ASSIGN(AccessibilityBridgeManager);
160  std::unique_ptr<AccessibilityBridge> accessibility_bridge_;
161  std::function<void(bool)> set_semantics_enabled_;
162  };
163 
164  __weak FlutterViewController* owner_controller_;
165  // Since the `ios_surface_` is created on the platform thread but
166  // used on the raster thread we need to protect it with a mutex.
167  std::mutex ios_surface_mutex_;
168  std::unique_ptr<IOSSurface> ios_surface_;
169  std::shared_ptr<IOSContext> ios_context_;
170  __weak FlutterPlatformViewsController* platform_views_controller_;
171  AccessibilityBridgeManager accessibility_bridge_;
172  ScopedObserver dealloc_view_controller_observer_;
173  std::vector<std::string> platform_resolved_locale_;
174  std::shared_ptr<PlatformMessageHandlerIos> platform_message_handler_;
175 
176  FML_DISALLOW_COPY_AND_ASSIGN(PlatformViewIOS);
177 };
178 
179 } // namespace flutter
180 
181 #endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_PLATFORM_VIEW_IOS_H_
Manages the lifetime of the on-screen and off-screen rendering contexts on iOS. On-screen contexts ar...
Definition: ios_context.h:39
std::unique_ptr< Surface > CreateRenderingSurface() override
std::shared_ptr< PlatformMessageHandler > GetPlatformMessageHandler() const override
PointerDataDispatcherMaker GetDispatcherMaker() override
const std::shared_ptr< IOSContext > & GetIosContext()
std::shared_ptr< impeller::Context > GetImpellerContext() const override
void SetAccessibilityFeatures(int32_t flags) override
void UpdateSemantics(int64_t view_id, flutter::SemanticsNodeUpdates update, flutter::CustomAccessibilityActionUpdates actions) override
std::unique_ptr< VsyncWaiter > CreateVSyncWaiter() override
std::shared_ptr< ExternalViewEmbedder > CreateExternalViewEmbedder() override
void SetSemanticsEnabled(bool enabled) override
void HandlePlatformMessage(std::unique_ptr< flutter::PlatformMessage > message) override
PlatformViewIOS(PlatformView::Delegate &delegate, const std::shared_ptr< IOSContext > &context, __weak FlutterPlatformViewsController *platform_views_controller, const flutter::TaskRunners &task_runners)
std::shared_ptr< PlatformMessageHandlerIos > GetPlatformMessageHandlerIos() const
FlutterViewController * GetOwnerViewController() const __attribute__((cf_audited_transfer))
void OnPreEngineRestart() const override
void SetOwnerViewController(__weak FlutterViewController *owner_controller)
void RegisterExternalTexture(int64_t id, NSObject< FlutterTexture > *texture)
std::unique_ptr< std::vector< std::string > > ComputePlatformResolvedLocales(const std::vector< std::string > &supported_locale_data) override