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