From 8cc94ff1487ae4e91200621558f53ebeebe83964 Mon Sep 17 00:00:00 2001 From: lazerg Date: Tue, 27 Oct 2026 19:24:45 +0500 Subject: [PATCH] Rebuild the content description when accessibilityValue is removed on Android --- .../react/uimanager/BaseViewManager.java | 16 +++--------- .../react/uimanager/BaseViewManagerTest.kt | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java index b2e8fec78339..bef69e2102f3 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java @@ -489,9 +489,8 @@ private void updateViewContentDescription(@NonNull T view) { contentDescription.add(text.asString()); } } - if (!contentDescription.isEmpty()) { - view.setContentDescription(TextUtils.join(", ", contentDescription)); - } + view.setContentDescription( + contentDescription.isEmpty() ? null : TextUtils.join(", ", contentDescription)); } @ReactProp(name = ViewProps.ACCESSIBILITY_ACTIONS) @@ -505,15 +504,8 @@ public void setAccessibilityActions(T view, ReadableArray accessibilityActions) @ReactProp(name = ViewProps.ACCESSIBILITY_VALUE) public void setAccessibilityValue(T view, ReadableMap accessibilityValue) { - if (accessibilityValue == null) { - view.setTag(R.id.accessibility_value, null); - view.setContentDescription(null); - } else { - view.setTag(R.id.accessibility_value, accessibilityValue); - if (accessibilityValue.hasKey("text")) { - updateViewContentDescription(view); - } - } + view.setTag(R.id.accessibility_value, accessibilityValue); + updateViewContentDescription(view); } @ReactProp(name = ViewProps.IMPORTANT_FOR_ACCESSIBILITY) diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt index 8e089c9d3dec..666aa2bd71e2 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt @@ -127,6 +127,31 @@ class BaseViewManagerTest { Assertions.assertThat(view.isEnabled).isFalse() } + @Test + fun testAccessibilityValueWithoutTextRemovesThePreviousText() { + viewManager.setAccessibilityLabel(view, "Country") + viewManager.setAccessibilityValue(view, JavaOnlyMap.of("text", "Ukraine")) + Assertions.assertThat(view.contentDescription).isEqualTo("Country, Ukraine") + + viewManager.setAccessibilityValue(view, JavaOnlyMap()) + Assertions.assertThat(view.contentDescription).isEqualTo("Country") + } + + @Test + fun testAccessibilityValueNullKeepsTheLabel() { + viewManager.setAccessibilityLabel(view, "Country") + viewManager.setAccessibilityValue(view, JavaOnlyMap.of("text", "Ukraine")) + viewManager.setAccessibilityValue(view, null) + Assertions.assertThat(view.contentDescription).isEqualTo("Country") + } + + @Test + fun testAccessibilityValueNullClearsAValueOnlyDescription() { + viewManager.setAccessibilityValue(view, JavaOnlyMap.of("text", "Ukraine")) + viewManager.setAccessibilityValue(view, null) + Assertions.assertThat(view.contentDescription).isNull() + } + @Test fun testRoleList() { viewManager.setRole(view, "list")