From fcc1e355bbf046a203e4d3781b1cf988f88f81f2 Mon Sep 17 00:00:00 2001 From: Bruno Leroux Date: Fri, 8 Nov 2024 10:17:06 +0100 Subject: [PATCH 1/2] [Android] Fix Slider semantics double tap behaviors --- .../io/flutter/view/AccessibilityBridge.java | 7 +++++++ .../io/flutter/view/AccessibilityBridgeTest.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 8bfea3ce899bb..8dbf69b16c6c1 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -802,6 +802,13 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { result.addAction(AccessibilityNodeInfo.ACTION_CLICK); result.setClickable(true); } + } else { + // Prevent Slider to receive a regular tap which will change its value. + // This is needed because Slider does not have a semantics tap. + if (semanticsNode.hasFlag(Flag.IS_SLIDER)) { + result.addAction(AccessibilityNodeInfo.ACTION_CLICK); + result.setClickable(true); + } } if (semanticsNode.hasAction(Action.LONG_PRESS)) { if (semanticsNode.onLongPressOverride != null) { diff --git a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java index f86ea7a3b8d79..011616724511c 100644 --- a/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java +++ b/shell/platform/android/test/io/flutter/view/AccessibilityBridgeTest.java @@ -2165,6 +2165,21 @@ public void SetSourceAndPackageNameForAccessibilityEvent() { verify(mockEvent).setSource(eq(mockRootView), eq(123)); } + @Test + public void itAddsClickActionToSliderNodeInfo() { + AccessibilityBridge accessibilityBridge = setUpBridge(); + + TestSemanticsNode testSemanticsNode = new TestSemanticsNode(); + testSemanticsNode.addFlag(AccessibilityBridge.Flag.IS_SLIDER); + TestSemanticsUpdate testSemanticsUpdate = testSemanticsNode.toUpdate(); + testSemanticsUpdate.sendUpdateToBridge(accessibilityBridge); + AccessibilityNodeInfo nodeInfo = accessibilityBridge.createAccessibilityNodeInfo(0); + + assertEquals(nodeInfo.isClickable(), true); + List actions = nodeInfo.getActionList(); + assertTrue(actions.contains(AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK)); + } + AccessibilityBridge setUpBridge() { return setUpBridge(null, null, null, null, null, null); } From b1111a35e0eb613ae221310f2f10766473f9f8d0 Mon Sep 17 00:00:00 2001 From: Bruno Leroux Date: Tue, 12 Nov 2024 07:01:09 +0100 Subject: [PATCH 2/2] Update comment --- .../android/io/flutter/view/AccessibilityBridge.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 8dbf69b16c6c1..0f28573023593 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -803,8 +803,10 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { result.setClickable(true); } } else { - // Prevent Slider to receive a regular tap which will change its value. - // This is needed because Slider does not have a semantics tap. + // Prevent Slider to receive a regular tap which will change the value. + // + // This is needed because it causes slider to select to middle if it + // doesn't have a semantics tap. if (semanticsNode.hasFlag(Flag.IS_SLIDER)) { result.addAction(AccessibilityNodeInfo.ACTION_CLICK); result.setClickable(true);