From 14458d8699f49fec8ff7ad38c541da61b1ef491e Mon Sep 17 00:00:00 2001 From: Devan Buggay Date: Thu, 18 Sep 2025 00:36:55 -0700 Subject: [PATCH] Add focus/blur commands to View (#53828) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/53828 Adds focus and blur commands to Android views. Changelog: [Internal] Reviewed By: rozele Differential Revision: D82644681 fbshipit-source-id: 96fa6370e177c91742d285b0b158b77447d105f6 --- .../facebook/react/views/view/ReactViewGroup.kt | 8 ++++++++ .../facebook/react/views/view/ReactViewManager.kt | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt index d987635b424..c47f67ce036 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt @@ -416,6 +416,14 @@ public open class ReactViewGroup public constructor(context: Context?) : updateClippingToRect(clippingRect, excludedViews) } + internal fun requestFocusFromJS() { + super.requestFocus(FOCUS_DOWN, null) + } + + internal fun clearFocusFromJS() { + super.clearFocus() + } + override fun endViewTransition(view: View) { super.endViewTransition(view) childrenRemovedWhileTransitioning?.remove(view.id) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt index 6c2d3bd52dc..424b724abe2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt @@ -404,6 +404,8 @@ public open class ReactViewManager : ReactClippingViewManager() when (commandId) { HOTSPOT_UPDATE_KEY -> handleHotspotUpdate(root, args) "setPressed" -> handleSetPressed(root, args) + "focus" -> handleFocus(root) + "blur" -> handleBlur(root) else -> {} } } @@ -428,4 +430,16 @@ public open class ReactViewManager : ReactClippingViewManager() val y = args.getDouble(1).dpToPx() root.drawableHotspotChanged(x, y) } + + private fun handleFocus(root: ReactViewGroup) { + if (ReactNativeFeatureFlags.enableImperativeFocus()) { + root.requestFocusFromJS() + } + } + + private fun handleBlur(root: ReactViewGroup) { + if (ReactNativeFeatureFlags.enableImperativeFocus()) { + root.clearFocusFromJS() + } + } }