Skip to content

Commit

Permalink
Started ignoring remote keyboard notifications. (flutter#17981)
Browse files Browse the repository at this point in the history
  • Loading branch information
gaaclarke authored Apr 28, 2020
1 parent 027eff8 commit 5f437fb
Showing 1 changed file with 10 additions and 74 deletions.
84 changes: 10 additions & 74 deletions shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -127,9 +71,6 @@ @implementation FlutterViewController {
BOOL _viewOpaque;
BOOL _engineNeedsLaunch;
NSMutableSet<NSNumber*>* _ongoingTouches;
// Coalescer that filters out superfluous keyboard notifications when the app
// is being foregrounded.
fml::scoped_nsobject<FlutterCoalescer> _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:
Expand Down Expand Up @@ -226,11 +167,6 @@ - (void)performCommonViewControllerInitialization {
_statusBarStyle = UIStatusBarStyleDefault;

[self setupNotificationCenterObservers];

__block FlutterViewController* blockSelf = self;
_updateViewportMetrics.reset([[FlutterCoalescer alloc] initWithBlock:^{
[blockSelf updateViewportMetricsImplementation];
}]);
}

- (FlutterEngine*)engine {
Expand Down Expand Up @@ -668,7 +604,6 @@ - (void)dealloc {
userInfo:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[_ongoingTouches release];
[_updateViewportMetrics invalidate];
[super dealloc];
}

Expand All @@ -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.
Expand Down Expand Up @@ -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];
}

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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];

Expand Down

0 comments on commit 5f437fb

Please sign in to comment.