From 60f46ae6caca3cbe5ffb552cb43a8c09c20e7305 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Wed, 18 Oct 2023 14:59:06 -0700 Subject: [PATCH 1/7] Update accessibility_bridge.mm Update AccessibilityBridge.java 1 1 1 --- .../android/io/flutter/view/AccessibilityBridge.java | 8 ++++++++ .../darwin/ios/framework/Source/accessibility_bridge.mm | 2 ++ 2 files changed, 10 insertions(+) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index c7c249713fff8..0b6a642ccfd0d 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -40,6 +40,8 @@ import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate; import io.flutter.util.Predicate; import io.flutter.util.ViewUtils; +import io.flutter.view.AccessibilityBridge.Flag; + import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; @@ -1166,6 +1168,12 @@ public boolean performAction( accessibilityChannel.dispatchSemanticsAction( virtualViewId, Action.DID_GAIN_ACCESSIBILITY_FOCUS); + + HashMap message = new HashMap<>(); + message.put("type", "focus"); + message.put("nodeId", semanticsNode.id); + accessibilityChannel.channel.send(message); + sendAccessibilityEvent(virtualViewId, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); if (semanticsNode.hasAction(Action.INCREASE) diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index 27b33ad4ca3d4..575c42e443b59 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -75,6 +75,8 @@ void PostAccessibilityNotification(UIAccessibilityNotifications notification, void AccessibilityBridge::AccessibilityObjectDidBecomeFocused(int32_t id) { last_focused_semantics_object_id_ = id; + + [accessibility_channel_.get() sendMessage:@{@"type" : @"focus", @"nodeId" : @(id)}]; } void AccessibilityBridge::AccessibilityObjectDidLoseFocus(int32_t id) { From 5e87836ecbb50493eeb204987a7a48dabe500421 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:45:05 -0700 Subject: [PATCH 2/7] test --- .../systemchannels/AccessibilityChannel.java | 8 ++++++++ .../io/flutter/view/AccessibilityBridge.java | 2 +- .../io/flutter/view/AccessibilityBridgeTest.java | 16 ++++++++++++++-- .../ios/framework/Source/accessibility_bridge.mm | 2 +- 4 files changed, 24 insertions(+), 4 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 38059232ce1a7..83113e2c256a8 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -2,6 +2,7 @@ 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; @@ -102,6 +103,13 @@ public AccessibilityChannel(@NonNull DartExecutor dartExecutor, @NonNull Flutter this.flutterJNI = flutterJNI; } + @VisibleForTesting + public AccessibilityChannel(@NonNull BasicMessageChannel channel, @NonNull FlutterJNI flutterJNI) { + this.channel = channel; + + this.flutterJNI = flutterJNI; + } + /** * Informs Flutter that the Android OS currently has accessibility enabled. * diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 0b6a642ccfd0d..5db122b1f9dd7 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -1170,7 +1170,7 @@ public boolean performAction( virtualViewId, Action.DID_GAIN_ACCESSIBILITY_FOCUS); HashMap message = new HashMap<>(); - message.put("type", "focus"); + message.put("type", "didGainFocus"); message.put("nodeId", semanticsNode.id); accessibilityChannel.channel.send(message); diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 28077a2c6877e..6872e6a27b8ee 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1310,7 +1310,12 @@ public void itSetsBoldTextFlagCorrectly() { @Test public void itSetsFocusedNodeBeforeSendingEvent() { - AccessibilityChannel mockChannel = mock(AccessibilityChannel.class); + + BasicMessageChannel mockChannel = mock(BasicMessageChannel.class); + AccessibilityChannel accessibilityChannel = + new AccessibilityChannel(mockChannel, mock(FlutterJNI.class)); + + AccessibilityViewEmbedder mockViewEmbedder = mock(AccessibilityViewEmbedder.class); AccessibilityManager mockManager = mock(AccessibilityManager.class); View mockRootView = mock(View.class); @@ -1320,7 +1325,7 @@ public void itSetsFocusedNodeBeforeSendingEvent() { AccessibilityBridge accessibilityBridge = setUpBridge( /*rootAccessibilityView=*/ mockRootView, - /*accessibilityChannel=*/ mockChannel, + /*accessibilityChannel=*/ accessibilityChannel, /*accessibilityManager=*/ mockManager, /*contentResolver=*/ null, /*accessibilityViewEmbedder=*/ mockViewEmbedder, @@ -1361,8 +1366,15 @@ public boolean verify(InvocationOnMock invocation) { .thenAnswer(invocation -> verifier.verify(invocation)); accessibilityBridge.performAction(0, AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); assertTrue(verifier.verified); + + + HashMap message = new HashMap<>(); + message.put("type", "didGainFocus"); + message.put("nodeId", 0); + verify(mockChannel).send(message); } + @Test public void itClearsFocusedNodeBeforeSendingEvent() { AccessibilityChannel mockChannel = mock(AccessibilityChannel.class); diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index 575c42e443b59..b3c99963b6a02 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -76,7 +76,7 @@ void PostAccessibilityNotification(UIAccessibilityNotifications notification, void AccessibilityBridge::AccessibilityObjectDidBecomeFocused(int32_t id) { last_focused_semantics_object_id_ = id; - [accessibility_channel_.get() sendMessage:@{@"type" : @"focus", @"nodeId" : @(id)}]; + [accessibility_channel_.get() sendMessage:@{@"type" : @"didGainFocus", @"nodeId" : @(id)}]; } void AccessibilityBridge::AccessibilityObjectDidLoseFocus(int32_t id) { From fabfd0e847eafd839ae4e7fc40ab46e337b3b229 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:46:54 -0700 Subject: [PATCH 3/7] lint --- .../engine/systemchannels/AccessibilityChannel.java | 3 ++- .../android/io/flutter/view/AccessibilityBridge.java | 3 +-- .../test/io/flutter/view/AccessibilityBridgeTest.java | 11 ++++------- 3 files changed, 7 insertions(+), 10 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 83113e2c256a8..b8627c9a49c26 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -104,7 +104,8 @@ public AccessibilityChannel(@NonNull DartExecutor dartExecutor, @NonNull Flutter } @VisibleForTesting - public AccessibilityChannel(@NonNull BasicMessageChannel channel, @NonNull FlutterJNI flutterJNI) { + public AccessibilityChannel( + @NonNull BasicMessageChannel channel, @NonNull FlutterJNI flutterJNI) { this.channel = channel; this.flutterJNI = flutterJNI; diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 5db122b1f9dd7..27791b027a017 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -41,7 +41,6 @@ import io.flutter.util.Predicate; import io.flutter.util.ViewUtils; import io.flutter.view.AccessibilityBridge.Flag; - import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; @@ -1168,7 +1167,7 @@ public boolean performAction( accessibilityChannel.dispatchSemanticsAction( virtualViewId, Action.DID_GAIN_ACCESSIBILITY_FOCUS); - + HashMap message = new HashMap<>(); message.put("type", "didGainFocus"); message.put("nodeId", semanticsNode.id); diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 6872e6a27b8ee..50737fa003898 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1315,7 +1315,6 @@ public void itSetsFocusedNodeBeforeSendingEvent() { AccessibilityChannel accessibilityChannel = new AccessibilityChannel(mockChannel, mock(FlutterJNI.class)); - AccessibilityViewEmbedder mockViewEmbedder = mock(AccessibilityViewEmbedder.class); AccessibilityManager mockManager = mock(AccessibilityManager.class); View mockRootView = mock(View.class); @@ -1367,14 +1366,12 @@ public boolean verify(InvocationOnMock invocation) { accessibilityBridge.performAction(0, AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); assertTrue(verifier.verified); - - HashMap message = new HashMap<>(); - message.put("type", "didGainFocus"); - message.put("nodeId", 0); - verify(mockChannel).send(message); + HashMap message = new HashMap<>(); + message.put("type", "didGainFocus"); + message.put("nodeId", 0); + verify(mockChannel).send(message); } - @Test public void itClearsFocusedNodeBeforeSendingEvent() { AccessibilityChannel mockChannel = mock(AccessibilityChannel.class); From 64fe829a7b903d06a471770cb730a14907476647 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:16:48 -0700 Subject: [PATCH 4/7] test --- .../io/flutter/view/AccessibilityBridge.java | 1 - .../io/flutter/view/AccessibilityBridgeTest.java | 13 ++++++++----- .../ios/framework/Source/accessibility_bridge.mm | 2 -- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 27791b027a017..8f2584cb745c2 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -40,7 +40,6 @@ import io.flutter.plugin.platform.PlatformViewsAccessibilityDelegate; import io.flutter.util.Predicate; import io.flutter.util.ViewUtils; -import io.flutter.view.AccessibilityBridge.Flag; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index 50737fa003898..464b4d5f15a28 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1187,7 +1187,9 @@ public void itCanPredictSetSelection() { @Test public void itPerformsClearAccessibilityFocusCorrectly() { - AccessibilityChannel mockChannel = mock(AccessibilityChannel.class); + BasicMessageChannel mockChannel = mock(BasicMessageChannel.class); + AccessibilityChannel accessibilityChannel = + new AccessibilityChannel(mockChannel, mock(FlutterJNI.class)); AccessibilityViewEmbedder mockViewEmbedder = mock(AccessibilityViewEmbedder.class); AccessibilityManager mockManager = mock(AccessibilityManager.class); View mockRootView = mock(View.class); @@ -1197,7 +1199,7 @@ public void itPerformsClearAccessibilityFocusCorrectly() { AccessibilityBridge accessibilityBridge = setUpBridge( /*rootAccessibilityView=*/ mockRootView, - /*accessibilityChannel=*/ mockChannel, + /*accessibilityChannel=*/ accessibilityChannel, /*accessibilityManager=*/ mockManager, /*contentResolver=*/ null, /*accessibilityViewEmbedder=*/ mockViewEmbedder, @@ -1373,8 +1375,9 @@ public boolean verify(InvocationOnMock invocation) { } @Test - public void itClearsFocusedNodeBeforeSendingEvent() { - AccessibilityChannel mockChannel = mock(AccessibilityChannel.class); + public void itClearsFocusedNodeBeforeSendingEvent() { BasicMessageChannel mockChannel = mock(BasicMessageChannel.class); + AccessibilityChannel accessibilityChannel = + new AccessibilityChannel(mockChannel, mock(FlutterJNI.class)); AccessibilityViewEmbedder mockViewEmbedder = mock(AccessibilityViewEmbedder.class); AccessibilityManager mockManager = mock(AccessibilityManager.class); View mockRootView = mock(View.class); @@ -1384,7 +1387,7 @@ public void itClearsFocusedNodeBeforeSendingEvent() { AccessibilityBridge accessibilityBridge = setUpBridge( /*rootAccessibilityView=*/ mockRootView, - /*accessibilityChannel=*/ mockChannel, + /*accessibilityChannel=*/ accessibilityChannel, /*accessibilityManager=*/ mockManager, /*contentResolver=*/ null, /*accessibilityViewEmbedder=*/ mockViewEmbedder, diff --git a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm index b3c99963b6a02..27b33ad4ca3d4 100644 --- a/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm +++ b/shell/platform/darwin/ios/framework/Source/accessibility_bridge.mm @@ -75,8 +75,6 @@ void PostAccessibilityNotification(UIAccessibilityNotifications notification, void AccessibilityBridge::AccessibilityObjectDidBecomeFocused(int32_t id) { last_focused_semantics_object_id_ = id; - - [accessibility_channel_.get() sendMessage:@{@"type" : @"didGainFocus", @"nodeId" : @(id)}]; } void AccessibilityBridge::AccessibilityObjectDidLoseFocus(int32_t id) { From 5f1b1358e9a12798a7919713c27bd1a98c0f77ff Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:19:38 -0700 Subject: [PATCH 5/7] 1 --- .../android/test/io/flutter/view/AccessibilityBridgeTest.java | 3 ++- 1 file changed, 2 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 464b4d5f15a28..567c9d9233f6d 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1375,7 +1375,8 @@ public boolean verify(InvocationOnMock invocation) { } @Test - public void itClearsFocusedNodeBeforeSendingEvent() { BasicMessageChannel mockChannel = mock(BasicMessageChannel.class); + public void itClearsFocusedNodeBeforeSendingEvent() { + BasicMessageChannel mockChannel = mock(BasicMessageChannel.class); AccessibilityChannel accessibilityChannel = new AccessibilityChannel(mockChannel, mock(FlutterJNI.class)); AccessibilityViewEmbedder mockViewEmbedder = mock(AccessibilityViewEmbedder.class); From c451ba6711ecd371aebf62be7d36546dc7c3612d Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:22:57 -0700 Subject: [PATCH 6/7] test --- .../test/io/flutter/view/AccessibilityBridgeTest.java | 10 +++++++++- 1 file changed, 9 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 567c9d9233f6d..12054c9638b5c 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -1222,6 +1222,11 @@ public void itPerformsClearAccessibilityFocusCorrectly() { accessibilityBridge.performAction(0, AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); AccessibilityNodeInfo nodeInfo = accessibilityBridge.createAccessibilityNodeInfo(0); assertTrue(nodeInfo.isAccessibilityFocused()); + + HashMap message = new HashMap<>(); + message.put("type", "didGainFocus"); + message.put("nodeId", 0); + verify(mockChannel).send(message); // Clear focus on non-focused node shouldn't do anything accessibilityBridge.performAction( 1, AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null); @@ -1312,7 +1317,6 @@ public void itSetsBoldTextFlagCorrectly() { @Test public void itSetsFocusedNodeBeforeSendingEvent() { - BasicMessageChannel mockChannel = mock(BasicMessageChannel.class); AccessibilityChannel accessibilityChannel = new AccessibilityChannel(mockChannel, mock(FlutterJNI.class)); @@ -1408,6 +1412,10 @@ public void itClearsFocusedNodeBeforeSendingEvent() { accessibilityBridge.performAction(0, AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); AccessibilityNodeInfo nodeInfo = accessibilityBridge.createAccessibilityNodeInfo(0); assertTrue(nodeInfo.isAccessibilityFocused()); + HashMap message = new HashMap<>(); + message.put("type", "didGainFocus"); + message.put("nodeId", 0); + verify(mockChannel).send(message); class Verifier { public Verifier(AccessibilityBridge accessibilityBridge) { From ffbb10e59a77e30a3f9387e878a36146004c84c9 Mon Sep 17 00:00:00 2001 From: hangyu <108393416+hangyujin@users.noreply.github.com> Date: Tue, 24 Oct 2023 21:24:50 -0700 Subject: [PATCH 7/7] 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 b8627c9a49c26..f2d12b181af25 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/AccessibilityChannel.java @@ -107,7 +107,6 @@ public AccessibilityChannel(@NonNull DartExecutor dartExecutor, @NonNull Flutter public AccessibilityChannel( @NonNull BasicMessageChannel channel, @NonNull FlutterJNI flutterJNI) { this.channel = channel; - this.flutterJNI = flutterJNI; }