From ab68c7d3a4307f4edfc7d7c0c5748077658221e9 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 16 Jul 2020 16:03:36 -0700 Subject: [PATCH] fix On iOS, dialog titles are announced twice --- .../darwin/ios/framework/Source/SemanticsObject.h | 2 +- .../ios/framework/Source/SemanticsObject.mm | 15 ++++++++------- .../ios/framework/Source/accessibility_bridge.mm | 3 +-- .../framework/Source/accessibility_bridge_test.mm | 4 +++- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.h b/shell/platform/darwin/ios/framework/Source/SemanticsObject.h index 1f98e137f308d..793d8981bab43 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.h +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.h @@ -93,7 +93,7 @@ constexpr int32_t kRootNodeId = 0; - (BOOL)nodeWillCauseScroll:(const flutter::SemanticsNode*)node; - (BOOL)nodeShouldTriggerAnnouncement:(const flutter::SemanticsNode*)node; - (void)collectRoutes:(NSMutableArray*)edges; -- (NSString*)routeName; +- (SemanticsObject*)routeFocusObject; - (BOOL)onCustomAccessibilityAction:(FlutterCustomAccessibilityAction*)action; @end diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm index 8819e6374c856..2addc2a50932f 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm @@ -282,20 +282,21 @@ - (BOOL)onCustomAccessibilityAction:(FlutterCustomAccessibilityAction*)action { return YES; } -- (NSString*)routeName { - // Returns the first non-null and non-empty semantic label of a child - // with an NamesRoute flag. Otherwise returns nil. +- (SemanticsObject*)routeFocusObject { + // Returns the first SemanticObject in this branch that has + // the NamesRoute flag with a non-nil semantic label. Otherwise + // returns nil. if ([self node].HasFlag(flutter::SemanticsFlags::kNamesRoute)) { NSString* newName = [self accessibilityLabel]; if (newName != nil && [newName length] > 0) { - return newName; + return self; } } if ([self hasChildren]) { for (SemanticsObject* child in self.children) { - NSString* newName = [child routeName]; - if (newName != nil && [newName length] > 0) { - return newName; + SemanticsObject* focusObject = [child routeFocusObject]; + if (focusObject != nil) { + return focusObject; } } } diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index aba324180e881..6fd197e69ceb2 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -199,9 +199,8 @@ void PostAccessibilityNotification(UIAccessibilityNotifications notification, layoutChanged = layoutChanged || [doomed_uids count] > 0; if (routeChanged) { if (!ios_delegate_->IsFlutterViewControllerPresentingModalViewController(view_)) { - NSString* routeName = [lastAdded routeName]; ios_delegate_->PostAccessibilityNotification(UIAccessibilityScreenChangedNotification, - routeName); + [lastAdded routeFocusObject]); } } else if (layoutChanged) { // TODO(goderbauer): figure out which node to focus next. diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm index 47a0b0c0272b7..b6e07133672e1 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm @@ -311,7 +311,9 @@ - (void)testAnnouncesRouteChanges { bridge->UpdateSemantics(/*nodes=*/nodes, /*actions=*/actions); XCTAssertEqual([accessibility_notifications count], 1ul); - XCTAssertEqualObjects(accessibility_notifications[0][@"argument"], @"route"); + SemanticsObject* focusObject = accessibility_notifications[0][@"argument"]; + XCTAssertEqual([focusObject uid], 1); + XCTAssertEqualObjects([focusObject accessibilityLabel], @"route"); XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue], UIAccessibilityScreenChangedNotification); }