Skip to content

Commit 4167c4f

Browse files
Luna Weifacebook-github-bot
authored andcommitted
Support legacy event emitter
Summary: Changelog: [Internal] - Add support for legacy event emitter for PointerEvents because it's used by natively driven Animated events It works by * [NativeAnimatedNodesManager being a listener on every event dispatched](https://www.internalfb.com/code/fbsource/[b8fc8603f8d84003bcb73ec84e8490c136df290c]/xplat/js/react-native-github/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/EventDispatcherImpl.java?lines=115-117) * NativeAnimatedNodesManager [re-dispatching the event onto an EventAnimationDriver to update the animated value.](https://www.internalfb.com/code/fbsource/[d5403bc1fa55a68d9346ac693378551b734c565b]/xplat/js/react-native-github/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java?lines=597) As such, we need to make sure to implement the legacy event dispatch function. Reviewed By: vincentriemer Differential Revision: D37769785 fbshipit-source-id: c570896afc624193fdb636a302e9613ca6fee14d
1 parent 4f522be commit 4167c4f

File tree

1 file changed

+49
-20
lines changed

1 file changed

+49
-20
lines changed

ReactAndroid/src/main/java/com/facebook/react/uimanager/events/PointerEvent.java

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public static PointerEvent obtain(
7272
private int mCoalescingKey = UNSET_COALESCING_KEY;
7373
private float mOffsetX;
7474
private float mOffsetY;
75+
private @Nullable List<WritableMap> mPointersEventData;
7576

7677
private void init(
7778
String eventName,
@@ -98,12 +99,33 @@ public String getEventName() {
9899

99100
@Override
100101
public void dispatch(RCTEventEmitter rctEventEmitter) {
101-
// Skip legacy stuff for now?
102+
if (mMotionEvent == null) {
103+
ReactSoftExceptionLogger.logSoftException(
104+
TAG,
105+
new IllegalStateException(
106+
"Cannot dispatch a Pointer that has no MotionEvent; the PointerEvehas been recycled"));
107+
return;
108+
}
109+
if (mPointersEventData == null) {
110+
mPointersEventData = createPointersEventData();
111+
}
112+
113+
if (mPointersEventData == null) {
114+
// No relevant MotionEvent to dispatch
115+
return;
116+
}
117+
118+
boolean shouldCopy = mPointersEventData.size() > 1;
119+
for (WritableMap pointerEventData : mPointersEventData) {
120+
WritableMap eventData = shouldCopy ? pointerEventData.copy() : pointerEventData;
121+
rctEventEmitter.receiveEvent(this.getViewTag(), mEventName, eventData);
122+
}
102123
return;
103124
}
104125

105126
@Override
106127
public void onDispose() {
128+
mPointersEventData = null;
107129
MotionEvent motionEvent = mMotionEvent;
108130
mMotionEvent = null;
109131
if (motionEvent != null) {
@@ -130,13 +152,13 @@ private ArrayList<WritableMap> createPointerEvents() {
130152
ArrayList<WritableMap> pointerEvents = new ArrayList<>();
131153

132154
for (int index = 0; index < motionEvent.getPointerCount(); index++) {
133-
pointerEvents.add(this.createPointerEvent(index));
155+
pointerEvents.add(this.createPointerEventData(index));
134156
}
135157

136158
return pointerEvents;
137159
}
138160

139-
private WritableMap createPointerEvent(int index) {
161+
private WritableMap createPointerEventData(int index) {
140162
WritableMap pointerEvent = Arguments.createMap();
141163

142164
pointerEvent.putDouble("pointerId", mMotionEvent.getPointerId(index));
@@ -158,41 +180,48 @@ private WritableMap createPointerEvent(int index) {
158180
return pointerEvent;
159181
}
160182

161-
@Override
162-
public void dispatchModern(RCTModernEventEmitter rctEventEmitter) {
163-
if (mMotionEvent == null) {
164-
ReactSoftExceptionLogger.logSoftException(
165-
TAG,
166-
new IllegalStateException(
167-
"Cannot dispatch a Pointer that has no MotionEvent; the PointerEvehas been recycled"));
168-
return;
169-
}
170-
171-
List<WritableMap> relevantPointerEventData = null;
172-
183+
private List<WritableMap> createPointersEventData() {
173184
int activePointerIndex = mMotionEvent.getActionIndex();
185+
List<WritableMap> pointersEventData = null;
174186
switch (mEventName) {
175187
// Cases where all pointer info is relevant
176188
case PointerEventHelper.POINTER_MOVE:
177189
case PointerEventHelper.POINTER_CANCEL:
178-
relevantPointerEventData = createPointerEvents();
190+
pointersEventData = createPointerEvents();
179191
break;
180192
// Cases where only the "active" pointer info is relevant
181193
case PointerEventHelper.POINTER_ENTER:
182194
case PointerEventHelper.POINTER_DOWN:
183195
case PointerEventHelper.POINTER_UP:
184196
case PointerEventHelper.POINTER_LEAVE:
185-
relevantPointerEventData = Arrays.asList(createPointerEvent(activePointerIndex));
197+
pointersEventData = Arrays.asList(createPointerEventData(activePointerIndex));
186198
break;
187199
}
188200

189-
if (relevantPointerEventData == null) {
201+
return pointersEventData;
202+
}
203+
204+
@Override
205+
public void dispatchModern(RCTModernEventEmitter rctEventEmitter) {
206+
if (mMotionEvent == null) {
207+
ReactSoftExceptionLogger.logSoftException(
208+
TAG,
209+
new IllegalStateException(
210+
"Cannot dispatch a Pointer that has no MotionEvent; the PointerEvehas been recycled"));
211+
return;
212+
}
213+
214+
if (mPointersEventData == null) {
215+
mPointersEventData = createPointersEventData();
216+
}
217+
218+
if (mPointersEventData == null) {
190219
// No relevant MotionEvent to dispatch
191220
return;
192221
}
193222

194-
boolean shouldCopy = relevantPointerEventData.size() > 1;
195-
for (WritableMap pointerEventData : relevantPointerEventData) {
223+
boolean shouldCopy = mPointersEventData.size() > 1;
224+
for (WritableMap pointerEventData : mPointersEventData) {
196225
WritableMap eventData = shouldCopy ? pointerEventData.copy() : pointerEventData;
197226
rctEventEmitter.receiveEvent(
198227
this.getSurfaceId(),

0 commit comments

Comments
 (0)