Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit bf635ab

Browse files
committed
nits
1 parent 7372ec3 commit bf635ab

File tree

6 files changed

+38
-43
lines changed

6 files changed

+38
-43
lines changed

shell/platform/darwin/ios/framework/Source/FlutterEngine.mm

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -990,20 +990,19 @@ - (void)flutterTextInputViewDidResignFirstResponder:(FlutterTextInputView*)textI
990990
// Platform view's first responder detection logic
991991
//
992992
// All text input widgets (e.g. EditableText) are backed by a dummy UITextInput view
993-
// in the text input plugin. When this dummy UITextInput view resigns first responder,
993+
// in the TextInputPlugin. When this dummy UITextInput view resigns first responder,
994994
// check if any platform view becomes first responder. If any platform view becomes
995995
// first responder, send a "viewFocused" channel message to inform the framework to un-focus
996996
// the previously focused text input.
997997
//
998998
// Caveat:
999999
// 1. This detection logic does not cover the scenario when a platform view becomes
10001000
// first responder without any flutter text input resigning its first responder status
1001-
// (e.g. user tapping on platform view first). For now it works fine because there can only be
1002-
// one first responder in iOS, so we do not need to keep platform view's first responder status
1003-
// in the text input plugin (which is different from Android implementation).
1001+
// (e.g. user tapping on platform view first). For now it works fine because the TextInputPlugin
1002+
// does not track the focused platform view id (which is different from Android implementation).
10041003
//
10051004
// 2. This detection logic assumes that all text input widgets are backed by a dummy
1006-
// UITextInput view in the text input plugin, which may not hold true in the future.
1005+
// UITextInput view in the TextInputPlugin, which may not hold true in the future.
10071006

10081007
// Have to check in the next run loop, because iOS requests the previous first responder to
10091008
// resign before requesting the next view to become first responder.

shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
#import "flutter/shell/platform/darwin/ios/ios_surface_gl.h"
2121

2222
@implementation UIView (FirstResponder)
23-
- (BOOL)hasFirstResponderInViewHierarchySubtree {
23+
- (BOOL)flt_hasFirstResponderInViewHierarchySubtree {
2424
if (self.isFirstResponder) {
2525
return YES;
2626
}
2727
for (UIView* subview in self.subviews) {
28-
if (subview.hasFirstResponderInViewHierarchySubtree) {
28+
if (subview.flt_hasFirstResponderInViewHierarchySubtree) {
2929
return YES;
3030
}
3131
}
@@ -344,7 +344,7 @@ - (BOOL)hasFirstResponderInViewHierarchySubtree {
344344

345345
long FlutterPlatformViewsController::FindFirstResponderPlatformViewId() {
346346
for (auto const& [id, root_view] : root_views_) {
347-
if ([(UIView*)root_view.get() hasFirstResponderInViewHierarchySubtree]) {
347+
if ((UIView*)(root_view.get()).flt_hasFirstResponderInViewHierarchySubtree) {
348348
return id;
349349
}
350350
}

shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,10 +1113,10 @@ - (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstRespon
11131113

11141114
[textField becomeFirstResponder];
11151115
XCTAssertTrue(textField.isFirstResponder);
1116-
XCTAssertTrue(textField.hasFirstResponderInViewHierarchySubtree);
1116+
XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
11171117
[textField resignFirstResponder];
11181118
XCTAssertFalse(textField.isFirstResponder);
1119-
XCTAssertFalse(textField.hasFirstResponderInViewHierarchySubtree);
1119+
XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
11201120
}
11211121

11221122
- (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
@@ -1131,10 +1131,10 @@ - (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstRe
11311131

11321132
[textField becomeFirstResponder];
11331133
XCTAssertTrue(textField.isFirstResponder);
1134-
XCTAssertTrue(view.hasFirstResponderInViewHierarchySubtree);
1134+
XCTAssertTrue(view.flt_hasFirstResponderInViewHierarchySubtree);
11351135
[textField resignFirstResponder];
11361136
XCTAssertFalse(textField.isFirstResponder);
1137-
XCTAssertFalse(view.hasFirstResponderInViewHierarchySubtree);
1137+
XCTAssertFalse(view.flt_hasFirstResponderInViewHierarchySubtree);
11381138
}
11391139

11401140
@end

shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ class FlutterPlatformViewsController {
335335

336336
@interface UIView (FirstResponder)
337337
// Returns YES if a view or any of its descendant view is the first responder. Returns NO otherwise.
338-
@property(nonatomic, readonly) BOOL hasFirstResponderInViewHierarchySubtree;
338+
@property(nonatomic, readonly) BOOL flt_hasFirstResponderInViewHierarchySubtree;
339339
@end
340340

341341
#endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_

shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.mm

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2081,7 +2081,8 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
20812081
[self setTextInputClient:[args[0] intValue] withConfiguration:args[1]];
20822082
result(nil);
20832083
} else if ([method isEqualToString:kSetPlatformViewClientMethod]) {
2084-
[self setPlatformViewTextInputClient:[args[@"platformViewId"] longValue]];
2084+
// This method call has a `platformViewId` argument, but we do not need it for iOS for now.
2085+
[self setPlatformViewTextInputClient];
20852086
result(nil);
20862087
} else if ([method isEqualToString:kSetEditingStateMethod]) {
20872088
[self setTextInputEditingState:args];
@@ -2199,10 +2200,10 @@ - (void)triggerAutofillSave:(BOOL)saveEntries {
21992200
[self addToInputParentViewIfNeeded:_activeView];
22002201
}
22012202

2202-
- (void)setPlatformViewTextInputClient:(long)platformViewID {
2203-
// No need to track the platformViewID for now (unlike in Android), because in iOS there can
2204-
// only be one single first responder. When a platform view becomes first responder, hide
2205-
// this dummy text input view (`_activeView`) for the previously focused widget.
2203+
- (void)setPlatformViewTextInputClient {
2204+
// No need to track the platformViewID (unlike in Android). When a platform view
2205+
// becomes the first responder, simply hide this dummy text input view (`_activeView`)
2206+
// for the previously focused widget.
22062207
[self removeEnableFlutterTextInputViewAccessibilityTimer];
22072208
_activeView.accessibilityEnabled = NO;
22082209
[_activeView removeFromSuperview];

shell/platform/darwin/ios/framework/Source/FlutterTextInputPluginTest.mm

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ - (void)setUp {
8888

8989
textInputPlugin = [[FlutterTextInputPlugin alloc] initWithDelegate:engine];
9090

91-
viewController = [FlutterViewController new];
91+
viewController = [[FlutterViewController alloc] init];
9292
textInputPlugin.viewController = viewController;
9393

9494
// Clear pasteboard between tests.
@@ -167,7 +167,7 @@ - (FlutterTextRange*)getLineRangeFromTokenizer:(id<UITextInputTokenizer>)tokeniz
167167
#pragma mark - Tests
168168
- (void)testNoDanglingEnginePointer {
169169
__weak FlutterTextInputPlugin* weakFlutterTextInputPlugin;
170-
FlutterViewController* flutterViewController = [FlutterViewController new];
170+
FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
171171
__weak FlutterEngine* weakFlutterEngine;
172172

173173
FlutterTextInputView* currentView;
@@ -1825,7 +1825,7 @@ - (void)testFlutterTokenizerCanParseLines {
18251825
}
18261826

18271827
- (void)testFlutterTextInputPluginRetainsFlutterTextInputView {
1828-
FlutterViewController* flutterViewController = [FlutterViewController new];
1828+
FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
18291829
FlutterTextInputPlugin* myInputPlugin = [[FlutterTextInputPlugin alloc] initWithDelegate:engine];
18301830
myInputPlugin.viewController = flutterViewController;
18311831

@@ -1858,7 +1858,7 @@ - (void)testFlutterTextInputPluginHostViewNilCrash {
18581858
}
18591859

18601860
- (void)testFlutterTextInputPluginHostViewNotNil {
1861-
FlutterViewController* flutterViewController = [FlutterViewController new];
1861+
FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
18621862
FlutterEngine* flutterEngine = [[FlutterEngine alloc] init];
18631863
[flutterEngine runWithEntrypoint:nil];
18641864
flutterEngine.viewController = flutterViewController;
@@ -1867,30 +1867,25 @@ - (void)testFlutterTextInputPluginHostViewNotNil {
18671867
}
18681868

18691869
- (void)testSetPlatformViewClient {
1870-
FlutterViewController* flutterViewController = [FlutterViewController new];
1870+
FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
18711871
FlutterTextInputPlugin* myInputPlugin = [[FlutterTextInputPlugin alloc] initWithDelegate:engine];
18721872
myInputPlugin.viewController = flutterViewController;
18731873

1874-
__weak UIView* activeView;
1875-
@autoreleasepool {
1876-
FlutterMethodCall* setClientCall = [FlutterMethodCall
1877-
methodCallWithMethodName:@"TextInput.setClient"
1878-
arguments:@[
1879-
[NSNumber numberWithInt:123], self.mutablePasswordTemplateCopy
1880-
]];
1881-
[myInputPlugin handleMethodCall:setClientCall
1882-
result:^(id _Nullable result){
1883-
}];
1884-
activeView = myInputPlugin.textInputView;
1885-
XCTAssertNotNil(activeView.superview, @"activeView must be added to the view hierarchy.");
1886-
FlutterMethodCall* setPlatformViewClientCall = [FlutterMethodCall
1887-
methodCallWithMethodName:@"TextInput.setPlatformViewClient"
1888-
arguments:@{@"platformViewId" : [NSNumber numberWithLong:456]}];
1889-
[myInputPlugin handleMethodCall:setPlatformViewClientCall
1890-
result:^(id _Nullable result){
1891-
}];
1892-
XCTAssertNil(activeView.superview, @"activeView must be removed from view hierarchy.");
1893-
}
1874+
FlutterMethodCall* setClientCall = [FlutterMethodCall
1875+
methodCallWithMethodName:@"TextInput.setClient"
1876+
arguments:@[ [NSNumber numberWithInt:123], self.mutablePasswordTemplateCopy ]];
1877+
[myInputPlugin handleMethodCall:setClientCall
1878+
result:^(id _Nullable result){
1879+
}];
1880+
UIView* activeView = myInputPlugin.textInputView;
1881+
XCTAssertNotNil(activeView.superview, @"activeView must be added to the view hierarchy.");
1882+
FlutterMethodCall* setPlatformViewClientCall = [FlutterMethodCall
1883+
methodCallWithMethodName:@"TextInput.setPlatformViewClient"
1884+
arguments:@{@"platformViewId" : [NSNumber numberWithLong:456]}];
1885+
[myInputPlugin handleMethodCall:setPlatformViewClientCall
1886+
result:^(id _Nullable result){
1887+
}];
1888+
XCTAssertNil(activeView.superview, @"activeView must be removed from view hierarchy.");
18941889
}
18951890

18961891
@end

0 commit comments

Comments
 (0)