diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 4922e6a8c1d941fcc46ef9be90045c00e6f1a34b..1b76ce01ac851b4f0f8f3f1051fc7ef2ac51f1ea 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -403,13 +403,21 @@ class AccessibilityBridge extends AccessibilityNodeProvider implements BasicMess void updateSemantics(ByteBuffer buffer, String[] strings) { ArrayList updated = new ArrayList(); + ArrayList checkedChanged = new ArrayList(); while (buffer.hasRemaining()) { int id = buffer.getInt(); SemanticsObject object = getOrCreateObject(id); + boolean hadCheckedState = object.hasFlag(Flag.HAS_CHECKED_STATE); + boolean wasChecked = object.hasFlag(Flag.IS_CHECKED); object.updateWith(buffer, strings); if (object.hasFlag(Flag.IS_FOCUSED)) { mInputFocusedObject = object; } + if (mA11yFocusedObject != null && mA11yFocusedObject.id == id + && hadCheckedState && object.hasFlag(Flag.HAS_CHECKED_STATE) + && wasChecked != object.hasFlag(Flag.IS_CHECKED)) { + checkedChanged.add(id); + } updated.add(id); } @@ -434,6 +442,10 @@ class AccessibilityBridge extends AccessibilityNodeProvider implements BasicMess for (Integer id : updated) { sendAccessibilityEvent(id, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); } + for (Integer id : checkedChanged) { + // Simulate a click so TalkBack announces the change in checked state. + sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_CLICKED); + } } private AccessibilityEvent obtainAccessibilityEvent(int virtualViewId, int eventType) {