diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index 9c0ff5883fa95..d051ff0038874 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -33,62 +33,6 @@ NSNotificationName const FlutterViewControllerShowHomeIndicator = @"FlutterViewControllerShowHomeIndicator"; -/// Class to coalesce calls for a period of time. -/// -/// This is used to filter out the conflicting notifications that can get sent -/// in rapid succession when the app gets foregrounded. -@interface FlutterCoalescer : NSObject -@property(nonatomic, assign) BOOL isTriggered; -@property(nonatomic, assign) BOOL isCoalescing; -@property(nonatomic, copy) dispatch_block_t block; -@end - -@implementation FlutterCoalescer -- (instancetype)initWithBlock:(dispatch_block_t)block { - self = [super init]; - if (self) { - self.block = block; - } - return self; -} - -- (void)dealloc { - [_block release]; - [super dealloc]; -} - -- (void)trigger { - if (_isCoalescing) { - _isTriggered = YES; - } else { - _isTriggered = NO; - if (_block) { - _block(); - } - } -} - -- (void)coalesceForSeconds:(double)seconds { - if (self.isCoalescing || !self.block) { - return; - } - self.isCoalescing = YES; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC), - dispatch_get_main_queue(), ^{ - if (self.isTriggered && self.block) { - self.block(); - } - self.isTriggered = NO; - self.isCoalescing = NO; - }); -} - -- (void)invalidate { - self.block = nil; -} - -@end // FlutterCoalescer - // This is left a FlutterBinaryMessenger privately for now to give people a chance to notice the // change. Unfortunately unless you have Werror turned on, incompatible pointers as arguments are // just a warning. @@ -127,9 +71,6 @@ @implementation FlutterViewController { BOOL _viewOpaque; BOOL _engineNeedsLaunch; NSMutableSet* _ongoingTouches; - // Coalescer that filters out superfluous keyboard notifications when the app - // is being foregrounded. - fml::scoped_nsobject _updateViewportMetrics; // This scroll view is a workaround to accomodate iOS 13 and higher. There isn't a way to get // touches on the status bar to trigger scrolling to the top of a scroll view. We place a // UIScrollView with height zero and a content offset so we can get those events. See also: @@ -226,11 +167,6 @@ - (void)performCommonViewControllerInitialization { _statusBarStyle = UIStatusBarStyleDefault; [self setupNotificationCenterObservers]; - - __block FlutterViewController* blockSelf = self; - _updateViewportMetrics.reset([[FlutterCoalescer alloc] initWithBlock:^{ - [blockSelf updateViewportMetricsImplementation]; - }]); } - (FlutterEngine*)engine { @@ -668,7 +604,6 @@ - (void)dealloc { userInfo:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self]; [_ongoingTouches release]; - [_updateViewportMetrics invalidate]; [super dealloc]; } @@ -695,7 +630,6 @@ - (void)applicationDidEnterBackground:(NSNotification*)notification { - (void)applicationWillEnterForeground:(NSNotification*)notification { TRACE_EVENT0("flutter", "applicationWillEnterForeground"); [self goToApplicationLifecycle:@"AppLifecycleState.inactive"]; - [_updateViewportMetrics coalesceForSeconds:0.5]; } // Make this transition only while this current view controller is visible. @@ -886,13 +820,6 @@ - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event { #pragma mark - Handle view resizing - (void)updateViewportMetrics { - [_updateViewportMetrics trigger]; -} - -/// The direct implementation of updateViewportMetrics, it doesn't conform to -/// the coalescing logic when foregrounding the app. Most calls should be -/// directed to [updateViewportMetrics]. -- (void)updateViewportMetricsImplementation { [_engine.get() updateViewportMetrics:_viewportMetrics]; } @@ -920,7 +847,7 @@ - (void)viewDidLayoutSubviews { _viewportMetrics.physical_height = viewSize.height * scale; [self updateViewportPadding]; - [self updateViewportMetricsImplementation]; + [self updateViewportMetrics]; // This must run after updateViewportMetrics so that the surface creation tasks are queued after // the viewport metrics update tasks. @@ -967,6 +894,15 @@ - (void)updateViewportPadding { - (void)keyboardWillChangeFrame:(NSNotification*)notification { NSDictionary* info = [notification userInfo]; + + if (@available(iOS 9, *)) { + // Ignore keyboard notifications related to other apps. + id isLocal = info[UIKeyboardIsLocalUserInfoKey]; + if (isLocal && ![isLocal boolValue]) { + return; + } + } + CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGRect screenRect = [[UIScreen mainScreen] bounds];