diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java index 920ce021812..88e0cf51e09 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java @@ -259,8 +259,7 @@ public class TextInputTestCase extends ReactAppInstrumentationTestCase { /** * Test that the mentions input has colors displayed correctly. Removed for being flaky in open * source, December 2016 public void testMetionsInputColors() throws Throwable { EventDispatcher - * eventDispatcher = - * getReactContext().getNativeModule(UIManagerModule.class).getEventDispatcher(); ReactEditText + * eventDispatcher = UIManagerHelper.getEventEmitterForReactTag(reactContext, tag); ReactEditText * reactEditText = getViewByTestId("tokenizedInput"); String newText = "#Things and more #things"; * int contentWidth = reactEditText.getWidth(); int contentHeight = reactEditText.getHeight(); int * start = 0; int count = newText.length(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.java index 712353eb0a4..38e79af50c7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.java @@ -20,7 +20,7 @@ import com.facebook.react.common.MapBuilder; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ThemedReactContext; -import com.facebook.react.uimanager.UIManagerModule; +import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.ViewGroupManager; import com.facebook.react.uimanager.ViewManagerDelegate; import com.facebook.react.uimanager.annotations.ReactProp; @@ -56,12 +56,13 @@ public class ReactDrawerLayoutManager extends ViewGroupManager dispatcher.dispatchEvent(new ShowEvent(view.getId())); } }); + view.setEventDispatcher(dispatcher); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java index d1bdd2f6faa..db03bfac47a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java @@ -202,6 +202,10 @@ public class ReactModalHostView extends ViewGroup mPropertyRequiresNewDialog = true; } + void setEventDispatcher(EventDispatcher eventDispatcher) { + mHostView.setEventDispatcher(eventDispatcher); + } + @Override public void onHostResume() { // We show the dialog again when the host resumes @@ -393,6 +397,7 @@ public class ReactModalHostView extends ViewGroup private boolean hasAdjustedSize = false; private int viewWidth; private int viewHeight; + private EventDispatcher mEventDispatcher; private final FabricViewStateManager mFabricViewStateManager = new FabricViewStateManager(); @@ -402,6 +407,10 @@ public class ReactModalHostView extends ViewGroup super(context); } + private void setEventDispatcher(EventDispatcher eventDispatcher) { + mEventDispatcher = eventDispatcher; + } + @Override protected void onSizeChanged(final int w, final int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); @@ -494,13 +503,13 @@ public class ReactModalHostView extends ViewGroup @Override public boolean onInterceptTouchEvent(MotionEvent event) { - mJSTouchDispatcher.handleTouchEvent(event, getEventDispatcher()); + mJSTouchDispatcher.handleTouchEvent(event, mEventDispatcher); return super.onInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { - mJSTouchDispatcher.handleTouchEvent(event, getEventDispatcher()); + mJSTouchDispatcher.handleTouchEvent(event, mEventDispatcher); super.onTouchEvent(event); // In case when there is no children interested in handling touch event, we return true from // the root view in order to receive subsequent events related to that gesture @@ -509,7 +518,7 @@ public class ReactModalHostView extends ViewGroup @Override public void onChildStartedNativeGesture(MotionEvent androidEvent) { - mJSTouchDispatcher.onChildStartedNativeGesture(androidEvent, getEventDispatcher()); + mJSTouchDispatcher.onChildStartedNativeGesture(androidEvent, mEventDispatcher); } @Override @@ -518,11 +527,6 @@ public class ReactModalHostView extends ViewGroup // even when some other view disallow that } - private EventDispatcher getEventDispatcher() { - ReactContext reactContext = getReactContext(); - return reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher(); - } - @Override public FabricViewStateManager getFabricViewStateManager() { return mFabricViewStateManager; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java index 9c8bc9ced0b..479252c2037 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java @@ -26,10 +26,11 @@ import com.facebook.react.uimanager.LayoutShadowNode; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; -import com.facebook.react.uimanager.UIManagerModule; +import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.ViewManagerDelegate; import com.facebook.react.uimanager.ViewProps; import com.facebook.react.uimanager.annotations.ReactProp; +import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.viewmanagers.SliderManagerDelegate; import com.facebook.react.viewmanagers.SliderManagerInterface; import com.facebook.yoga.YogaMeasureFunction; @@ -95,16 +96,13 @@ public class ReactSliderManager extends SimpleViewManager @Override public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) { ReactContext reactContext = (ReactContext) seekbar.getContext(); - UIManagerModule uiManager = reactContext.getNativeModule(UIManagerModule.class); + EventDispatcher eventDispatcher = + UIManagerHelper.getEventDispatcherForReactTag(reactContext, seekbar.getId()); - if (uiManager != null) { - uiManager - .getEventDispatcher() - .dispatchEvent( - new ReactSliderEvent( - seekbar.getId(), - ((ReactSlider) seekbar).toRealProgress(progress), - fromUser)); + if (eventDispatcher != null) { + eventDispatcher.dispatchEvent( + new ReactSliderEvent( + seekbar.getId(), ((ReactSlider) seekbar).toRealProgress(progress), fromUser)); } } @@ -114,15 +112,14 @@ public class ReactSliderManager extends SimpleViewManager @Override public void onStopTrackingTouch(SeekBar seekbar) { ReactContext reactContext = (ReactContext) seekbar.getContext(); - UIManagerModule uiManager = reactContext.getNativeModule(UIManagerModule.class); + EventDispatcher eventDispatcher = + UIManagerHelper.getEventDispatcherForReactTag(reactContext, seekbar.getId()); - if (uiManager != null) { - uiManager - .getEventDispatcher() - .dispatchEvent( - new ReactSlidingCompleteEvent( - seekbar.getId(), - ((ReactSlider) seekbar).toRealProgress(seekbar.getProgress()))); + if (eventDispatcher != null) { + eventDispatcher.dispatchEvent( + new ReactSlidingCompleteEvent( + seekbar.getId(), + ((ReactSlider) seekbar).toRealProgress(seekbar.getProgress()))); } } }; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index f908681034f..8e1e74ab845 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -45,6 +45,7 @@ import com.facebook.react.bridge.ReactSoftException; import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.uimanager.FabricViewStateManager; import com.facebook.react.uimanager.UIManagerModule; +import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.views.text.CustomLetterSpacingSpan; import com.facebook.react.views.text.CustomLineHeightSpan; import com.facebook.react.views.text.CustomStyleSpan; @@ -119,6 +120,7 @@ public class ReactEditText extends AppCompatEditText protected boolean mIsSettingTextFromState = false; private static final KeyListener sKeyListener = QwertyKeyListener.getInstanceForFullKeyboard(); + private @Nullable EventDispatcher mEventDispatcher; public ReactEditText(Context context) { super(context); @@ -247,7 +249,8 @@ public class ReactEditText extends AppCompatEditText InputConnection inputConnection = super.onCreateInputConnection(outAttrs); if (inputConnection != null && mOnKeyPress) { inputConnection = - new ReactEditTextInputConnectionWrapper(inputConnection, reactContext, this); + new ReactEditTextInputConnectionWrapper( + inputConnection, reactContext, this, mEventDispatcher); } if (isMultiline() && getBlurOnSubmit()) { @@ -1043,6 +1046,10 @@ public class ReactEditText extends AppCompatEditText TextLayoutManager.setCachedSpannabledForTag(getId(), sb); } + void setEventDispatcher(@Nullable EventDispatcher eventDispatcher) { + mEventDispatcher = eventDispatcher; + } + /** * This class will redirect *TextChanged calls to the listeners only in the case where the text is * changed by the user, and not explicitly set by JS. diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditTextInputConnectionWrapper.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditTextInputConnectionWrapper.java index 47b4391c327..55ae040054b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditTextInputConnectionWrapper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditTextInputConnectionWrapper.java @@ -12,9 +12,7 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionWrapper; import androidx.annotation.Nullable; -import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReactContext; -import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.EventDispatcher; /** @@ -61,11 +59,12 @@ class ReactEditTextInputConnectionWrapper extends InputConnectionWrapper { private @Nullable String mKey = null; public ReactEditTextInputConnectionWrapper( - InputConnection target, final ReactContext reactContext, final ReactEditText editText) { + InputConnection target, + final ReactContext reactContext, + final ReactEditText editText, + EventDispatcher eventDispatcher) { super(target, false); - mEventDispatcher = - Assertions.assertNotNull(reactContext.getNativeModule(UIManagerModule.class)) - .getEventDispatcher(); + mEventDispatcher = eventDispatcher; mEditText = editText; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java index 6d9ab0d39b6..d8cd58f3801 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java @@ -968,6 +968,7 @@ public class ReactTextInputManager extends BaseViewManager