From 4858609726bc7f8b80e50d9bfa691868dee1b76b Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 4 May 2023 16:44:21 -0700 Subject: [PATCH 01/34] Update AccessibilityBridge.java handle focus add focus action Update accessibility_bridge.mm 2 update focus 1 --- .../engine/systemchannels/AccessibilityChannel.java | 11 +++++++++++ .../android/io/flutter/view/AccessibilityBridge.java | 8 ++++++++ .../ios/framework/Source/accessibility_bridge.mm | 5 +++++ 3 files changed, 24 insertions(+) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java index 3fb32814f56b8..ecc60996792e3 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -67,6 +67,14 @@ public void onMessage( } break; } + case "focus": + { + Integer nodeId = (Integer) annotatedEvent.get("nodeId"); + if (nodeId != null) { + handler.onFocus(nodeId); + } + break; + } case "tooltip": { String tooltipMessage = (String) data.get("message"); @@ -176,6 +184,9 @@ public interface AccessibilityMessageHandler extends FlutterJNI.AccessibilityDel /** The user has long pressed on the widget with the given {@code nodeId}. */ void onLongPress(int nodeId); + /** Focus on the widget with the given {@code nodeId}. */ + void onFocus(int nodeId); + /** The user has opened a tooltip. */ void onTooltip(@NonNull String message); } diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index b121f531e2f1e..06e8544bbf5a0 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -309,6 +309,13 @@ public void onLongPress(int nodeId) { sendAccessibilityEvent(nodeId, AccessibilityEvent.TYPE_VIEW_LONG_CLICKED); } + /** The user has requested focus on the given {@code nodeId}. */ + @Override + public void onFocus(int nodeId) { + sendAccessibilityEvent(nodeId, AccessibilityEvent.TYPE_VIEW_FOCUSED); + rootAccessibilityView.announceForAccessibility("hahaha"); + } + /** The user has opened a tooltip. */ @Override public void onTooltip(@NonNull String message) { @@ -655,6 +662,7 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { result.setClassName("android.view.View"); result.setSource(rootAccessibilityView, virtualViewId); result.setFocusable(semanticsNode.isFocusable()); + result.setUniqueId(Integer.toString(semanticsNode.id)); if (inputFocusedSemanticsNode != null) { result.setFocused(inputFocusedSemanticsNode.id == virtualViewId); } diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index 4f8525a1aa158..9e76deda30618 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -362,6 +362,11 @@ static bool DidFlagChange(const flutter::SemanticsNode& oldNode, NSString* message = annotatedEvent[@"data"][@"message"]; ios_delegate_->PostAccessibilityNotification(UIAccessibilityAnnouncementNotification, message); } + if ([type isEqualToString:@"focus"]) { + int32_t nodeId = [annotatedEvent[@"nodeId"] intValue]; + ios_delegate_->PostAccessibilityNotification(UIAccessibilityLayoutChangedNotification, + objects_.get()[@(nodeId)]); + } } fml::WeakPtr AccessibilityBridge::GetWeakPtr() { From 45b8b13997a47fec666e948572fe3dad0b58ce85 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Fri, 5 May 2023 10:16:49 -0700 Subject: [PATCH 02/34] Update AccessibilityBridge.java --- shell/platform/android/io/flutter/view/AccessibilityBridge.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 06e8544bbf5a0..6eb7d9c8d8e23 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -313,7 +313,6 @@ public void onLongPress(int nodeId) { @Override public void onFocus(int nodeId) { sendAccessibilityEvent(nodeId, AccessibilityEvent.TYPE_VIEW_FOCUSED); - rootAccessibilityView.announceForAccessibility("hahaha"); } /** The user has opened a tooltip. */ @@ -662,7 +661,6 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { result.setClassName("android.view.View"); result.setSource(rootAccessibilityView, virtualViewId); result.setFocusable(semanticsNode.isFocusable()); - result.setUniqueId(Integer.toString(semanticsNode.id)); if (inputFocusedSemanticsNode != null) { result.setFocused(inputFocusedSemanticsNode.id == virtualViewId); } From 7860617b3cdc358d60fbe68ec811f2b9bc9b6a5a Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 9 May 2023 12:50:04 -0700 Subject: [PATCH 03/34] Update AccessibilityChannelTest.java Update AccessibilityChannelTest.java Update AccessibilityChannelTest.java Update AccessibilityChannelTest.java Update accessibility_bridge.h ios test Update AccessibilityChannelTest.java Update AccessibilityChannelTest.java Update AccessibilityChannelTest.java Update AccessibilityChannelTest.java Update AccessibilityChannelTest.java Update accessibility_bridge_test.mm Update accessibility_bridge_test.mm Update accessibility_bridge_test.mm Update accessibility_bridge_test.mm --- .../AccessibilityChannelTest.java | 16 +++++++ .../framework/Source/accessibility_bridge.h | 2 +- .../Source/accessibility_bridge_test.mm | 45 +++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java index adf121a99fdbb..8aa5a1137ca71 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java @@ -7,6 +7,7 @@ import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.plugin.common.BasicMessageChannel; +import java.util.HashMap; import org.json.JSONException; import org.json.JSONObject; import org.junit.Test; @@ -30,4 +31,19 @@ public void repliesWhenNoAccessibilityHandler() throws JSONException { accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); verify(reply).reply(null); } + + @Test + public void handleFocus() throws JSONException { + AccessibilityChannel accessibilityChannel = + new AccessibilityChannel(mock(DartExecutor.class), mock(FlutterJNI.class)); + HashMap arguments = new HashMap<>(); + arguments.put("type", "focus1"); + arguments.put("nodeId", "123"); + AccessibilityChannel.AccessibilityMessageHandler handler = + mock(AccessibilityChannel.AccessibilityMessageHandler.class); + accessibilityChannel.setAccessibilityMessageHandler(handler); + BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); + accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); + verify(handler).onFocus(123); + } } diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h index bebb2e7e699c1..451dbce83db42 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.h @@ -57,6 +57,7 @@ class AccessibilityBridge final : public AccessibilityBridgeIos { void UpdateSemantics(flutter::SemanticsNodeUpdates nodes, const flutter::CustomAccessibilityActionUpdates& actions); + void HandleEvent(NSDictionary* annotatedEvent); void DispatchSemanticsAction(int32_t id, flutter::SemanticsAction action) override; void DispatchSemanticsAction(int32_t id, flutter::SemanticsAction action, @@ -88,7 +89,6 @@ class AccessibilityBridge final : public AccessibilityBridgeIos { SemanticsObject* FindFirstFocusable(SemanticsObject* parent); void VisitObjectsRecursivelyAndRemove(SemanticsObject* object, NSMutableArray* doomed_uids); - void HandleEvent(NSDictionary* annotatedEvent); FlutterViewController* view_controller_; PlatformViewIOS* platform_view_; 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 c617284489e73..47a265d8a75e1 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm @@ -1289,6 +1289,51 @@ - (void)testAnnouncesRouteChangesRemoveRouteInMiddle { UIAccessibilityScreenChangedNotification); } +- (void)testHandleEvent { + flutter::MockDelegate mock_delegate; + auto thread_task_runner = CreateNewThread("AccessibilityBridgeTest"); + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/thread_task_runner, + /*raster=*/thread_task_runner, + /*ui=*/thread_task_runner, + /*io=*/thread_task_runner); + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/nil, + /*task_runners=*/runners); + id mockFlutterView = OCMClassMock([FlutterView class]); + id mockFlutterViewController = OCMClassMock([FlutterViewController class]); + OCMStub([mockFlutterViewController view]).andReturn(mockFlutterView); + + NSMutableArray*>* accessibility_notifications = + [[[NSMutableArray alloc] init] autorelease]; + auto ios_delegate = std::make_unique(); + ios_delegate->on_PostAccessibilityNotification_ = + [accessibility_notifications](UIAccessibilityNotifications notification, id argument) { + [accessibility_notifications addObject:@{ + @"notification" : @(notification), + @"argument" : argument ? argument : [NSNull null], + }]; + }; + __block auto bridge = + std::make_unique(/*view_controller=*/mockFlutterViewController, + /*platform_view=*/platform_view.get(), + /*platform_views_controller=*/nil, + /*ios_delegate=*/std::move(ios_delegate)); + + NSDictionary* annotatedEvent = @{@"type" : @"focus", @"nodeId" : @123}; + + bridge->HandleEvent(annotatedEvent); + + XCTAssertEqual([accessibility_notifications count], 1ul); + // id focusObject = accessibility_notifications[0][@"argument"]; + // XCTAssertTrue([focusObject isKindOfClass:[NSString class]]); + // XCTAssertEqualObjects(focusObject, @"node1"); + XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue], + UIAccessibilityLayoutChangedNotification); +} + - (void)testAnnouncesRouteChangesWhenNoNamesRoute { flutter::MockDelegate mock_delegate; auto thread_task_runner = CreateNewThread("AccessibilityBridgeTest"); From 7d44ee2c9f69479bae89a142a81b39b64804d4b0 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 9 May 2023 18:42:13 -0700 Subject: [PATCH 04/34] Update accessibility_bridge_test.mm --- .../darwin/ios/framework/Source/accessibility_bridge_test.mm | 3 --- 1 file changed, 3 deletions(-) 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 47a265d8a75e1..cd05f7f8883b7 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm @@ -1327,9 +1327,6 @@ - (void)testHandleEvent { bridge->HandleEvent(annotatedEvent); XCTAssertEqual([accessibility_notifications count], 1ul); - // id focusObject = accessibility_notifications[0][@"argument"]; - // XCTAssertTrue([focusObject isKindOfClass:[NSString class]]); - // XCTAssertEqualObjects(focusObject, @"node1"); XCTAssertEqual([accessibility_notifications[0][@"notification"] unsignedIntValue], UIAccessibilityLayoutChangedNotification); } From ec80ed301820bc4e7fcf59e25cf808e2ed55ea90 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 10 May 2023 19:22:48 -0700 Subject: [PATCH 05/34] test --- .../engine/systemchannels/AccessibilityChannelTest.java | 2 +- .../darwin/ios/framework/Source/accessibility_bridge.mm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java index 8aa5a1137ca71..6669665febebf 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java @@ -37,7 +37,7 @@ public void handleFocus() throws JSONException { AccessibilityChannel accessibilityChannel = new AccessibilityChannel(mock(DartExecutor.class), mock(FlutterJNI.class)); HashMap arguments = new HashMap<>(); - arguments.put("type", "focus1"); + arguments.put("type", "focus"); arguments.put("nodeId", "123"); AccessibilityChannel.AccessibilityMessageHandler handler = mock(AccessibilityChannel.AccessibilityMessageHandler.class); diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index 9e76deda30618..955de2c6d342f 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -363,9 +363,9 @@ static bool DidFlagChange(const flutter::SemanticsNode& oldNode, ios_delegate_->PostAccessibilityNotification(UIAccessibilityAnnouncementNotification, message); } if ([type isEqualToString:@"focus"]) { - int32_t nodeId = [annotatedEvent[@"nodeId"] intValue]; + SemanticsObject* node = objects_.get()[@([annotatedEvent[@"nodeId"] intValue])]; ios_delegate_->PostAccessibilityNotification(UIAccessibilityLayoutChangedNotification, - objects_.get()[@(nodeId)]); + node); } } From 72803e1975df1ac284c5dbbe36ddda5dfe53067c Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 10 May 2023 19:23:26 -0700 Subject: [PATCH 06/34] Update accessibility_bridge.mm --- .../darwin/ios/framework/Source/accessibility_bridge.mm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index 955de2c6d342f..e5faf6ad6b6c7 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -364,8 +364,7 @@ static bool DidFlagChange(const flutter::SemanticsNode& oldNode, } if ([type isEqualToString:@"focus"]) { SemanticsObject* node = objects_.get()[@([annotatedEvent[@"nodeId"] intValue])]; - ios_delegate_->PostAccessibilityNotification(UIAccessibilityLayoutChangedNotification, - node); + ios_delegate_->PostAccessibilityNotification(UIAccessibilityLayoutChangedNotification, node); } } From 7218a2f664870c5bc792ebc175a671dca1cfec85 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 11 May 2023 08:47:07 -0700 Subject: [PATCH 07/34] Update AccessibilityChannelTest.java --- .../engine/systemchannels/AccessibilityChannelTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java index 6669665febebf..5ee17c647983a 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/AccessibilityChannelTest.java @@ -38,7 +38,7 @@ public void handleFocus() throws JSONException { new AccessibilityChannel(mock(DartExecutor.class), mock(FlutterJNI.class)); HashMap arguments = new HashMap<>(); arguments.put("type", "focus"); - arguments.put("nodeId", "123"); + arguments.put("nodeId", 123); AccessibilityChannel.AccessibilityMessageHandler handler = mock(AccessibilityChannel.AccessibilityMessageHandler.class); accessibilityChannel.setAccessibilityMessageHandler(handler); From fbde877915c636ffa9a868612f8397e2e9482f70 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 11 May 2023 09:32:27 -0700 Subject: [PATCH 08/34] comment --- .../embedding/engine/systemchannels/AccessibilityChannel.java | 2 +- shell/platform/android/io/flutter/view/AccessibilityBridge.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java index ecc60996792e3..d584bee31eb2a 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -184,7 +184,7 @@ public interface AccessibilityMessageHandler extends FlutterJNI.AccessibilityDel /** The user has long pressed on the widget with the given {@code nodeId}. */ void onLongPress(int nodeId); - /** Focus on the widget with the given {@code nodeId}. */ + /** The framework has requested focus on the semantics node with the given {@code nodeId}. */ void onFocus(int nodeId); /** The user has opened a tooltip. */ diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 6eb7d9c8d8e23..02ee838834c62 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -309,7 +309,7 @@ public void onLongPress(int nodeId) { sendAccessibilityEvent(nodeId, AccessibilityEvent.TYPE_VIEW_LONG_CLICKED); } - /** The user has requested focus on the given {@code nodeId}. */ + /** The framework has requested focus on the given {@code nodeId}. */ @Override public void onFocus(int nodeId) { sendAccessibilityEvent(nodeId, AccessibilityEvent.TYPE_VIEW_FOCUSED); From 6d2eb066577db4678ef5cc8c456e0938fbd763f5 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 11 May 2023 09:33:32 -0700 Subject: [PATCH 09/34] Update AccessibilityChannel.java --- .../embedding/engine/systemchannels/AccessibilityChannel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java index d584bee31eb2a..a578705e6d2c5 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -178,10 +178,10 @@ public interface AccessibilityMessageHandler extends FlutterJNI.AccessibilityDel /** The Dart application would like the given {@code message} to be announced. */ void announce(@NonNull String message); - /** The user has tapped on the widget with the given {@code nodeId}. */ + /** The user has tapped on the semantics node with the given {@code nodeId}. */ void onTap(int nodeId); - /** The user has long pressed on the widget with the given {@code nodeId}. */ + /** The user has long pressed on the semantics node with the given {@code nodeId}. */ void onLongPress(int nodeId); /** The framework has requested focus on the semantics node with the given {@code nodeId}. */ From b7628cb532dde986212d7d5750634cb646849834 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 11 May 2023 18:19:23 -0700 Subject: [PATCH 10/34] test --- .../flutter/view/AccessibilityBridgeTest.java | 32 +++++++++++++++++++ .../framework/Source/accessibility_bridge.mm | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 105d8a7a984b6..fafb911ccd986 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1827,6 +1827,38 @@ public void releaseDropsChannelMessageHandler() { verify(mockChannel, never()).setAccessibilityFeatures(anyInt()); } + @Test + public void sendFocusAccessibilityEvent() { + AccessibilityManager mockManager = mock(AccessibilityManager.class); + AccessibilityChannel accessibilityChannel = + new AccessibilityChannel(mock(DartExecutor.class), mock(FlutterJNI.class)); + + ContentResolver mockContentResolver = mock(ContentResolver.class); + View mockRootView = mock(View.class); + Context context = mock(Context.class); + when(mockRootView.getContext()).thenReturn(context); + when(context.getPackageName()).thenReturn("test"); + AccessibilityBridge accessibilityBridge = + setUpBridge(mockRootView, accessibilityChannel, mockManager, null,null); + + ViewParent mockParent = mock(ViewParent.class); + when(mockRootView.getParent()).thenReturn(mockParent); + when(mockManager.isEnabled()).thenReturn(true); + + HashMap arguments = new HashMap<>(); + arguments.put("type", "focus"); + arguments.put("nodeId", 123); + BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); + accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); + + + AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED); + event.setPackageName("test"); + event.setSource(mockRootView, 123); + + verify(mockParent).requestSendAccessibilityEvent(mockRootView,event); + } + AccessibilityBridge setUpBridge() { return setUpBridge(null, null, null, null, null, null); } diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index e5faf6ad6b6c7..2121a2ac69586 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -363,7 +363,7 @@ static bool DidFlagChange(const flutter::SemanticsNode& oldNode, ios_delegate_->PostAccessibilityNotification(UIAccessibilityAnnouncementNotification, message); } if ([type isEqualToString:@"focus"]) { - SemanticsObject* node = objects_.get()[@([annotatedEvent[@"nodeId"] intValue])]; + SemanticsObject* node = objects_.get()[annotatedEvent[@"nodeId"]]; ios_delegate_->PostAccessibilityNotification(UIAccessibilityLayoutChangedNotification, node); } } From 804ee5bfdb4b81615e559c9aa59ee2605a6944e1 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 11 May 2023 18:19:54 -0700 Subject: [PATCH 11/34] Update AccessibilityBridgeTest.java --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index fafb911ccd986..a77986f5931a4 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1831,7 +1831,7 @@ public void releaseDropsChannelMessageHandler() { public void sendFocusAccessibilityEvent() { AccessibilityManager mockManager = mock(AccessibilityManager.class); AccessibilityChannel accessibilityChannel = - new AccessibilityChannel(mock(DartExecutor.class), mock(FlutterJNI.class)); + new AccessibilityChannel(mock(DartExecutor.class), mock(FlutterJNI.class)); ContentResolver mockContentResolver = mock(ContentResolver.class); View mockRootView = mock(View.class); @@ -1839,7 +1839,7 @@ public void sendFocusAccessibilityEvent() { when(mockRootView.getContext()).thenReturn(context); when(context.getPackageName()).thenReturn("test"); AccessibilityBridge accessibilityBridge = - setUpBridge(mockRootView, accessibilityChannel, mockManager, null,null); + setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null); ViewParent mockParent = mock(ViewParent.class); when(mockRootView.getParent()).thenReturn(mockParent); @@ -1851,12 +1851,11 @@ public void sendFocusAccessibilityEvent() { BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); - AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED); event.setPackageName("test"); event.setSource(mockRootView, 123); - verify(mockParent).requestSendAccessibilityEvent(mockRootView,event); + verify(mockParent).requestSendAccessibilityEvent(mockRootView, event); } AccessibilityBridge setUpBridge() { From 1e4510806f07eb6a6d577a900b9af1588b193d0e Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 11 May 2023 18:31:03 -0700 Subject: [PATCH 12/34] Update AccessibilityBridgeTest.java --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index a77986f5931a4..7226eba5dc127 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -57,6 +57,11 @@ import org.mockito.invocation.InvocationOnMock; import org.robolectric.annotation.Config; +import io.flutter.embedding.engine.FlutterJNI; +import io.flutter.embedding.engine.dart.DartExecutor; +import io.flutter.plugin.common.BasicMessageChannel; +import java.util.HashMap; + @Config(manifest = Config.NONE) @RunWith(AndroidJUnit4.class) @TargetApi(19) From 052e7fa91aa7a1f07a1d65f41f1e7d5bc42ea3db Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 11 May 2023 18:31:33 -0700 Subject: [PATCH 13/34] Update AccessibilityBridgeTest.java --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 7226eba5dc127..5b5112bb586b2 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -44,12 +44,16 @@ import android.view.accessibility.AccessibilityNodeInfo; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import io.flutter.embedding.engine.FlutterJNI; +import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.systemchannels.AccessibilityChannel; +import io.flutter.plugin.common.BasicMessageChannel; import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate; import io.flutter.view.AccessibilityBridge.Flag; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -57,11 +61,6 @@ import org.mockito.invocation.InvocationOnMock; import org.robolectric.annotation.Config; -import io.flutter.embedding.engine.FlutterJNI; -import io.flutter.embedding.engine.dart.DartExecutor; -import io.flutter.plugin.common.BasicMessageChannel; -import java.util.HashMap; - @Config(manifest = Config.NONE) @RunWith(AndroidJUnit4.class) @TargetApi(19) From b9456ca8ba3dfcffb01c01b1b7e4668870cccc32 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Fri, 12 May 2023 13:06:41 -0700 Subject: [PATCH 14/34] Update AccessibilityChannel.java --- .../embedding/engine/systemchannels/AccessibilityChannel.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java index a578705e6d2c5..55e2ffae2d3dd 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -24,8 +24,7 @@ public class AccessibilityChannel { @NonNull public final FlutterJNI flutterJNI; @Nullable private AccessibilityMessageHandler handler; - @VisibleForTesting - final BasicMessageChannel.MessageHandler parsingMessageHandler = + public final BasicMessageChannel.MessageHandler parsingMessageHandler = new BasicMessageChannel.MessageHandler() { @Override public void onMessage( From 9da2c8cac9fd22a33e6245742436371780b61477 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Fri, 12 May 2023 13:07:12 -0700 Subject: [PATCH 15/34] Update AccessibilityChannel.java --- .../embedding/engine/systemchannels/AccessibilityChannel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java index 55e2ffae2d3dd..38059232ce1a7 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -2,7 +2,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; import io.flutter.Log; import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.dart.DartExecutor; From 82cf3e261c7805b3dce9aedbdd8dafd21ff8c81a Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Fri, 12 May 2023 13:21:24 -0700 Subject: [PATCH 16/34] Update AccessibilityBridgeTest.java --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 5b5112bb586b2..d33f4b1fdab9d 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1843,7 +1843,7 @@ public void sendFocusAccessibilityEvent() { when(mockRootView.getContext()).thenReturn(context); when(context.getPackageName()).thenReturn("test"); AccessibilityBridge accessibilityBridge = - setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null); + setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null); ViewParent mockParent = mock(ViewParent.class); when(mockRootView.getParent()).thenReturn(mockParent); From f3a3b27f77d1b7fc8ecd84e6faee513f218edcf3 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Fri, 12 May 2023 13:48:31 -0700 Subject: [PATCH 17/34] Update AccessibilityBridgeTest.java --- .../io/flutter/view/AccessibilityBridgeTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index d33f4b1fdab9d..cf4d4066c2675 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1855,11 +1855,15 @@ public void sendFocusAccessibilityEvent() { BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); - AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_FOCUSED); - event.setPackageName("test"); - event.setSource(mockRootView, 123); - verify(mockParent).requestSendAccessibilityEvent(mockRootView, event); + + // Check that focus event was sent. + ArgumentCaptor eventCaptor = + ArgumentCaptor.forClass(AccessibilityEvent.class); + verify(mockParent) + .requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); + AccessibilityEvent event = eventCaptor.getAllValues().get(0); + assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); } AccessibilityBridge setUpBridge() { From 958c1afb5b949ea7b5b9dabaddff7adad3de02e1 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Fri, 12 May 2023 13:48:57 -0700 Subject: [PATCH 18/34] Update AccessibilityBridgeTest.java --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index cf4d4066c2675..b7a102c1c745d 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1855,13 +1855,10 @@ public void sendFocusAccessibilityEvent() { BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); - - - // Check that focus event was sent. - ArgumentCaptor eventCaptor = + // Check that focus event was sent. + ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(AccessibilityEvent.class); - verify(mockParent) - .requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); + verify(mockParent).requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); AccessibilityEvent event = eventCaptor.getAllValues().get(0); assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); } From 6a12f878b47affe5147c8dab1e47b9891dd50699 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Fri, 12 May 2023 14:38:04 -0700 Subject: [PATCH 19/34] Update AccessibilityBridgeTest.java --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index b7a102c1c745d..fe4aa2620fd01 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1842,13 +1842,13 @@ public void sendFocusAccessibilityEvent() { Context context = mock(Context.class); when(mockRootView.getContext()).thenReturn(context); when(context.getPackageName()).thenReturn("test"); - AccessibilityBridge accessibilityBridge = - setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null); - ViewParent mockParent = mock(ViewParent.class); when(mockRootView.getParent()).thenReturn(mockParent); when(mockManager.isEnabled()).thenReturn(true); + AccessibilityBridge accessibilityBridge = + setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null); + HashMap arguments = new HashMap<>(); arguments.put("type", "focus"); arguments.put("nodeId", 123); From a9167ba98bd07e1ef1af6177c3f5d0032ad7b8be Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 17 May 2023 13:47:46 -0700 Subject: [PATCH 20/34] Update AccessibilityBridgeTest.java --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index fe4aa2620fd01..05b28f38094ab 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1861,6 +1861,7 @@ public void sendFocusAccessibilityEvent() { verify(mockParent).requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); AccessibilityEvent event = eventCaptor.getAllValues().get(0); assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); + assertEquals(event.getSource().getVirtualDescendantId(0), 123); } AccessibilityBridge setUpBridge() { From e0ab00ae83b99a710b773876d20157e11dc819a7 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 17 May 2023 17:53:44 -0700 Subject: [PATCH 21/34] Update AccessibilityBridgeTest.java --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 05b28f38094ab..c054fc8d2624d 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1861,7 +1861,7 @@ public void sendFocusAccessibilityEvent() { verify(mockParent).requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); AccessibilityEvent event = eventCaptor.getAllValues().get(0); assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); - assertEquals(event.getSource().getVirtualDescendantId(0), 123); + assertEquals(event.getSource().getVirtualDescendantId(0L), 123); } AccessibilityBridge setUpBridge() { From 156ebcacdde51baed1b1087976e51aec25df32dc Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 17 May 2023 18:48:14 -0700 Subject: [PATCH 22/34] Update AccessibilityBridgeTest.java --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index c054fc8d2624d..713af4ba664ea 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1831,6 +1831,7 @@ public void releaseDropsChannelMessageHandler() { verify(mockChannel, never()).setAccessibilityFeatures(anyInt()); } + @TargetApi(31) @Test public void sendFocusAccessibilityEvent() { AccessibilityManager mockManager = mock(AccessibilityManager.class); From 7f829e8dc5f8ba24f5ab0e48613e88db6448e8fb Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 17 May 2023 20:06:16 -0700 Subject: [PATCH 23/34] Update AccessibilityBridgeTest.java --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 713af4ba664ea..22d7ec9602de8 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1831,7 +1831,6 @@ public void releaseDropsChannelMessageHandler() { verify(mockChannel, never()).setAccessibilityFeatures(anyInt()); } - @TargetApi(31) @Test public void sendFocusAccessibilityEvent() { AccessibilityManager mockManager = mock(AccessibilityManager.class); @@ -1862,7 +1861,7 @@ public void sendFocusAccessibilityEvent() { verify(mockParent).requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); AccessibilityEvent event = eventCaptor.getAllValues().get(0); assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); - assertEquals(event.getSource().getVirtualDescendantId(0L), 123); + assertEquals(event.getSourceNodeId(), 123L); } AccessibilityBridge setUpBridge() { From f18b6e12235275d789a67d04cf7a074b83edb887 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 17 May 2023 20:48:02 -0700 Subject: [PATCH 24/34] Update AccessibilityBridgeTest.java --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 22d7ec9602de8..52db897957d02 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1861,7 +1861,7 @@ public void sendFocusAccessibilityEvent() { verify(mockParent).requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); AccessibilityEvent event = eventCaptor.getAllValues().get(0); assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); - assertEquals(event.getSourceNodeId(), 123L); + assertEquals(event.getSource().getSourceNodeId(), 123L); } AccessibilityBridge setUpBridge() { From 423d5565423bc01b72212d46cf56adf012c1498c Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 18 May 2023 10:08:08 -0700 Subject: [PATCH 25/34] Update AccessibilityBridgeTest.java --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 52db897957d02..3f959e409905e 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1845,9 +1845,8 @@ public void sendFocusAccessibilityEvent() { ViewParent mockParent = mock(ViewParent.class); when(mockRootView.getParent()).thenReturn(mockParent); when(mockManager.isEnabled()).thenReturn(true); - - AccessibilityBridge accessibilityBridge = - setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null); + + AccessibilityBridge spyAccessibilityBridge = spy(setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null)); HashMap arguments = new HashMap<>(); arguments.put("type", "focus"); @@ -1855,13 +1854,14 @@ public void sendFocusAccessibilityEvent() { BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); + verify(spyAccessibilityBridge).obtainAccessibilityNodeInfo(eq(mockRootView),123); + // Check that focus event was sent. ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(AccessibilityEvent.class); verify(mockParent).requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); AccessibilityEvent event = eventCaptor.getAllValues().get(0); assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); - assertEquals(event.getSource().getSourceNodeId(), 123L); } AccessibilityBridge setUpBridge() { From dd5191e41229f6b794ce72a0d14b75be33562c07 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 18 May 2023 10:09:15 -0700 Subject: [PATCH 26/34] Update AccessibilityBridgeTest.java --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 3f959e409905e..5ed424b765b92 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1845,8 +1845,9 @@ public void sendFocusAccessibilityEvent() { ViewParent mockParent = mock(ViewParent.class); when(mockRootView.getParent()).thenReturn(mockParent); when(mockManager.isEnabled()).thenReturn(true); - - AccessibilityBridge spyAccessibilityBridge = spy(setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null)); + + AccessibilityBridge spyAccessibilityBridge = + spy(setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null)); HashMap arguments = new HashMap<>(); arguments.put("type", "focus"); @@ -1854,7 +1855,7 @@ public void sendFocusAccessibilityEvent() { BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); - verify(spyAccessibilityBridge).obtainAccessibilityNodeInfo(eq(mockRootView),123); + verify(spyAccessibilityBridge).obtainAccessibilityNodeInfo(eq(mockRootView), 123); // Check that focus event was sent. ArgumentCaptor eventCaptor = From 3a8bb9e94e4eb2f09a446d7a917b3e2f65ba81b0 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Thu, 18 May 2023 10:38:09 -0700 Subject: [PATCH 27/34] Update AccessibilityBridgeTest.java --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 5ed424b765b92..a0f3e89c223da 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1855,7 +1855,7 @@ public void sendFocusAccessibilityEvent() { BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); - verify(spyAccessibilityBridge).obtainAccessibilityNodeInfo(eq(mockRootView), 123); + verify(spyAccessibilityBridge).obtainAccessibilityNodeInfo(eq(mockRootView), eq(123)); // Check that focus event was sent. ArgumentCaptor eventCaptor = From 242aeba4fce53b3f26719f123e1488592808180b Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 30 May 2023 08:54:14 -0700 Subject: [PATCH 28/34] update tests --- .../io/flutter/view/AccessibilityBridge.java | 5 ++++ .../flutter/view/AccessibilityBridgeTest.java | 27 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 02ee838834c62..7f9eec554c0c5 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -1983,6 +1983,11 @@ private void sendWindowContentChangeEvent(int virtualViewId) { */ private AccessibilityEvent obtainAccessibilityEvent(int virtualViewId, int eventType) { AccessibilityEvent event = AccessibilityEvent.obtain(eventType); + return obtainAccessibilityEvent(event, virtualViewId, eventType); + } + + @VisibleForTesting + public AccessibilityEvent obtainAccessibilityEvent(AccessibilityEvent event, int virtualViewId, int eventType) { event.setPackageName(rootAccessibilityView.getContext().getPackageName()); event.setSource(rootAccessibilityView, virtualViewId); return event; diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index a0f3e89c223da..20d6886508c57 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1846,8 +1846,8 @@ public void sendFocusAccessibilityEvent() { when(mockRootView.getParent()).thenReturn(mockParent); when(mockManager.isEnabled()).thenReturn(true); - AccessibilityBridge spyAccessibilityBridge = - spy(setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null)); + AccessibilityBridge accessibilityBridge = + setUpBridge(mockRootView, accessibilityChannel, mockManager, null, null, null); HashMap arguments = new HashMap<>(); arguments.put("type", "focus"); @@ -1855,14 +1855,33 @@ public void sendFocusAccessibilityEvent() { BasicMessageChannel.Reply reply = mock(BasicMessageChannel.Reply.class); accessibilityChannel.parsingMessageHandler.onMessage(arguments, reply); - verify(spyAccessibilityBridge).obtainAccessibilityNodeInfo(eq(mockRootView), eq(123)); - // Check that focus event was sent. ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(AccessibilityEvent.class); verify(mockParent).requestSendAccessibilityEvent(eq(mockRootView), eventCaptor.capture()); AccessibilityEvent event = eventCaptor.getAllValues().get(0); assertEquals(event.getEventType(), AccessibilityEvent.TYPE_VIEW_FOCUSED); + assertEquals(event.getSource(), null); + } + + @Test + public void SetSourceAndPackageNameForAccessibilityEvent() { + AccessibilityManager mockManager = mock(AccessibilityManager.class); + ContentResolver mockContentResolver = mock(ContentResolver.class); + View mockRootView = mock(View.class); + Context context = mock(Context.class); + when(mockRootView.getContext()).thenReturn(context); + when(context.getPackageName()).thenReturn("test"); + when(mockManager.isEnabled()).thenReturn(true); + + AccessibilityBridge accessibilityBridge = + setUpBridge(mockRootView, null, mockManager, null, null, null); + + AccessibilityEvent mockEvent = mock(AccessibilityEvent.class); + accessibilityBridge.obtainAccessibilityEvent(mockEvent, 123, AccessibilityEvent.TYPE_VIEW_FOCUSED); + verify(mockEvent).setSource(eq(mockRootView), eq(123)); + verify(mockEvent).setPackageName("test"); + } AccessibilityBridge setUpBridge() { From 73fb81a229502138cc8e1866d02a460861b41534 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 30 May 2023 08:55:07 -0700 Subject: [PATCH 29/34] lint --- .../platform/android/io/flutter/view/AccessibilityBridge.java | 3 ++- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 7f9eec554c0c5..318b073751651 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -1987,7 +1987,8 @@ private AccessibilityEvent obtainAccessibilityEvent(int virtualViewId, int event } @VisibleForTesting - public AccessibilityEvent obtainAccessibilityEvent(AccessibilityEvent event, int virtualViewId, int eventType) { + public AccessibilityEvent obtainAccessibilityEvent( + AccessibilityEvent event, int virtualViewId, int eventType) { event.setPackageName(rootAccessibilityView.getContext().getPackageName()); event.setSource(rootAccessibilityView, virtualViewId); return event; diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 20d6886508c57..2d1cba36bf84f 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1878,10 +1878,10 @@ public void SetSourceAndPackageNameForAccessibilityEvent() { setUpBridge(mockRootView, null, mockManager, null, null, null); AccessibilityEvent mockEvent = mock(AccessibilityEvent.class); - accessibilityBridge.obtainAccessibilityEvent(mockEvent, 123, AccessibilityEvent.TYPE_VIEW_FOCUSED); + accessibilityBridge.obtainAccessibilityEvent( + mockEvent, 123, AccessibilityEvent.TYPE_VIEW_FOCUSED); verify(mockEvent).setSource(eq(mockRootView), eq(123)); verify(mockEvent).setPackageName("test"); - } AccessibilityBridge setUpBridge() { From 751180d6ea4f71293aa3f3ce8711d4e26e0051f7 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 30 May 2023 10:10:42 -0700 Subject: [PATCH 30/34] test --- .../platform/android/io/flutter/view/AccessibilityBridge.java | 2 +- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 318b073751651..7eb4c88d13701 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -289,7 +289,7 @@ private void setAccessibleNavigation(boolean value) { private boolean isReleased = false; // Handler for all messages received from Flutter via the {@code accessibilityChannel} - private final AccessibilityChannel.AccessibilityMessageHandler accessibilityMessageHandler = + public final AccessibilityChannel.AccessibilityMessageHandler accessibilityMessageHandler = new AccessibilityChannel.AccessibilityMessageHandler() { /** The Dart application would like the given {@code message} to be announced. */ @Override diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 2d1cba36bf84f..bfb1d262dcb0f 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1877,6 +1877,9 @@ public void SetSourceAndPackageNameForAccessibilityEvent() { AccessibilityBridge accessibilityBridge = setUpBridge(mockRootView, null, mockManager, null, null, null); + AccessibilityManager manager = accessibilityBridge.accessibilityMessageHandler; + + AccessibilityEvent mockEvent = mock(AccessibilityEvent.class); accessibilityBridge.obtainAccessibilityEvent( mockEvent, 123, AccessibilityEvent.TYPE_VIEW_FOCUSED); From bf97dba8002bea3c7a6c3deaa3c14daf1e3c6560 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 30 May 2023 13:21:05 -0700 Subject: [PATCH 31/34] update tests --- .../io/flutter/view/AccessibilityBridge.java | 16 ++++++++-------- .../io/flutter/view/AccessibilityBridgeTest.java | 16 +++++++++++----- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 7eb4c88d13701..b657adc58c462 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -1889,7 +1889,8 @@ private AccessibilityEvent createTextChangedEvent(int id, String oldValue, Strin *

The given {@code viewId} may either belong to {@link #rootAccessibilityView}, or any Flutter * {@link SemanticsNode}. */ - private void sendAccessibilityEvent(int viewId, int eventType) { + @VisibleForTesting + public void sendAccessibilityEvent(int viewId, int eventType) { if (!accessibilityManager.isEnabled()) { return; } @@ -1982,18 +1983,17 @@ private void sendWindowContentChangeEvent(int virtualViewId) { * invoked to create an {@link AccessibilityEvent} for the {@link #rootAccessibilityView}. */ private AccessibilityEvent obtainAccessibilityEvent(int virtualViewId, int eventType) { - AccessibilityEvent event = AccessibilityEvent.obtain(eventType); - return obtainAccessibilityEvent(event, virtualViewId, eventType); - } - - @VisibleForTesting - public AccessibilityEvent obtainAccessibilityEvent( - AccessibilityEvent event, int virtualViewId, int eventType) { + AccessibilityEvent event = obtainAccessibilityEvent(eventType); event.setPackageName(rootAccessibilityView.getContext().getPackageName()); event.setSource(rootAccessibilityView, virtualViewId); return event; } + @VisibleForTesting + public AccessibilityEvent obtainAccessibilityEvent(int eventType) { + return AccessibilityEvent.obtain(eventType); + } + /** * Reads the {@code layoutInDisplayCutoutMode} value from the window attribute and returns whether * a left cutout inset is required. diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index bfb1d262dcb0f..19f1650e36081 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1873,18 +1873,24 @@ public void SetSourceAndPackageNameForAccessibilityEvent() { when(mockRootView.getContext()).thenReturn(context); when(context.getPackageName()).thenReturn("test"); when(mockManager.isEnabled()).thenReturn(true); + ViewParent mockParent = mock(ViewParent.class); + when(mockRootView.getParent()).thenReturn(mockParent); + AccessibilityEvent mockEvent = mock(AccessibilityEvent.class); AccessibilityBridge accessibilityBridge = setUpBridge(mockRootView, null, mockManager, null, null, null); - AccessibilityManager manager = accessibilityBridge.accessibilityMessageHandler; + + AccessibilityBridge spyAccessibilityBridge = spy(accessibilityBridge); + + when(spyAccessibilityBridge.obtainAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)) + .thenReturn(mockEvent); + + spyAccessibilityBridge.sendAccessibilityEvent(123, AccessibilityEvent.TYPE_VIEW_FOCUSED); - AccessibilityEvent mockEvent = mock(AccessibilityEvent.class); - accessibilityBridge.obtainAccessibilityEvent( - mockEvent, 123, AccessibilityEvent.TYPE_VIEW_FOCUSED); - verify(mockEvent).setSource(eq(mockRootView), eq(123)); verify(mockEvent).setPackageName("test"); + verify(mockEvent).setSource(eq(mockRootView), eq(123)); } AccessibilityBridge setUpBridge() { From 78a07088900e8818eaecd305437ce5c9b2810c41 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 30 May 2023 13:21:48 -0700 Subject: [PATCH 32/34] lint --- .../platform/android/io/flutter/view/AccessibilityBridge.java | 2 +- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index b657adc58c462..18f1645faeed4 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -1991,7 +1991,7 @@ private AccessibilityEvent obtainAccessibilityEvent(int virtualViewId, int event @VisibleForTesting public AccessibilityEvent obtainAccessibilityEvent(int eventType) { - return AccessibilityEvent.obtain(eventType); + return AccessibilityEvent.obtain(eventType); } /** diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 19f1650e36081..434843e1a8748 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1880,15 +1880,13 @@ public void SetSourceAndPackageNameForAccessibilityEvent() { AccessibilityBridge accessibilityBridge = setUpBridge(mockRootView, null, mockManager, null, null, null); - AccessibilityBridge spyAccessibilityBridge = spy(accessibilityBridge); when(spyAccessibilityBridge.obtainAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)) - .thenReturn(mockEvent); + .thenReturn(mockEvent); spyAccessibilityBridge.sendAccessibilityEvent(123, AccessibilityEvent.TYPE_VIEW_FOCUSED); - verify(mockEvent).setPackageName("test"); verify(mockEvent).setSource(eq(mockRootView), eq(123)); } From 8e859835a8567f5d691401885ac7597f4779b724 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 30 May 2023 13:27:42 -0700 Subject: [PATCH 33/34] Update AccessibilityBridge.java --- shell/platform/android/io/flutter/view/AccessibilityBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 18f1645faeed4..3ade64dff204b 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -289,7 +289,7 @@ private void setAccessibleNavigation(boolean value) { private boolean isReleased = false; // Handler for all messages received from Flutter via the {@code accessibilityChannel} - public final AccessibilityChannel.AccessibilityMessageHandler accessibilityMessageHandler = + private final AccessibilityChannel.AccessibilityMessageHandler accessibilityMessageHandler = new AccessibilityChannel.AccessibilityMessageHandler() { /** The Dart application would like the given {@code message} to be announced. */ @Override From 2e06b28d955fad452acb3e322f4b95cce11e87cd Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 30 May 2023 13:59:13 -0700 Subject: [PATCH 34/34] Update accessibility_bridge_test.mm --- .../darwin/ios/framework/Source/accessibility_bridge_test.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 cd05f7f8883b7..40995c9111284 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge_test.mm @@ -1301,7 +1301,9 @@ - (void)testHandleEvent { /*delegate=*/mock_delegate, /*rendering_api=*/flutter::IOSRenderingAPI::kSoftware, /*platform_views_controller=*/nil, - /*task_runners=*/runners); + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_sync_switch=*/nil); id mockFlutterView = OCMClassMock([FlutterView class]); id mockFlutterViewController = OCMClassMock([FlutterViewController class]); OCMStub([mockFlutterViewController view]).andReturn(mockFlutterView);