diff --git a/Libraries/Animated/src/AnimatedImplementation.js b/Libraries/Animated/src/AnimatedImplementation.js index 51ba4c3d714..5cb8743faee 100644 --- a/Libraries/Animated/src/AnimatedImplementation.js +++ b/Libraries/Animated/src/AnimatedImplementation.js @@ -2187,13 +2187,7 @@ function attachNativeEvent(viewRef: any, eventName: string, argMapping: Array { - NativeAnimatedAPI.removeAnimatedEventFromView( - viewTag, - eventName, - mapping.animatedValueTag, - ); - }); + NativeAnimatedAPI.removeAnimatedEventFromView(viewTag, eventName); }, }; } diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedModule.m b/Libraries/NativeAnimation/RCTNativeAnimatedModule.m index e64e65d48d3..55763bfe57d 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedModule.m +++ b/Libraries/NativeAnimation/RCTNativeAnimatedModule.m @@ -169,10 +169,9 @@ RCT_EXPORT_METHOD(addAnimatedEventToView:(nonnull NSNumber *)viewTag RCT_EXPORT_METHOD(removeAnimatedEventFromView:(nonnull NSNumber *)viewTag eventName:(nonnull NSString *)eventName) - animatedNodeTag:(nonnull NSNumber *)animatedNodeTag { [_operations addObject:^(RCTNativeAnimatedNodesManager *nodesManager) { - [nodesManager removeAnimatedEventFromView:viewTag eventName:eventName animatedNodeTag:animatedNodeTag]; + [nodesManager removeAnimatedEventFromView:viewTag eventName:eventName]; }]; } diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h index a3fb930550c..e911f1b37c2 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h +++ b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h @@ -70,8 +70,7 @@ eventMapping:(NSDictionary *__nonnull)eventMapping; - (void)removeAnimatedEventFromView:(nonnull NSNumber *)viewTag - eventName:(nonnull NSString *)eventName - animatedNodeTag:(nonnull NSNumber *)animatedNodeTag; + eventName:(nonnull NSString *)eventName; - (void)handleAnimatedEvent:(nonnull id)event; diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m index a4be771787e..ac15ad705dd 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m +++ b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m @@ -33,9 +33,7 @@ { RCTUIManager *_uiManager; NSMutableDictionary *_animationNodes; - // Mapping of a view tag and an event name to a list of event animation drivers. 99% of the time - // there will be only one driver per mapping so all code code should be optimized around that. - NSMutableDictionary *> *_eventDrivers; + NSMutableDictionary *_eventDrivers; NSMutableSet> *_activeAnimations; CADisplayLink *_displayLink; } @@ -266,36 +264,15 @@ NSArray *eventPath = [RCTConvert NSStringArray:eventMapping[@"nativeEventPath"]]; RCTEventAnimation *driver = - [[RCTEventAnimation alloc] initWithEventPath:eventPath valueNode:(RCTValueAnimatedNode *)node]; + [[RCTEventAnimation alloc] initWithEventPath:eventPath valueNode:(RCTValueAnimatedNode *)node]; - NSString *key = [NSString stringWithFormat:@"%@%@", viewTag, eventName]; - if (_eventDrivers[key] != nil) { - [_eventDrivers[key] addObject:driver]; - } else { - NSMutableArray *drivers = [NSMutableArray new]; - [drivers addObject:driver]; - _eventDrivers[key] = drivers; - } + _eventDrivers[[NSString stringWithFormat:@"%@%@", viewTag, eventName]] = driver; } - (void)removeAnimatedEventFromView:(nonnull NSNumber *)viewTag eventName:(nonnull NSString *)eventName - animatedNodeTag:(nonnull NSNumber *)animatedNodeTag { - NSString *key = [NSString stringWithFormat:@"%@%@", viewTag, eventName]; - if (_eventDrivers[key] != nil) { - if (_eventDrivers[key].count == 1) { - [_eventDrivers removeObjectForKey:key]; - } else { - NSMutableArray *driversForKey = _eventDrivers[key]; - for (NSUInteger i = 0; i < driversForKey.count; i++) { - if (driversForKey[i].valueNode.nodeTag == animatedNodeTag) { - [driversForKey removeObjectAtIndex:i]; - break; - } - } - } - } + [_eventDrivers removeObjectForKey:[NSString stringWithFormat:@"%@%@", viewTag, eventName]]; } - (void)handleAnimatedEvent:(id)event @@ -305,12 +282,9 @@ } NSString *key = [NSString stringWithFormat:@"%@%@", event.viewTag, event.eventName]; - NSMutableArray *driversForKey = _eventDrivers[key]; - if (driversForKey) { - for (RCTEventAnimation *driver in driversForKey) { - [driver updateWithEvent:event]; - } - + RCTEventAnimation *driver = _eventDrivers[key]; + if (driver) { + [driver updateWithEvent:event]; [self updateAnimations]; } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java index a3551bd1082..c5e2aa04f1e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java @@ -351,11 +351,11 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule implements } @ReactMethod - public void removeAnimatedEventFromView(final int viewTag, final String eventName, final int animatedValueTag) { + public void removeAnimatedEventFromView(final int viewTag, final String eventName) { mOperations.add(new UIThreadOperation() { @Override public void execute(NativeAnimatedNodesManager animatedNodesManager) { - animatedNodesManager.removeAnimatedEventFromView(viewTag, eventName, animatedValueTag); + animatedNodesManager.removeAnimatedEventFromView(viewTag, eventName); } }); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java index 6251b8f4dd5..12c7f640b95 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java @@ -31,9 +31,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Queue; @@ -57,14 +55,12 @@ import javax.annotation.Nullable; private final SparseArray mAnimatedNodes = new SparseArray<>(); private final SparseArray mActiveAnimations = new SparseArray<>(); private final SparseArray mUpdatedNodes = new SparseArray<>(); - // Mapping of a view tag and an event name to a list of event animation drivers. 99% of the time - // there will be only one driver per mapping so all code code should be optimized around that. - private final Map> mEventDrivers = new HashMap<>(); + private final Map mEventDrivers = new HashMap<>(); private final Map> mCustomEventTypes; private final UIImplementation mUIImplementation; private int mAnimatedGraphBFSColor = 0; - // Used to avoid allocating a new array on every frame in `runUpdates` and `onEventDispatch`. - private final List mRunUpdateNodeList = new LinkedList<>(); + // Used to avoid allocating a new array on every frame in runUpdates. + private final List mRunUpdateNodeList = new ArrayList<>(); public NativeAnimatedNodesManager(UIManagerModule uiManager) { mUIImplementation = uiManager.getUIImplementation(); @@ -316,32 +312,11 @@ import javax.annotation.Nullable; } EventAnimationDriver event = new EventAnimationDriver(pathList, (ValueAnimatedNode) node); - String key = viewTag + eventName; - if (mEventDrivers.containsKey(key)) { - mEventDrivers.get(key).add(event); - } else { - List drivers = new ArrayList<>(1); - drivers.add(event); - mEventDrivers.put(key, drivers); - } + mEventDrivers.put(viewTag + eventName, event); } - public void removeAnimatedEventFromView(int viewTag, String eventName, int animatedValueTag) { - String key = viewTag + eventName; - if (mEventDrivers.containsKey(key)) { - List driversForKey = mEventDrivers.get(key); - if (driversForKey.size() == 1) { - mEventDrivers.remove(viewTag + eventName); - } else { - ListIterator it = driversForKey.listIterator(); - while (it.hasNext()) { - if (it.next().mValueNode.mTag == animatedValueTag) { - it.remove(); - break; - } - } - } - } + public void removeAnimatedEventFromView(int viewTag, String eventName) { + mEventDrivers.remove(viewTag + eventName); } @Override @@ -359,14 +334,11 @@ import javax.annotation.Nullable; eventName = customEventType.get("registrationName"); } - List driversForKey = mEventDrivers.get(event.getViewTag() + eventName); - if (driversForKey != null) { - for (EventAnimationDriver driver : driversForKey) { - event.dispatch(driver); - mRunUpdateNodeList.add(driver.mValueNode); - } - updateNodes(mRunUpdateNodeList); - mRunUpdateNodeList.clear(); + EventAnimationDriver eventDriver = mEventDrivers.get(event.getViewTag() + eventName); + if (eventDriver != null) { + event.dispatch(eventDriver); + + updateNodes(Collections.singletonList((AnimatedNode) eventDriver.mValueNode)); } } }