From a82829cf80dbca6cc8b4027cb7aadf37c53262cf Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Fri, 27 Feb 2026 03:15:29 -0800 Subject: [PATCH] Deprecate getEventDispatcher variants (#55779) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55779 Cleanup this UIManagerHelper helper - now that we're fully on the new arch this can be simplified. Changelog: [Android][Breaking] Deprecated UIManagerHelper.getEventDispatcherForReactTag and UIManagerHelper.getEventDispatcher(ReactContext, UIManagerType Int), use getEventDispatcher Reviewed By: sammy-SC Differential Revision: D94514934 --- .../popupmenu/ReactPopupMenuContainer.kt | 4 +- .../ReactAndroid/api/ReactAndroid.api | 1 + .../com/facebook/react/ReactRootView.java | 15 +-- .../react/runtime/BridgelessReactContext.kt | 2 +- .../react/uimanager/BaseViewManager.java | 3 +- .../react/uimanager/UIManagerHelper.kt | 52 ++------ .../views/drawer/ReactDrawerLayoutManager.kt | 3 +- .../react/views/image/ReactImageView.kt | 7 +- .../views/modal/ReactModalHostManager.kt | 2 +- .../views/scroll/ReactScrollViewHelper.kt | 2 +- .../swiperefresh/SwipeRefreshLayoutManager.kt | 2 +- .../views/switchview/ReactSwitchManager.kt | 2 +- .../text/internal/span/ReactClickableSpan.kt | 2 +- .../views/text/internal/span/ReactLinkSpan.kt | 2 +- .../textinput/ReactTextContentSizeWatcher.kt | 2 +- .../views/textinput/ReactTextInputManager.kt | 2 +- .../textinput/ReactTextInputTextWatcher.kt | 3 +- .../views/textinput/ReactTextScrollWatcher.kt | 2 +- .../textinput/ReactTextSelectionWatcher.kt | 2 +- .../react/views/view/ReactViewManager.kt | 3 +- .../virtual/view/ReactVirtualViewManager.kt | 2 +- .../java/com/facebook/react/RootViewTest.kt | 122 ------------------ .../react/uiapp/component/MyNativeView.kt | 4 +- 23 files changed, 42 insertions(+), 199 deletions(-) diff --git a/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/ReactPopupMenuContainer.kt b/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/ReactPopupMenuContainer.kt index c0963d057a94..c2ceb195cdcc 100644 --- a/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/ReactPopupMenuContainer.kt +++ b/packages/react-native-popup-menu-android/android/src/main/java/com/facebook/react/popupmenu/ReactPopupMenuContainer.kt @@ -34,7 +34,7 @@ public class ReactPopupMenuContainer(context: Context) : FrameLayout(context) { } popupMenu.setOnMenuItemClickListener { menuItem -> val reactContext = context as ReactContext - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) if (eventDispatcher != null) { val surfaceId = UIManagerHelper.getSurfaceId(reactContext) eventDispatcher.dispatchEvent(PopupMenuSelectionEvent(surfaceId, id, menuItem.order)) @@ -43,7 +43,7 @@ public class ReactPopupMenuContainer(context: Context) : FrameLayout(context) { } popupMenu.setOnDismissListener { val reactContext = context as ReactContext - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) if (eventDispatcher != null) { val surfaceId = UIManagerHelper.getSurfaceId(reactContext) eventDispatcher.dispatchEvent(PopupMenuDismissEvent(surfaceId, id)) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index e94080b44e3c..5d8dbfffdd09 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -4324,6 +4324,7 @@ public final class com/facebook/react/uimanager/UIManagerHelper { public static final field PADDING_START_INDEX I public static final field PADDING_TOP_INDEX I public static final fun getDefaultTextInputPadding (Landroid/content/Context;)[F + public static final fun getEventDispatcher (Lcom/facebook/react/bridge/ReactContext;)Lcom/facebook/react/uimanager/events/EventDispatcher; public static final fun getEventDispatcher (Lcom/facebook/react/bridge/ReactContext;I)Lcom/facebook/react/uimanager/events/EventDispatcher; public static final fun getEventDispatcherForReactTag (Lcom/facebook/react/bridge/ReactContext;I)Lcom/facebook/react/uimanager/events/EventDispatcher; public static final fun getReactContext (Landroid/view/View;)Lcom/facebook/react/bridge/ReactContext; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index d2323b662460..7379f69f0e9e 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -213,8 +213,7 @@ public void onChildStartedNativeGesture(View childView, MotionEvent ev) { return; } - EventDispatcher eventDispatcher = - UIManagerHelper.getEventDispatcher(reactContext, getUIManagerType()); + EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext); if (eventDispatcher != null) { mJSTouchDispatcher.onChildStartedNativeGesture(ev, eventDispatcher, reactContext); if (childView != null && mJSPointerDispatcher != null) { @@ -229,8 +228,7 @@ public void onChildEndedNativeGesture(View childView, MotionEvent ev) { return; } - EventDispatcher eventDispatcher = - UIManagerHelper.getEventDispatcher(getCurrentReactContext(), getUIManagerType()); + EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcher(getCurrentReactContext()); if (eventDispatcher != null) { mJSTouchDispatcher.onChildEndedNativeGesture(ev, eventDispatcher); if (mJSPointerDispatcher != null) { @@ -411,8 +409,7 @@ protected void dispatchJSPointerEvent(MotionEvent event, boolean isCapture) { return; } - EventDispatcher eventDispatcher = - UIManagerHelper.getEventDispatcher(getCurrentReactContext(), getUIManagerType()); + EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcher(getCurrentReactContext()); if (eventDispatcher != null) { mJSPointerDispatcher.handleMotionEvent(event, eventDispatcher, isCapture); } @@ -428,8 +425,7 @@ protected void dispatchJSTouchEvent(MotionEvent event) { return; } - EventDispatcher eventDispatcher = - UIManagerHelper.getEventDispatcher(getCurrentReactContext(), getUIManagerType()); + EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcher(getCurrentReactContext()); if (eventDispatcher != null) { mJSTouchDispatcher.handleTouchEvent(event, eventDispatcher, getCurrentReactContext()); } @@ -451,8 +447,7 @@ protected void dispatchJSKeyEvent(KeyEvent ev) { } ReactContext context = getCurrentReactContext(); if (context != null) { - EventDispatcher eventDispatcher = - UIManagerHelper.getEventDispatcher(context, getUIManagerType()); + EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcher(context); int surfaceId = UIManagerHelper.getSurfaceId(context); if (eventDispatcher != null) { mJSKeyDispatcher.handleKeyEvent(ev, eventDispatcher, surfaceId); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.kt index 4e357145f5c9..91a376498681 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.kt @@ -134,7 +134,7 @@ internal class BridgelessReactContext(context: Context, private val reactHost: R logSoftException( TAG, IllegalArgumentException( - "getJSModule(RCTEventEmitter) is not recommended in the new architecture and will stop working with interop disabled. Please use UIManagerHelper.getEventDispatcher or UIManagerHelper.getEventDispatcherForReactTag instead" + "getJSModule(RCTEventEmitter) is not recommended in the new architecture and will stop working with interop disabled. Please use UIManagerHelper.getEventDispatcher instead" ), ) } 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 28d92671f19a..4dce0dd995c9 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 @@ -1039,8 +1039,7 @@ public void onFocusChange(View view, boolean hasFocus) { if (view.getContext() instanceof ThemedReactContext) { ThemedReactContext themedReactContext = (ThemedReactContext) view.getContext(); @Nullable - EventDispatcher eventDispatcher = - UIManagerHelper.getEventDispatcherForReactTag(themedReactContext, view.getId()); + EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcher(themedReactContext); if (eventDispatcher != null) { if (hasFocus) { eventDispatcher.dispatchEvent(new FocusEvent(surfaceId, view.getId())); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.kt index 758f3f069d7b..ebbec34138f0 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.kt @@ -112,56 +112,32 @@ public object UIManagerHelper { } } - /** @return the [EventDispatcher] that handles events for the reactTag received as a parameter. */ + /** @return the [EventDispatcher] that handles events for the given [ReactContext]. */ @JvmStatic - public fun getEventDispatcherForReactTag(context: ReactContext, reactTag: Int): EventDispatcher? { - val eventDispatcher = getEventDispatcher(context, getUIManagerType(reactTag)) - if (eventDispatcher == null) { - ReactSoftExceptionLogger.logSoftException( - TAG, - IllegalStateException("Cannot get EventDispatcher for reactTag $reactTag"), - ) + public fun getEventDispatcher(context: ReactContext): EventDispatcher? { + var localContext = context + if (localContext is ThemedReactContext) { + localContext = localContext.reactApplicationContext } - return eventDispatcher + return (localContext as EventDispatcherProvider).getEventDispatcher() } + /** @return the [EventDispatcher] that handles events for the reactTag received as a parameter. */ + @JvmStatic + @Deprecated("reactTag is no longer needed", ReplaceWith("getEventDispatcher(context)")) + public fun getEventDispatcherForReactTag(context: ReactContext, reactTag: Int): EventDispatcher? = + getEventDispatcher(context) + /** * @return the [EventDispatcher] that handles events for the [UIManagerType] received as a * parameter. */ @JvmStatic + @Deprecated("UIManagerType is no longer needed", ReplaceWith("getEventDispatcher(context)")) public fun getEventDispatcher( context: ReactContext, @UIManagerType uiManagerType: Int, - ): EventDispatcher? { - // TODO T67518514 Clean this up once we migrate everything over to bridgeless mode - var localContext = context - if (localContext.isBridgeless()) { - if (localContext is ThemedReactContext) { - localContext = localContext.reactApplicationContext - } - return (localContext as EventDispatcherProvider).getEventDispatcher() - } - val uiManager = getUIManager(localContext, uiManagerType, false) - if (uiManager == null) { - ReactSoftExceptionLogger.logSoftException( - TAG, - ReactNoCrashSoftException("Unable to find UIManager for UIManagerType $uiManagerType"), - ) - return null - } - val eventDispatcher = uiManager.eventDispatcher - // Linter shows "Condition is always 'false'." - // Keeping it for now as it was in the original Java code. - @Suppress("SENSELESS_COMPARISON") - if (eventDispatcher == null) { - ReactSoftExceptionLogger.logSoftException( - TAG, - IllegalStateException("Cannot get EventDispatcher for UIManagerType $uiManagerType"), - ) - } - return eventDispatcher - } + ): EventDispatcher? = getEventDispatcher(context) /** * @return The [ReactContext] associated to the [View] received as a parameter. diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt index 2495a76716e7..c650fda90f03 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.kt @@ -46,8 +46,7 @@ public class ReactDrawerLayoutManager : reactContext: ThemedReactContext, view: ReactDrawerLayout, ) { - val eventDispatcher = - UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id) ?: return + val eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) ?: return view.addDrawerListener(DrawerEventEmitter(view, eventDispatcher)) } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt index 3378e2886ec4..1e9126710689 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt @@ -129,9 +129,7 @@ public class ReactImageView( if (!shouldNotify) { downloadListener = null } else { - val eventDispatcher = - UIManagerHelper.getEventDispatcherForReactTag((context as ReactContext), id) - + val eventDispatcher = UIManagerHelper.getEventDispatcher((context as ReactContext)) downloadListener = object : ReactImageDownloadListener() { override fun onProgressChange(loaded: Int, total: Int) { @@ -378,8 +376,7 @@ public class ReactImageView( } catch (e: RuntimeException) { // Only provide updates if downloadListener is set (shouldNotify is true) if (downloadListener != null) { - val eventDispatcher = - UIManagerHelper.getEventDispatcherForReactTag(context as ReactContext, id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(context as ReactContext) eventDispatcher?.dispatchEvent( createErrorEvent(UIManagerHelper.getSurfaceId(this), id, e) ) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.kt index 0b928ca820cf..08271631cdfc 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.kt @@ -91,7 +91,7 @@ internal class ReactModalHostManager : } override fun addEventEmitters(reactContext: ThemedReactContext, view: ReactModalHostView) { - val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id) + val dispatcher = UIManagerHelper.getEventDispatcher(reactContext) if (dispatcher != null) { view.onRequestCloseListener = OnRequestCloseListener { dispatcher.dispatchEvent( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt index 8bc51730405d..8839a6810022 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt @@ -133,7 +133,7 @@ public object ReactScrollViewHelper { // if there's a crash initiated from JS and we tap on a ScrollView // around teardown of RN, this will cause a NPE. We can safely ignore // this since the crash is usually a red herring. - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, scrollView.id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) if (eventDispatcher != null) { eventDispatcher.dispatchEvent( ScrollEvent.obtain( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/SwipeRefreshLayoutManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/SwipeRefreshLayoutManager.kt index 0a6a9e2286ea..be7eb22f30d8 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/SwipeRefreshLayoutManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/SwipeRefreshLayoutManager.kt @@ -112,7 +112,7 @@ internal open class SwipeRefreshLayoutManager : override fun addEventEmitters(reactContext: ThemedReactContext, view: ReactSwipeRefreshLayout) { view.setOnRefreshListener { - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) eventDispatcher?.dispatchEvent(RefreshEvent(UIManagerHelper.getSurfaceId(view), view.id)) } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.kt index 632cc3f13db3..fca2a534f005 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.kt @@ -139,7 +139,7 @@ internal class ReactSwitchManager : CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> val reactContext = buttonView.context as ReactContext val reactTag = buttonView.id - UIManagerHelper.getEventDispatcherForReactTag(reactContext, reactTag) + UIManagerHelper.getEventDispatcher(reactContext) ?.dispatchEvent( ReactSwitchEvent(UIManagerHelper.getSurfaceId(reactContext), reactTag, isChecked) ) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactClickableSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactClickableSpan.kt index 2ca54a7d4fd9..2787e6459204 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactClickableSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactClickableSpan.kt @@ -42,7 +42,7 @@ internal class ReactClickableSpan(val reactTag: Int) : ClickableSpan(), ReactSpa override fun onClick(view: View) { val context = view.context as ReactContext - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, reactTag) + val eventDispatcher = UIManagerHelper.getEventDispatcher(context) eventDispatcher?.dispatchEvent( ViewGroupClickEvent(UIManagerHelper.getSurfaceId(context), reactTag) ) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactLinkSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactLinkSpan.kt index aba28b094ac7..8c44f53f86fc 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactLinkSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactLinkSpan.kt @@ -42,7 +42,7 @@ internal class ReactLinkSpan(val fragmentIndex: Int) : ClickableSpan(), ReactSpa else -> null } ?: return val reactTag = preparedLayout.reactTags[fragmentIndex] - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, reactTag) + val eventDispatcher = UIManagerHelper.getEventDispatcher(context) eventDispatcher?.dispatchEvent( ViewGroupClickEvent(UIManagerHelper.getSurfaceId(context), reactTag) ) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextContentSizeWatcher.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextContentSizeWatcher.kt index 3f654f79869f..2652cf3396a5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextContentSizeWatcher.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextContentSizeWatcher.kt @@ -20,7 +20,7 @@ internal class ReactTextContentSizeWatcher(private val editText: ReactEditText) init { val reactContext = UIManagerHelper.getReactContext(editText) - eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, editText.id) + eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) surfaceId = UIManagerHelper.getSurfaceId(reactContext) } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt index 21fbfb4d06d9..83cbb9a75336 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt @@ -1151,6 +1151,6 @@ public open class ReactTextInputManager public constructor() : private fun getEventDispatcher( reactContext: ReactContext, editText: ReactEditText, - ): EventDispatcher? = UIManagerHelper.getEventDispatcherForReactTag(reactContext, editText.id) + ): EventDispatcher? = UIManagerHelper.getEventDispatcher(reactContext) } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputTextWatcher.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputTextWatcher.kt index e6e13a00955a..22e20f799c21 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputTextWatcher.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputTextWatcher.kt @@ -19,8 +19,7 @@ internal class ReactTextInputTextWatcher( reactContext: ReactContext, private val editText: ReactEditText, ) : TextWatcher { - private val eventDispatcher: EventDispatcher? = - UIManagerHelper.getEventDispatcherForReactTag(reactContext, editText.id) + private val eventDispatcher: EventDispatcher? = UIManagerHelper.getEventDispatcher(reactContext) private val surfaceId = UIManagerHelper.getSurfaceId(reactContext) private var previousText: String? = null diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextScrollWatcher.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextScrollWatcher.kt index be45eb8528ea..7d2dc1690644 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextScrollWatcher.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextScrollWatcher.kt @@ -20,7 +20,7 @@ internal class ReactTextScrollWatcher(private val editText: ReactEditText) : Scr init { val reactContext = UIManagerHelper.getReactContext(editText) - eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, editText.id) + eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) surfaceId = UIManagerHelper.getSurfaceId(reactContext) } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextSelectionWatcher.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextSelectionWatcher.kt index a799906c03fa..540a2963e8b9 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextSelectionWatcher.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextSelectionWatcher.kt @@ -20,7 +20,7 @@ internal class ReactTextSelectionWatcher(private val editText: ReactEditText) : init { val reactContext = UIManagerHelper.getReactContext(editText) - eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, editText.id) + eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) surfaceId = UIManagerHelper.getSurfaceId(reactContext) } 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 1ced2c033428..2421c99a8a2f 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 @@ -402,8 +402,7 @@ public open class ReactViewManager : ReactClippingViewManager() public open fun setFocusable(view: ReactViewGroup, focusable: Boolean) { if (focusable) { view.setOnClickListener { - val eventDispatcher = - UIManagerHelper.getEventDispatcherForReactTag((view.context as ReactContext), view.id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(view.context as ReactContext) eventDispatcher?.dispatchEvent( ViewGroupClickEvent(UIManagerHelper.getSurfaceId(view.context), view.id) ) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/view/ReactVirtualViewManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/view/ReactVirtualViewManager.kt index fe8a23e312d5..6ef5da456f22 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/view/ReactVirtualViewManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/virtual/view/ReactVirtualViewManager.kt @@ -61,7 +61,7 @@ public class ReactVirtualViewManager : reactContext: ThemedReactContext, view: ReactVirtualView, ) { - val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id) ?: return + val dispatcher = UIManagerHelper.getEventDispatcher(reactContext) ?: return view.modeChangeEmitter = VirtualViewEventEmitter(view.id, UIManagerHelper.getSurfaceId(reactContext), dispatcher) } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt index 3411c37d697e..ff1b35d33659 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.kt @@ -12,38 +12,24 @@ package com.facebook.react import android.app.Activity import android.graphics.Insets import android.graphics.Rect -import android.view.MotionEvent import android.view.WindowInsets import android.view.WindowManager import com.facebook.react.bridge.Arguments import com.facebook.react.bridge.BridgeReactContext import com.facebook.react.bridge.CatalystInstance -import com.facebook.react.bridge.JavaOnlyMap import com.facebook.react.bridge.ReactTestHelper -import com.facebook.react.bridge.WritableArray -import com.facebook.react.common.SystemClock import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests import com.facebook.react.uimanager.DisplayMetricsHolder import com.facebook.react.uimanager.UIManagerModule -import com.facebook.react.uimanager.events.EventDispatcher -import com.facebook.react.uimanager.events.RCTEventEmitter -import com.facebook.react.uimanager.events.TouchEvent import com.facebook.testutils.shadows.ShadowArguments -import java.util.Date import org.assertj.core.api.Assertions.* import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.kotlin.KArgumentCaptor -import org.mockito.kotlin.any -import org.mockito.kotlin.argumentCaptor -import org.mockito.kotlin.eq import org.mockito.kotlin.mock -import org.mockito.kotlin.reset import org.mockito.kotlin.spy import org.mockito.kotlin.times import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner @@ -57,12 +43,6 @@ class RootViewTest { private lateinit var reactContext: BridgeReactContext private lateinit var catalystInstanceMock: CatalystInstance - private lateinit var downEventCaptor: KArgumentCaptor - private lateinit var downActionTouchesArgCaptor: KArgumentCaptor - - private lateinit var upEventCaptor: KArgumentCaptor - private lateinit var upActionTouchesArgCaptor: KArgumentCaptor - @Before fun setUp() { ReactNativeFeatureFlagsForTests.setUp() @@ -75,108 +55,6 @@ class RootViewTest { val uiManagerModuleMock: UIManagerModule = mock() whenever(catalystInstanceMock.getNativeModule(UIManagerModule::class.java)) .thenReturn(uiManagerModuleMock) - - downEventCaptor = argumentCaptor() - downActionTouchesArgCaptor = argumentCaptor() - - upEventCaptor = argumentCaptor() - upActionTouchesArgCaptor = argumentCaptor() - } - - @Test - fun testTouchEmitter() { - val instanceManager: ReactInstanceManager = mock() - whenever(instanceManager.currentReactContext).thenReturn(reactContext) - val uiManager: UIManagerModule = mock() - val eventDispatcher: EventDispatcher = mock() - val eventEmitterModuleMock: RCTEventEmitter = mock() - whenever(catalystInstanceMock.getNativeModule(UIManagerModule::class.java)) - .thenReturn(uiManager) - whenever(uiManager.eventDispatcher).thenReturn(eventDispatcher) - - // RootView IDs is React Native follow the 11, 21, 31, ... progression. - val rootViewId = 11 - val rootView = ReactRootView(reactContext) - rootView.id = rootViewId - rootView.setRootViewTag(rootViewId) - rootView.startReactApplication(instanceManager, "") - rootView.simulateAttachForTesting() - val ts = SystemClock.currentTimeMillis() - - // Test ACTION_DOWN event - rootView.onTouchEvent(MotionEvent.obtain(100, ts, MotionEvent.ACTION_DOWN, 0f, 0f, 0)) - - verify(eventDispatcher).dispatchEvent(downEventCaptor.capture()) - verifyNoMoreInteractions(eventDispatcher) - downEventCaptor.firstValue.dispatch(eventEmitterModuleMock) - verify(eventEmitterModuleMock) - .receiveTouches(eq("topTouchStart"), downActionTouchesArgCaptor.capture(), any()) - verifyNoMoreInteractions(eventEmitterModuleMock) - assertThat(downActionTouchesArgCaptor.firstValue.size()).isEqualTo(1) - assertThat(downActionTouchesArgCaptor.firstValue.getMap(0)) - .isEqualTo( - JavaOnlyMap.of( - "pageX", - 0.0, - "pageY", - 0.0, - "locationX", - 0.0, - "locationY", - 0.0, - "target", - rootViewId, - "timestamp", - ts.toDouble(), - "identifier", - 0.0, - "targetSurface", - -1, - ) - ) - - // Test ACTION_UP event - reset(eventEmitterModuleMock, eventDispatcher) - - rootView.onTouchEvent(MotionEvent.obtain(50, ts, MotionEvent.ACTION_UP, 0f, 0f, 0)) - - verify(eventDispatcher).dispatchEvent(upEventCaptor.capture()) - verifyNoMoreInteractions(eventDispatcher) - upEventCaptor.firstValue.dispatch(eventEmitterModuleMock) - verify(eventEmitterModuleMock) - .receiveTouches(eq("topTouchEnd"), upActionTouchesArgCaptor.capture(), any()) - verifyNoMoreInteractions(eventEmitterModuleMock) - assertThat(upActionTouchesArgCaptor.firstValue.size()).isEqualTo(1) - assertThat(upActionTouchesArgCaptor.firstValue.getMap(0)) - .isEqualTo( - JavaOnlyMap.of( - "pageX", - 0.0, - "pageY", - 0.0, - "locationX", - 0.0, - "locationY", - 0.0, - "target", - rootViewId, - "timestamp", - ts.toDouble(), - "identifier", - 0.0, - "targetSurface", - -1, - ) - ) - - // Test other action - reset(eventDispatcher) - - rootView.onTouchEvent( - MotionEvent.obtain(50, Date().time, MotionEvent.ACTION_HOVER_MOVE, 0f, 0f, 0) - ) - - verifyNoMoreInteractions(eventDispatcher) } @Test diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt index bf893d66d862..074207354abb 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/component/MyNativeView.kt @@ -118,7 +118,7 @@ internal class MyNativeView(context: ThemedReactContext) : View(context) { val reactContext = context as ReactContext val surfaceId = UIManagerHelper.getSurfaceId(reactContext) - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) val event = OnIntArrayChangedEvent(surfaceId, id, payload) eventDispatcher?.dispatchEvent(event) @@ -127,7 +127,7 @@ internal class MyNativeView(context: ThemedReactContext) : View(context) { fun emitLegacyStyleEvent() { val reactContext = context as ReactContext val surfaceId = UIManagerHelper.getSurfaceId(reactContext) - val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id) + val eventDispatcher = UIManagerHelper.getEventDispatcher(reactContext) val payload = Arguments.createMap().apply { putString("string", "Legacy Style Event Fired.") } val event = OnLegacyStyleEvent(surfaceId, id, payload) eventDispatcher?.dispatchEvent(event)