Support RCTModernEventEmitter in for ReactTextInput* Event classes

Summary:
Support RCTEventEmitterV2 in ReactTextInput*Event classes for optimal Fabric perf. Backwards-compatible with non-Fabric renderer.

Changelog: [Changed][Android] Old native ReactTextInput*Event creation APIs have changed, and will be removed in the (distant) future. The old methods will work for now with minor perf implications for Fabric.

Reviewed By: mdvacca

Differential Revision: D26031261

fbshipit-source-id: 7c972ecfd1e395104c4639995bb5ecc5f7c6baae
This commit is contained in:
Joshua Gross
2021-01-22 19:32:15 -08:00
committed by Facebook GitHub Bot
parent ddabf3fd56
commit ee10932e26
10 changed files with 147 additions and 18 deletions
@@ -11,6 +11,7 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/** Event emitted by EditText native view when content size changes. */
public class ReactContentSizeChangedEvent extends Event<ReactTextChangedEvent> {
@@ -20,8 +21,14 @@ public class ReactContentSizeChangedEvent extends Event<ReactTextChangedEvent> {
private float mContentWidth;
private float mContentHeight;
@Deprecated
public ReactContentSizeChangedEvent(int viewId, float contentSizeWidth, float contentSizeHeight) {
super(viewId);
this(-1, viewId, contentSizeWidth, contentSizeHeight);
}
public ReactContentSizeChangedEvent(
int surfaceId, int viewId, float contentSizeWidth, float contentSizeHeight) {
super(surfaceId, viewId);
mContentWidth = contentSizeWidth;
mContentHeight = contentSizeHeight;
}
@@ -36,6 +43,12 @@ public class ReactContentSizeChangedEvent extends Event<ReactTextChangedEvent> {
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
@@ -11,6 +11,7 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/**
* Event emitted by EditText native view when text changes. VisibleForTesting from {@link
@@ -23,8 +24,13 @@ public class ReactTextChangedEvent extends Event<ReactTextChangedEvent> {
private String mText;
private int mEventCount;
@Deprecated
public ReactTextChangedEvent(int viewId, String text, int eventCount) {
super(viewId);
this(-1, viewId, text, eventCount);
}
public ReactTextChangedEvent(int surfaceId, int viewId, String text, int eventCount) {
super(surfaceId, viewId);
mText = text;
mEventCount = eventCount;
}
@@ -39,6 +45,12 @@ public class ReactTextChangedEvent extends Event<ReactTextChangedEvent> {
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putString("text", mText);
@@ -11,14 +11,20 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/** Event emitted by EditText native view when it loses focus. */
/* package */ class ReactTextInputBlurEvent extends Event<ReactTextInputBlurEvent> {
private static final String EVENT_NAME = "topBlur";
@Deprecated
public ReactTextInputBlurEvent(int viewId) {
super(viewId);
this(-1, viewId);
}
public ReactTextInputBlurEvent(int surfaceId, int viewId) {
super(surfaceId, viewId);
}
@Override
@@ -36,6 +42,12 @@ import com.facebook.react.uimanager.events.RCTEventEmitter;
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putInt("target", getViewTag());
@@ -11,6 +11,7 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/**
* Event emitted by EditText native view when text editing ends, because of the user leaving the
@@ -22,8 +23,13 @@ class ReactTextInputEndEditingEvent extends Event<ReactTextInputEndEditingEvent>
private String mText;
@Deprecated
public ReactTextInputEndEditingEvent(int viewId, String text) {
super(viewId);
this(-1, viewId, text);
}
public ReactTextInputEndEditingEvent(int surfaceId, int viewId, String text) {
super(surfaceId, viewId);
mText = text;
}
@@ -42,6 +48,12 @@ class ReactTextInputEndEditingEvent extends Event<ReactTextInputEndEditingEvent>
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putInt("target", getViewTag());
@@ -11,6 +11,7 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/**
* Event emitted by EditText native view when text changes. VisibleForTesting from {@link
@@ -25,9 +26,15 @@ public class ReactTextInputEvent extends Event<ReactTextInputEvent> {
private int mRangeStart;
private int mRangeEnd;
@Deprecated
public ReactTextInputEvent(
int viewId, String text, String previousText, int rangeStart, int rangeEnd) {
super(viewId);
this(-1, viewId, text, previousText, rangeStart, rangeEnd);
}
public ReactTextInputEvent(
int surfaceId, int viewId, String text, String previousText, int rangeStart, int rangeEnd) {
super(surfaceId, viewId);
mText = text;
mPreviousText = previousText;
mRangeStart = rangeStart;
@@ -50,6 +57,12 @@ public class ReactTextInputEvent extends Event<ReactTextInputEvent> {
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
WritableMap range = Arguments.createMap();
@@ -11,14 +11,20 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/** Event emitted by EditText native view when it receives focus. */
/* package */ class ReactTextInputFocusEvent extends Event<ReactTextInputFocusEvent> {
private static final String EVENT_NAME = "topFocus";
@Deprecated
public ReactTextInputFocusEvent(int viewId) {
super(viewId);
this(-1, viewId);
}
public ReactTextInputFocusEvent(int surfaceId, int viewId) {
super(surfaceId, viewId);
}
@Override
@@ -36,6 +42,12 @@ import com.facebook.react.uimanager.events.RCTEventEmitter;
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putInt("target", getViewTag());
@@ -11,6 +11,7 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/** Event emitted by EditText native view when key pressed */
public class ReactTextInputKeyPressEvent extends Event<ReactTextInputEvent> {
@@ -19,8 +20,13 @@ public class ReactTextInputKeyPressEvent extends Event<ReactTextInputEvent> {
private String mKey;
@Deprecated
ReactTextInputKeyPressEvent(int viewId, final String key) {
super(viewId);
this(-1, viewId, key);
}
ReactTextInputKeyPressEvent(int surfaceId, int viewId, final String key) {
super(surfaceId, viewId);
mKey = key;
}
@@ -40,6 +46,12 @@ public class ReactTextInputKeyPressEvent extends Event<ReactTextInputEvent> {
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putString("key", mKey);
@@ -897,12 +897,14 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
private EventDispatcher mEventDispatcher;
private ReactEditText mEditText;
private String mPreviousText;
private int mSurfaceId;
public ReactTextInputTextWatcher(
final ReactContext reactContext, final ReactEditText editText) {
mEventDispatcher = getEventDispatcher(reactContext, editText);
mEditText = editText;
mPreviousText = null;
mSurfaceId = UIManagerHelper.getSurfaceId(reactContext);
}
@Override
@@ -955,10 +957,14 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
// TODO: t7936714 merge these events
mEventDispatcher.dispatchEvent(
new ReactTextChangedEvent(
mEditText.getId(), s.toString(), mEditText.incrementAndGetEventCounter()));
mSurfaceId,
mEditText.getId(),
s.toString(),
mEditText.incrementAndGetEventCounter()));
mEventDispatcher.dispatchEvent(
new ReactTextInputEvent(mEditText.getId(), newText, oldText, start, start + before));
new ReactTextInputEvent(
mSurfaceId, mEditText.getId(), newText, oldText, start, start + before));
}
@Override
@@ -973,15 +979,18 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
editText.setOnFocusChangeListener(
new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
int surfaceId = reactContext.getSurfaceId();
EventDispatcher eventDispatcher = getEventDispatcher(reactContext, editText);
if (hasFocus) {
eventDispatcher.dispatchEvent(new ReactTextInputFocusEvent(editText.getId()));
eventDispatcher.dispatchEvent(
new ReactTextInputFocusEvent(surfaceId, editText.getId()));
} else {
eventDispatcher.dispatchEvent(new ReactTextInputBlurEvent(editText.getId()));
eventDispatcher.dispatchEvent(
new ReactTextInputBlurEvent(surfaceId, editText.getId()));
eventDispatcher.dispatchEvent(
new ReactTextInputEndEditingEvent(
editText.getId(), editText.getText().toString()));
surfaceId, editText.getId(), editText.getText().toString()));
}
}
});
@@ -1006,7 +1015,9 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
EventDispatcher eventDispatcher = getEventDispatcher(reactContext, editText);
eventDispatcher.dispatchEvent(
new ReactTextInputSubmitEditingEvent(
editText.getId(), editText.getText().toString()));
reactContext.getSurfaceId(),
editText.getId(),
editText.getText().toString()));
if (blurOnSubmit) {
editText.clearFocus();
@@ -1039,11 +1050,13 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
private @Nullable EventDispatcher mEventDispatcher;
private int mPreviousContentWidth = 0;
private int mPreviousContentHeight = 0;
private int mSurfaceId;
public ReactContentSizeWatcher(ReactEditText editText) {
mEditText = editText;
ReactContext reactContext = getReactContext(editText);
mEventDispatcher = getEventDispatcher(reactContext, editText);
mSurfaceId = UIManagerHelper.getSurfaceId(reactContext);
}
@Override
@@ -1073,6 +1086,7 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
mEventDispatcher.dispatchEvent(
new ReactContentSizeChangedEvent(
mSurfaceId,
mEditText.getId(),
PixelUtil.toDIPFromPixel(contentWidth),
PixelUtil.toDIPFromPixel(contentHeight)));
@@ -1086,12 +1100,14 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
private EventDispatcher mEventDispatcher;
private int mPreviousSelectionStart;
private int mPreviousSelectionEnd;
private int mSurfaceId;
public ReactSelectionWatcher(ReactEditText editText) {
mReactEditText = editText;
ReactContext reactContext = getReactContext(editText);
mEventDispatcher = getEventDispatcher(reactContext, editText);
mSurfaceId = UIManagerHelper.getSurfaceId(reactContext);
}
@Override
@@ -1107,7 +1123,8 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
if (mPreviousSelectionStart != realStart || mPreviousSelectionEnd != realEnd) {
mEventDispatcher.dispatchEvent(
new ReactTextInputSelectionEvent(mReactEditText.getId(), realStart, realEnd));
new ReactTextInputSelectionEvent(
mSurfaceId, mReactEditText.getId(), realStart, realEnd));
mPreviousSelectionStart = realStart;
mPreviousSelectionEnd = realEnd;
@@ -1121,20 +1138,21 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
private EventDispatcher mEventDispatcher;
private int mPreviousHoriz;
private int mPreviousVert;
private int mSurfaceId;
public ReactScrollWatcher(ReactEditText editText) {
mReactEditText = editText;
ReactContext reactContext = getReactContext(editText);
mEventDispatcher = getEventDispatcher(reactContext, editText);
mSurfaceId = UIManagerHelper.getSurfaceId(reactContext);
}
@Override
public void onScrollChanged(int horiz, int vert, int oldHoriz, int oldVert) {
if (mPreviousHoriz != horiz || mPreviousVert != vert) {
int surfaceId = UIManagerHelper.getSurfaceId(mReactEditText);
ScrollEvent event =
ScrollEvent.obtain(
surfaceId,
mSurfaceId,
mReactEditText.getId(),
ScrollEventType.SCROLL,
horiz,
@@ -11,6 +11,7 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/** Event emitted by EditText native view when the text selection changes. */
/* package */ class ReactTextInputSelectionEvent extends Event<ReactTextInputSelectionEvent> {
@@ -20,8 +21,14 @@ import com.facebook.react.uimanager.events.RCTEventEmitter;
private int mSelectionStart;
private int mSelectionEnd;
@Deprecated
public ReactTextInputSelectionEvent(int viewId, int selectionStart, int selectionEnd) {
super(viewId);
this(-1, viewId, selectionStart, selectionEnd);
}
public ReactTextInputSelectionEvent(
int surfaceId, int viewId, int selectionStart, int selectionEnd) {
super(surfaceId, viewId);
mSelectionStart = selectionStart;
mSelectionEnd = selectionEnd;
}
@@ -36,6 +43,12 @@ import com.facebook.react.uimanager.events.RCTEventEmitter;
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
@@ -11,6 +11,7 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.RCTModernEventEmitter;
/** Event emitted by EditText native view when the user submits the text. */
/* package */ class ReactTextInputSubmitEditingEvent
@@ -20,8 +21,13 @@ import com.facebook.react.uimanager.events.RCTEventEmitter;
private String mText;
@Deprecated
public ReactTextInputSubmitEditingEvent(int viewId, String text) {
super(viewId);
this(-1, viewId, text);
}
public ReactTextInputSubmitEditingEvent(int surfaceId, int viewId, String text) {
super(surfaceId, viewId);
mText = text;
}
@@ -40,6 +46,12 @@ import com.facebook.react.uimanager.events.RCTEventEmitter;
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
@Override
public void dispatchV2(RCTModernEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(
getSurfaceId(), getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putInt("target", getViewTag());