@@ -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