From bfd85e64a6e03837dda47692730139015462c3e0 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Apr 2020 14:57:40 -0700 Subject: [PATCH 1/5] Made it so we can hide the home indicator with SystemChrome.setEnabledSystemUIOverlays. --- .../framework/Source/FlutterPlatformPlugin.mm | 6 ++++ .../framework/Source/FlutterViewController.mm | 35 ++++++++++++++++++- .../Source/FlutterViewController_Internal.h | 6 ++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm index 809c467a4e554..c1fa36154b819 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm @@ -4,6 +4,7 @@ #include "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.h" #include "flutter/fml/logging.h" +#include "flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h" #include #include @@ -161,6 +162,11 @@ - (void)setSystemChromeEnabledSystemUIOverlays:(NSArray*)overlays { // UIViewControllerBasedStatusBarAppearance [UIApplication sharedApplication].statusBarHidden = ![overlays containsObject:@"SystemUiOverlay.top"]; + if ([overlays containsObject:@"SystemUiOverlay.bottom"]) { + [[NSNotificationCenter defaultCenter] postNotificationName:FlutterViewControllerShowHomeIndicator object:nil]; + } else { + [[NSNotificationCenter defaultCenter] postNotificationName:FlutterViewControllerHideHomeIndicator object:nil]; + } } - (void)restoreSystemChromeSystemUIOverlays { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index e6906d8d07591..fc38283867fd0 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -27,8 +27,9 @@ static constexpr CGFloat kScrollViewContentSize = 2.0; NSNotificationName const FlutterSemanticsUpdateNotification = @"FlutterSemanticsUpdate"; - NSNotificationName const FlutterViewControllerWillDealloc = @"FlutterViewControllerWillDealloc"; +NSNotificationName const FlutterViewControllerHideHomeIndicator = @"FlutterViewControllerHideHomeIndicator"; +NSNotificationName const FlutterViewControllerShowHomeIndicator = @"FlutterViewControllerShowHomeIndicator"; /// Class to coalesce calls for a period of time. /// @@ -91,6 +92,7 @@ - (void)invalidate { // just a warning. @interface FlutterViewController () @property(nonatomic, readwrite, getter=isDisplayingFlutterUI) BOOL displayingFlutterUI; +@property(nonatomic, assign) BOOL hideHomeIndicator; @end // The following conditional compilation defines an API 13 concept on earlier API targets so that @@ -318,6 +320,16 @@ - (void)setupNotificationCenterObservers { selector:@selector(onUserSettingsChanged:) name:UIContentSizeCategoryDidChangeNotification object:nil]; + + [center addObserver:self + selector:@selector(onHideHomeIndicatorNotification:) + name:FlutterViewControllerHideHomeIndicator + object:nil]; + + [center addObserver:self + selector:@selector(onShowHomeIndicatorNotification:) + name:FlutterViewControllerShowHomeIndicator + object:nil]; } - (void)setInitialRoute:(NSString*)route { @@ -1012,6 +1024,27 @@ - (void)performOrientationUpdate:(UIInterfaceOrientationMask)new_preferences { } } +- (void)onHideHomeIndicatorNotification:(NSNotification*)notification { + self.hideHomeIndicator = YES; +} + +- (void)onShowHomeIndicatorNotification:(NSNotification*)notification { + self.hideHomeIndicator = NO; +} + +- (void)setHideHomeIndicator:(BOOL)hideHomeIndicator { + if (hideHomeIndicator != _hideHomeIndicator) { + _hideHomeIndicator = hideHomeIndicator; + if (@available(iOS 11, *)) { + [self setNeedsUpdateOfHomeIndicatorAutoHidden]; + } + } +} + +- (BOOL)prefersHomeIndicatorAutoHidden { + return self.hideHomeIndicator; +} + - (BOOL)shouldAutorotate { return YES; } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h index afe5b8166ce4a..71de74d8a1c19 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h @@ -15,6 +15,12 @@ FLUTTER_EXPORT extern NSNotificationName const FlutterViewControllerWillDealloc; +FLUTTER_EXPORT +extern NSNotificationName const FlutterViewControllerHideHomeIndicator; + +FLUTTER_EXPORT +extern NSNotificationName const FlutterViewControllerShowHomeIndicator; + @interface FlutterViewController () - (fml::WeakPtr)getWeakPtr; From 7ce016f1b96a70ddc3e0a41c469d46db44c2ce09 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Apr 2020 15:02:31 -0700 Subject: [PATCH 2/5] ran formatter --- .../darwin/ios/framework/Source/FlutterPlatformPlugin.mm | 8 ++++++-- .../darwin/ios/framework/Source/FlutterViewController.mm | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm index c1fa36154b819..5238be44eaef1 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm @@ -163,9 +163,13 @@ - (void)setSystemChromeEnabledSystemUIOverlays:(NSArray*)overlays { [UIApplication sharedApplication].statusBarHidden = ![overlays containsObject:@"SystemUiOverlay.top"]; if ([overlays containsObject:@"SystemUiOverlay.bottom"]) { - [[NSNotificationCenter defaultCenter] postNotificationName:FlutterViewControllerShowHomeIndicator object:nil]; + [[NSNotificationCenter defaultCenter] + postNotificationName:FlutterViewControllerShowHomeIndicator + object:nil]; } else { - [[NSNotificationCenter defaultCenter] postNotificationName:FlutterViewControllerHideHomeIndicator object:nil]; + [[NSNotificationCenter defaultCenter] + postNotificationName:FlutterViewControllerHideHomeIndicator + object:nil]; } } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index fc38283867fd0..309547aa8f6ba 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -28,8 +28,10 @@ NSNotificationName const FlutterSemanticsUpdateNotification = @"FlutterSemanticsUpdate"; NSNotificationName const FlutterViewControllerWillDealloc = @"FlutterViewControllerWillDealloc"; -NSNotificationName const FlutterViewControllerHideHomeIndicator = @"FlutterViewControllerHideHomeIndicator"; -NSNotificationName const FlutterViewControllerShowHomeIndicator = @"FlutterViewControllerShowHomeIndicator"; +NSNotificationName const FlutterViewControllerHideHomeIndicator = + @"FlutterViewControllerHideHomeIndicator"; +NSNotificationName const FlutterViewControllerShowHomeIndicator = + @"FlutterViewControllerShowHomeIndicator"; /// Class to coalesce calls for a period of time. /// From 75781c41ef78b46b8430511b2e6fd2a21e530154 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Apr 2020 15:12:07 -0700 Subject: [PATCH 3/5] renamed property --- .../ios/framework/Source/FlutterViewController.mm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index 309547aa8f6ba..02f130d7816e6 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -94,7 +94,7 @@ - (void)invalidate { // just a warning. @interface FlutterViewController () @property(nonatomic, readwrite, getter=isDisplayingFlutterUI) BOOL displayingFlutterUI; -@property(nonatomic, assign) BOOL hideHomeIndicator; +@property(nonatomic, assign) BOOL isHomeIndicatorHidden; @end // The following conditional compilation defines an API 13 concept on earlier API targets so that @@ -1027,16 +1027,16 @@ - (void)performOrientationUpdate:(UIInterfaceOrientationMask)new_preferences { } - (void)onHideHomeIndicatorNotification:(NSNotification*)notification { - self.hideHomeIndicator = YES; + self.isHomeIndicatorHidden = YES; } - (void)onShowHomeIndicatorNotification:(NSNotification*)notification { - self.hideHomeIndicator = NO; + self.isHomeIndicatorHidden = NO; } -- (void)setHideHomeIndicator:(BOOL)hideHomeIndicator { - if (hideHomeIndicator != _hideHomeIndicator) { - _hideHomeIndicator = hideHomeIndicator; +- (void)setIsHomeIndicatorHidden:(BOOL)hideHomeIndicator { + if (hideHomeIndicator != _isHomeIndicatorHidden) { + _isHomeIndicatorHidden = hideHomeIndicator; if (@available(iOS 11, *)) { [self setNeedsUpdateOfHomeIndicatorAutoHidden]; } @@ -1044,7 +1044,7 @@ - (void)setHideHomeIndicator:(BOOL)hideHomeIndicator { } - (BOOL)prefersHomeIndicatorAutoHidden { - return self.hideHomeIndicator; + return self.isHomeIndicatorHidden; } - (BOOL)shouldAutorotate { From 99d37695b005a75da486264feda2cde0e4646910 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 7 Apr 2020 16:43:34 -0700 Subject: [PATCH 4/5] added unit test --- ...lerTest.m => FlutterViewControllerTest.mm} | 42 ++++++++++++------- .../Source/FlutterViewController_Internal.h | 8 ++-- .../IosUnitTests.xcodeproj/project.pbxproj | 8 ++-- 3 files changed, 35 insertions(+), 23 deletions(-) rename shell/platform/darwin/ios/framework/Source/{FlutterViewControllerTest.m => FlutterViewControllerTest.mm} (91%) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.m b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm similarity index 91% rename from shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.m rename to shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm index 403e4e3625311..d851616720905 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.m +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm @@ -6,6 +6,7 @@ #import #include "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h" #import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h" +#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h" #include "FlutterBinaryMessenger.h" @@ -344,67 +345,67 @@ - (void)testPerformOrientationUpdateDoesNotForceOrientationChange { [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskAll currentOrientation:UIInterfaceOrientationPortrait didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskAll currentOrientation:UIInterfaceOrientationPortraitUpsideDown didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskAll currentOrientation:UIInterfaceOrientationLandscapeLeft didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskAll currentOrientation:UIInterfaceOrientationLandscapeRight didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskAllButUpsideDown currentOrientation:UIInterfaceOrientationPortrait didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskAllButUpsideDown currentOrientation:UIInterfaceOrientationLandscapeLeft didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskAllButUpsideDown currentOrientation:UIInterfaceOrientationLandscapeRight didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskPortrait currentOrientation:UIInterfaceOrientationPortrait didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskPortraitUpsideDown currentOrientation:UIInterfaceOrientationPortraitUpsideDown didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskLandscape currentOrientation:UIInterfaceOrientationLandscapeLeft didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskLandscape currentOrientation:UIInterfaceOrientationLandscapeRight didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskLandscapeLeft currentOrientation:UIInterfaceOrientationLandscapeLeft didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; [self orientationTestWithOrientationUpdate:UIInterfaceOrientationMaskLandscapeRight currentOrientation:UIInterfaceOrientationLandscapeRight didChangeOrientation:NO - resultingOrientation:0]; + resultingOrientation:static_cast(0)]; } // Perform an orientation update test that fails when the expected outcome @@ -465,8 +466,6 @@ - (void)testWillDeallocNotification { } - (void)testDoesntLoadViewInInit { - XCTestExpectation* expectation = - [[XCTestExpectation alloc] initWithDescription:@"notification called"]; FlutterDartProject* project = [[FlutterDartProject alloc] init]; FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"foobar" project:project]; [engine createShell:@"" libraryURI:@""]; @@ -476,4 +475,17 @@ - (void)testDoesntLoadViewInInit { XCTAssertFalse([realVC isViewLoaded], @"shouldn't have loaded since it hasn't been shown"); } +- (void)testHideOverlay { + FlutterDartProject* project = [[FlutterDartProject alloc] init]; + FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"foobar" project:project]; + [engine createShell:@"" libraryURI:@""]; + FlutterViewController* realVC = [[FlutterViewController alloc] initWithEngine:engine + nibName:nil + bundle:nil]; + XCTAssertFalse(realVC.prefersHomeIndicatorAutoHidden, @""); + [[NSNotificationCenter defaultCenter] postNotificationName:FlutterViewControllerHideHomeIndicator + object:nil]; + XCTAssertTrue(realVC.prefersHomeIndicatorAutoHidden, @""); +} + @end diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h index 71de74d8a1c19..98f222b3254ac 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h @@ -5,12 +5,12 @@ #ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERVIEWCONTROLLER_INTERNAL_H_ #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERVIEWCONTROLLER_INTERNAL_H_ -#include "flutter/flow/embedded_views.h" #include "flutter/fml/memory/weak_ptr.h" -#include "flutter/fml/platform/darwin/scoped_nsobject.h" -#include "flutter/shell/common/shell.h" #include "flutter/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h" -#include "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h" + +namespace flutter { +class FlutterPlatformViewsController; +} FLUTTER_EXPORT extern NSNotificationName const FlutterViewControllerWillDealloc; diff --git a/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj b/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj index 82f36199ac95a..1d6ceddc5b8a2 100644 --- a/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj +++ b/testing/ios/IosUnitTests/IosUnitTests.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 0D17A5C022D78FCD0057279F /* FlutterViewControllerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D17A5BF22D78FCD0057279F /* FlutterViewControllerTest.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; + 0D17A5C022D78FCD0057279F /* FlutterViewControllerTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0D17A5BF22D78FCD0057279F /* FlutterViewControllerTest.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 0D1CE5D8233430F400E5D880 /* FlutterChannelsTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D1CE5D7233430F400E5D880 /* FlutterChannelsTest.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 0D4C3FB022DF9F5300A67C70 /* FlutterPluginAppLifeCycleDelegateTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D4C3FAF22DF9F5300A67C70 /* FlutterPluginAppLifeCycleDelegateTest.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 0D52D3BD22C566D50011DEBD /* FlutterBinaryMessengerRelayTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0D52D3B622C566D50011DEBD /* FlutterBinaryMessengerRelayTest.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; @@ -75,7 +75,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 0D17A5BF22D78FCD0057279F /* FlutterViewControllerTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FlutterViewControllerTest.m; sourceTree = ""; }; + 0D17A5BF22D78FCD0057279F /* FlutterViewControllerTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = FlutterViewControllerTest.mm; sourceTree = ""; }; 0D1CE5D7233430F400E5D880 /* FlutterChannelsTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FlutterChannelsTest.m; sourceTree = ""; }; 0D4C3FAF22DF9F5300A67C70 /* FlutterPluginAppLifeCycleDelegateTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FlutterPluginAppLifeCycleDelegateTest.m; sourceTree = ""; }; 0D52D3B622C566D50011DEBD /* FlutterBinaryMessengerRelayTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FlutterBinaryMessengerRelayTest.mm; sourceTree = ""; }; @@ -176,7 +176,7 @@ children = ( 0D52D3B622C566D50011DEBD /* FlutterBinaryMessengerRelayTest.mm */, 0D6AB6E722BB40CF00EEE540 /* FlutterEngineTest.mm */, - 0D17A5BF22D78FCD0057279F /* FlutterViewControllerTest.m */, + 0D17A5BF22D78FCD0057279F /* FlutterViewControllerTest.mm */, 0D4C3FAF22DF9F5300A67C70 /* FlutterPluginAppLifeCycleDelegateTest.m */, ); name = Source; @@ -387,7 +387,7 @@ buildActionMask = 2147483647; files = ( 0D6AB6EB22BB40E700EEE540 /* FlutterEngineTest.mm in Sources */, - 0D17A5C022D78FCD0057279F /* FlutterViewControllerTest.m in Sources */, + 0D17A5C022D78FCD0057279F /* FlutterViewControllerTest.mm in Sources */, 0D1CE5D8233430F400E5D880 /* FlutterChannelsTest.m in Sources */, 0D52D3BD22C566D50011DEBD /* FlutterBinaryMessengerRelayTest.mm in Sources */, 0D4C3FB022DF9F5300A67C70 /* FlutterPluginAppLifeCycleDelegateTest.m in Sources */, From 3b521898d28442b390df8555b3edd4c173e9b7d1 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 8 Apr 2020 10:02:09 -0700 Subject: [PATCH 5/5] updated licenses file --- ci/licenses_golden/licenses_flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 08d65c11b2a61..2b161f44e3ebd 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -872,7 +872,7 @@ FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/FlutterUmbrell FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/FlutterView.h FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/FlutterView.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm -FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.m +FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.h FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm