Skip to content

Commit a2046ae

Browse files
authored
Revert "fix On iOS, dialog titles are announced twice (flutter#19826)" (flutter#21714)
1 parent 8be6cc0 commit a2046ae

File tree

4 files changed

+16
-21
lines changed

4 files changed

+16
-21
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ constexpr int32_t kRootNodeId = 0;
9393
- (BOOL)nodeWillCauseScroll:(const flutter::SemanticsNode*)node;
9494
- (BOOL)nodeShouldTriggerAnnouncement:(const flutter::SemanticsNode*)node;
9595
- (void)collectRoutes:(NSMutableArray<SemanticsObject*>*)edges;
96-
- (SemanticsObject*)routeFocusObject;
96+
- (NSString*)routeName;
9797
- (BOOL)onCustomAccessibilityAction:(FlutterCustomAccessibilityAction*)action;
9898

9999
@end

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -282,21 +282,20 @@ - (BOOL)onCustomAccessibilityAction:(FlutterCustomAccessibilityAction*)action {
282282
return YES;
283283
}
284284

285-
- (SemanticsObject*)routeFocusObject {
286-
// Returns the first SemanticObject in this branch that has
287-
// the NamesRoute flag with a non-nil semantic label. Otherwise
288-
// returns nil.
285+
- (NSString*)routeName {
286+
// Returns the first non-null and non-empty semantic label of a child
287+
// with an NamesRoute flag. Otherwise returns nil.
289288
if ([self node].HasFlag(flutter::SemanticsFlags::kNamesRoute)) {
290289
NSString* newName = [self accessibilityLabel];
291290
if (newName != nil && [newName length] > 0) {
292-
return self;
291+
return newName;
293292
}
294293
}
295294
if ([self hasChildren]) {
296295
for (SemanticsObject* child in self.children) {
297-
SemanticsObject* focusObject = [child routeFocusObject];
298-
if (focusObject != nil) {
299-
return focusObject;
296+
NSString* newName = [child routeName];
297+
if (newName != nil && [newName length] > 0) {
298+
return newName;
300299
}
301300
}
302301
}

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,9 @@ void PostAccessibilityNotification(UIAccessibilityNotifications notification,
198198
// We should send out only one notification per semantics update.
199199
if (routeChanged) {
200200
if (!ios_delegate_->IsFlutterViewControllerPresentingModalViewController(view_controller_)) {
201-
SemanticsObject* nextToFocus = [lastAdded routeFocusObject];
202-
if (!nextToFocus && root) {
203-
nextToFocus = FindFirstFocusable(root);
204-
}
201+
NSString* routeName = [lastAdded routeName];
205202
ios_delegate_->PostAccessibilityNotification(UIAccessibilityScreenChangedNotification,
206-
nextToFocus);
203+
routeName);
207204
}
208205
} else if (layoutChanged) {
209206
SemanticsObject* nextToFocus = nil;

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -328,9 +328,7 @@ - (void)testAnnouncesRouteChanges {
328328
bridge->UpdateSemantics(/*nodes=*/nodes, /*actions=*/actions);
329329

330330
XCTAssertEqual([accessibility_notifications count], 1ul);
331-
SemanticsObject* focusObject = accessibility_notifications[0][@"argument"];
332-
XCTAssertEqual([focusObject uid], 3);
333-
XCTAssertEqualObjects([focusObject accessibilityLabel], @"node3");
331+
XCTAssertEqualObjects(accessibility_notifications[0][@"argument"], @"node3");
334332
XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue],
335333
UIAccessibilityScreenChangedNotification);
336334
}
@@ -373,7 +371,8 @@ - (void)testAnnouncesRouteChangesWhenNoNamesRoute {
373371
flutter::SemanticsNode node1;
374372
node1.id = 1;
375373
node1.label = "node1";
376-
node1.flags = static_cast<int32_t>(flutter::SemanticsFlags::kScopesRoute);
374+
node1.flags = static_cast<int32_t>(flutter::SemanticsFlags::kScopesRoute) |
375+
static_cast<int32_t>(flutter::SemanticsFlags::kNamesRoute);
377376
node1.childrenInTraversalOrder = {2, 3};
378377
node1.childrenInHitTestOrder = {2, 3};
379378
nodes[node1.id] = node1;
@@ -394,9 +393,9 @@ - (void)testAnnouncesRouteChangesWhenNoNamesRoute {
394393

395394
// Notification should focus first focusable node, which is node1.
396395
XCTAssertEqual([accessibility_notifications count], 1ul);
397-
SemanticsObject* focusObject = accessibility_notifications[0][@"argument"];
398-
XCTAssertEqual([focusObject uid], 2);
399-
XCTAssertEqualObjects([focusObject accessibilityLabel], @"node2");
396+
id focusObject = accessibility_notifications[0][@"argument"];
397+
XCTAssertTrue([focusObject isKindOfClass:[NSString class]]);
398+
XCTAssertEqualObjects(focusObject, @"node1");
400399
XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue],
401400
UIAccessibilityScreenChangedNotification);
402401
}

0 commit comments

Comments
 (0)