31
31
import com .facebook .react .uimanager .events .EventDispatcherListener ;
32
32
import java .util .ArrayDeque ;
33
33
import java .util .ArrayList ;
34
- import java .util .HashMap ;
35
34
import java .util .LinkedList ;
36
35
import java .util .List ;
37
36
import java .util .ListIterator ;
38
- import java .util .Map ;
39
37
import java .util .Queue ;
40
38
41
39
/**
@@ -58,9 +56,9 @@ public class NativeAnimatedNodesManager implements EventDispatcherListener {
58
56
private final SparseArray <AnimatedNode > mAnimatedNodes = new SparseArray <>();
59
57
private final SparseArray <AnimationDriver > mActiveAnimations = new SparseArray <>();
60
58
private final SparseArray <AnimatedNode > mUpdatedNodes = new SparseArray <>();
61
- // Mapping of a view tag and an event name to a list of event animation drivers. 99% of the time
62
- // there will be only one driver per mapping so all code code should be optimized around that .
63
- private final Map < String , List <EventAnimationDriver >> mEventDrivers = new HashMap <>();
59
+ // List of event animation drivers for an event on view.
60
+ // There may be multiple drivers for the same event and view .
61
+ private final List <EventAnimationDriver > mEventDrivers = new ArrayList <>();
64
62
private final ReactApplicationContext mReactApplicationContext ;
65
63
private int mAnimatedGraphBFSColor = 0 ;
66
64
// Used to avoid allocating a new array on every frame in `runUpdates` and `onEventDispatch`.
@@ -501,7 +499,8 @@ public void restoreDefaultValues(int animatedNodeTag) {
501
499
}
502
500
503
501
@ UiThread
504
- public void addAnimatedEventToView (int viewTag , String eventName , ReadableMap eventMapping ) {
502
+ public void addAnimatedEventToView (
503
+ int viewTag , String eventHandlerName , ReadableMap eventMapping ) {
505
504
int nodeTag = eventMapping .getInt ("animatedValueTag" );
506
505
AnimatedNode node = mAnimatedNodes .get (nodeTag );
507
506
if (node == null ) {
@@ -512,8 +511,8 @@ public void addAnimatedEventToView(int viewTag, String eventName, ReadableMap ev
512
511
throw new JSApplicationIllegalArgumentException (
513
512
"addAnimatedEventToView: Animated node on view ["
514
513
+ viewTag
515
- + "] connected to event ("
516
- + eventName
514
+ + "] connected to event handler ("
515
+ + eventHandlerName
517
516
+ ") should be of type "
518
517
+ ValueAnimatedNode .class .getName ());
519
518
}
@@ -524,32 +523,27 @@ public void addAnimatedEventToView(int viewTag, String eventName, ReadableMap ev
524
523
pathList .add (path .getString (i ));
525
524
}
526
525
527
- EventAnimationDriver event = new EventAnimationDriver (pathList , (ValueAnimatedNode ) node );
528
- String key = viewTag + eventName ;
529
- if (mEventDrivers .containsKey (key )) {
530
- mEventDrivers .get (key ).add (event );
531
- } else {
532
- List <EventAnimationDriver > drivers = new ArrayList <>(1 );
533
- drivers .add (event );
534
- mEventDrivers .put (key , drivers );
535
- }
526
+ String eventName = normalizeEventName (eventHandlerName );
527
+
528
+ EventAnimationDriver eventDriver =
529
+ new EventAnimationDriver (eventName , viewTag , pathList , (ValueAnimatedNode ) node );
530
+ mEventDrivers .add (eventDriver );
536
531
}
537
532
538
533
@ UiThread
539
- public void removeAnimatedEventFromView (int viewTag , String eventName , int animatedValueTag ) {
540
- String key = viewTag + eventName ;
541
- if (mEventDrivers .containsKey (key )) {
542
- List <EventAnimationDriver > driversForKey = mEventDrivers .get (key );
543
- if (driversForKey .size () == 1 ) {
544
- mEventDrivers .remove (viewTag + eventName );
545
- } else {
546
- ListIterator <EventAnimationDriver > it = driversForKey .listIterator ();
547
- while (it .hasNext ()) {
548
- if (it .next ().mValueNode .mTag == animatedValueTag ) {
549
- it .remove ();
550
- break ;
551
- }
552
- }
534
+ public void removeAnimatedEventFromView (
535
+ int viewTag , String eventHandlerName , int animatedValueTag ) {
536
+
537
+ String eventName = normalizeEventName (eventHandlerName );
538
+
539
+ ListIterator <EventAnimationDriver > it = mEventDrivers .listIterator ();
540
+ while (it .hasNext ()) {
541
+ EventAnimationDriver driver = it .next ();
542
+ if (eventName .equals (driver .mEventName )
543
+ && viewTag == driver .mViewTag
544
+ && animatedValueTag == driver .mValueNode .mTag ) {
545
+ it .remove ();
546
+ break ;
553
547
}
554
548
}
555
549
}
@@ -585,18 +579,19 @@ private void handleEvent(Event event) {
585
579
if (uiManager == null ) {
586
580
return ;
587
581
}
588
- String eventName = uiManager .resolveCustomDirectEventName (event .getEventName ());
589
- if (eventName == null ) {
590
- eventName = "" ;
591
- }
592
582
593
- List <EventAnimationDriver > driversForKey = mEventDrivers .get (event .getViewTag () + eventName );
594
- if (driversForKey != null ) {
595
- for (EventAnimationDriver driver : driversForKey ) {
583
+ boolean foundAtLeastOneDriver = false ;
584
+ Event .EventAnimationDriverMatchSpec matchSpec = event .getEventAnimationDriverMatchSpec ();
585
+ for (EventAnimationDriver driver : mEventDrivers ) {
586
+ if (matchSpec .match (driver .mViewTag , driver .mEventName )) {
587
+ foundAtLeastOneDriver = true ;
596
588
stopAnimationsForNode (driver .mValueNode );
597
589
event .dispatch (driver );
598
590
mRunUpdateNodeList .add (driver .mValueNode );
599
591
}
592
+ }
593
+
594
+ if (foundAtLeastOneDriver ) {
600
595
updateNodes (mRunUpdateNodeList );
601
596
mRunUpdateNodeList .clear ();
602
597
}
@@ -824,4 +819,14 @@ private void updateNodes(List<AnimatedNode> nodes) {
824
819
mWarnedAboutGraphTraversal = false ;
825
820
}
826
821
}
822
+
823
+ private String normalizeEventName (String eventHandlerName ) {
824
+ // Fabric UIManager also makes this assumption
825
+ String eventName = eventHandlerName ;
826
+ if (eventHandlerName .startsWith ("on" )) {
827
+ eventName = "top" + eventHandlerName .substring (2 );
828
+ }
829
+
830
+ return eventName ;
831
+ }
827
832
}
0 commit comments