From dba0df8cf70beac54df4f9a42c7de5c89539a71c Mon Sep 17 00:00:00 2001 From: Eric Rozell Date: Thu, 4 Dec 2025 11:04:01 -0800 Subject: [PATCH] Do not reset accessibility delegate if there was no delegate (#54785) Summary: There's a bug with focus states if we reset the accessibility delegate. We probably should not reset the delegate if we didn't previously have one. ## Changelog [Android][Fixed] - Fix issue with focus when re-rendering text Differential Revision: D88390326 --- .../ReactTextViewAccessibilityDelegate.kt | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewAccessibilityDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewAccessibilityDelegate.kt index fe7956e5268..dbc21244c8d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewAccessibilityDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewAccessibilityDelegate.kt @@ -33,19 +33,20 @@ internal class ReactTextViewAccessibilityDelegate( } companion object { + fun needsDelegate(view: View): Boolean { + return view.getTag(R.id.accessibility_role) != null || + view.getTag(R.id.accessibility_state) != null || + view.getTag(R.id.accessibility_actions) != null || + view.getTag(R.id.react_test_id) != null || + view.getTag(R.id.accessibility_collection_item) != null || + view.getTag(R.id.accessibility_links) != null || + view.getTag(R.id.role) != null + } + fun setDelegate(view: View, originalFocus: Boolean, originalImportantForAccessibility: Int) { // if a view already has an accessibility delegate, replacing it could cause // problems,so leave it alone. - if ( - !ViewCompat.hasAccessibilityDelegate(view) && - (view.getTag(R.id.accessibility_role) != null || - view.getTag(R.id.accessibility_state) != null || - view.getTag(R.id.accessibility_actions) != null || - view.getTag(R.id.react_test_id) != null || - view.getTag(R.id.accessibility_collection_item) != null || - view.getTag(R.id.accessibility_links) != null || - view.getTag(R.id.role) != null) - ) { + if (!ViewCompat.hasAccessibilityDelegate(view) && needsDelegate(view)) { ViewCompat.setAccessibilityDelegate( view, ReactTextViewAccessibilityDelegate( @@ -58,14 +59,16 @@ internal class ReactTextViewAccessibilityDelegate( } fun resetDelegate(view: View, originalFocus: Boolean, originalImportantForAccessibility: Int) { - ViewCompat.setAccessibilityDelegate( - view, - ReactTextViewAccessibilityDelegate( - view, - originalFocus, - originalImportantForAccessibility, - ), - ) + if (ViewCompat.hasAccessibilityDelegate(view) || needsDelegate(view)) { + ViewCompat.setAccessibilityDelegate( + view, + ReactTextViewAccessibilityDelegate( + view, + originalFocus, + originalImportantForAccessibility, + ), + ) + } } }