10 #include "flutter/common/task_runners.h"
11 #include "flutter/fml/synchronization/waitable_event.h"
12 #include "flutter/fml/trace_event.h"
13 #include "flutter/shell/common/shell_io_manager.h"
14 #import "flutter/shell/platform/darwin/common/InternalFlutterSwiftCommon/InternalFlutterSwiftCommon.h"
23 const std::shared_ptr<IOSContext>& context,
25 const flutter::TaskRunners& task_runners)
26 : PlatformView(delegate, task_runners),
27 ios_context_(context),
28 platform_views_controller_(platform_views_controller),
29 platform_message_handler_(
33 PlatformView::Delegate& delegate,
36 const flutter::TaskRunners& task_runners,
37 const std::shared_ptr<fml::ConcurrentTaskRunner>& worker_task_runner,
38 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch)
41 delegate.OnPlatformViewGetSettings().enable_impeller
44 is_gpu_disabled_sync_switch,
45 delegate.OnPlatformViewGetSettings()),
46 platform_views_controller,
53 platform_message_handler_->HandlePlatformMessage(std::move(message));
57 return owner_controller_;
61 FML_DCHECK(task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread());
62 std::lock_guard<std::mutex> guard(ios_surface_mutex_);
63 if (ios_surface_ || !owner_controller) {
66 accessibility_bridge_.reset();
68 owner_controller_ = owner_controller;
72 dealloc_view_controller_observer_.reset([[NSNotificationCenter defaultCenter]
74 object:owner_controller_
75 queue:[NSOperationQueue mainQueue]
76 usingBlock:^(NSNotification* note) {
78 accessibility_bridge_.reset();
79 owner_controller_ = nil;
82 if (owner_controller_ && owner_controller_.isViewLoaded) {
92 FML_DCHECK(owner_controller_);
93 FML_DCHECK(owner_controller_.isViewLoaded) <<
"FlutterViewController's view should be loaded "
94 "before attaching to PlatformViewIOS.";
96 CALayer* ca_layer = flutter_view.layer;
98 FML_DCHECK(ios_surface_ !=
nullptr);
100 if (accessibility_bridge_) {
101 accessibility_bridge_ = std::make_unique<AccessibilityBridge>(
102 owner_controller_,
this, owner_controller_.platformViewsController);
107 return [](DefaultPointerDataDispatcher::Delegate& delegate) {
108 return std::make_unique<SmoothPointerDataDispatcher>(delegate);
113 NSObject<FlutterTexture>* texture) {
114 RegisterTexture(ios_context_->CreateExternalTexture(
texture_id, texture));
119 FML_DCHECK(task_runners_.GetRasterTaskRunner()->RunsTasksOnCurrentThread());
120 std::lock_guard<std::mutex> guard(ios_surface_mutex_);
122 FML_DLOG(INFO) <<
"Could not CreateRenderingSurface, this PlatformViewIOS "
123 "has no ViewController.";
126 return ios_surface_->CreateGPUSurface();
131 return std::make_shared<IOSExternalViewEmbedder>(platform_views_controller_, ios_context_);
136 return ios_context_->GetImpellerContext();
141 PlatformView::SetSemanticsEnabled(enabled);
146 PlatformView::SetAccessibilityFeatures(flags);
151 flutter::SemanticsNodeUpdates update,
152 flutter::CustomAccessibilityActionUpdates actions) {
153 FML_DCHECK(owner_controller_);
154 FML_DCHECK(accessibility_bridge_);
155 if (accessibility_bridge_) {
156 accessibility_bridge_.get()->UpdateSemantics(std::move(update), actions);
158 object:owner_controller_];
164 FML_DCHECK(owner_controller_);
165 owner_controller_.applicationLocale = locale.empty() ? nil : @(locale.data());
170 FML_DCHECK(owner_controller_);
172 if (accessibility_bridge_) {
175 accessibility_bridge_ =
176 std::make_unique<AccessibilityBridge>(owner_controller_,
this, platform_views_controller_);
178 accessibility_bridge_.reset();
184 return std::make_unique<VsyncWaiterIOS>(task_runners_);
188 if (accessibility_bridge_) {
189 accessibility_bridge_.get()->clearState();
191 if (!owner_controller_) {
194 [owner_controller_.platformViewsController reset];
195 [owner_controller_.restorationPlugin reset];
196 [owner_controller_.textInputPlugin reset];
200 const std::vector<std::string>& supported_locale_data) {
201 size_t localeDataLength = 3;
202 NSMutableArray<NSString*>* supported_locale_identifiers =
203 [NSMutableArray arrayWithCapacity:supported_locale_data.size() / localeDataLength];
204 for (
size_t i = 0; i < supported_locale_data.size(); i += localeDataLength) {
205 NSDictionary<NSString*, NSString*>* dict = @{
206 NSLocaleLanguageCode : [NSString stringWithUTF8String:supported_locale_data[i].c_str()]
208 NSLocaleCountryCode : [NSString stringWithUTF8String:supported_locale_data[i + 1].c_str()]
210 NSLocaleScriptCode : [NSString stringWithUTF8String:supported_locale_data[i + 2].c_str()]
213 [supported_locale_identifiers addObject:[NSLocale localeIdentifierFromComponents:dict]];
215 NSArray<NSString*>* result =
216 [NSBundle preferredLocalizationsFromArray:supported_locale_identifiers];
219 std::unique_ptr<std::vector<std::string>> out = std::make_unique<std::vector<std::string>>();
221 if (result !=
nullptr && [result count] > 0) {
222 NSLocale* locale = [NSLocale localeWithLocaleIdentifier:[result firstObject]];
223 NSString* languageCode = [locale languageCode];
224 out->emplace_back(languageCode ==
nullptr ?
"" : languageCode.UTF8String);
225 NSString* countryCode = [locale countryCode];
226 out->emplace_back(countryCode ==
nullptr ?
"" : countryCode.UTF8String);
227 NSString* scriptCode = [locale scriptCode];
228 out->emplace_back(scriptCode ==
nullptr ?
"" : scriptCode.UTF8String);
233 PlatformViewIOS::ScopedObserver::ScopedObserver() {}
235 PlatformViewIOS::ScopedObserver::~ScopedObserver() {
237 [[NSNotificationCenter defaultCenter] removeObserver:observer_];
241 void PlatformViewIOS::ScopedObserver::reset(id<NSObject> observer) {
242 if (observer != observer_) {
244 [[NSNotificationCenter defaultCenter] removeObserver:observer_];
246 observer_ = observer;
FLUTTER_DARWIN_EXPORT NSNotificationName const FlutterSemanticsUpdateNotification
NSNotificationName const FlutterViewControllerWillDealloc
Manages the lifetime of the on-screen and off-screen rendering contexts on iOS. On-screen contexts ar...
static std::unique_ptr< IOSSurface > Create(std::shared_ptr< IOSContext > context, CALayer *layer)