From cb19cc5dd0bb2219b4ec005f06dbb04278b2a49e Mon Sep 17 00:00:00 2001 From: Ryan Gomba Date: Tue, 1 Nov 2016 17:15:22 -0700 Subject: [PATCH] Proper invalidation on android --- .../animated/NativeAnimatedNodesManager.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) 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 b77a53c7f23b20..64f44d1285a08f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java @@ -49,8 +49,8 @@ /*package*/ class NativeAnimatedNodesManager implements EventDispatcherListener { private final SparseArray mAnimatedNodes = new SparseArray<>(); - private final ArrayList mActiveAnimations = new ArrayList<>(); - private final ArrayList mUpdatedNodes = new ArrayList<>(); + private final SparseArray mActiveAnimations = new SparseArray<>(); + private final SparseArray mUpdatedNodes = new SparseArray<>(); private final Map mEventDrivers = new HashMap<>(); private final Map> mCustomEventTypes; private final UIImplementation mUIImplementation; @@ -68,7 +68,7 @@ public NativeAnimatedNodesManager(UIManagerModule uiManager) { } public boolean hasActiveAnimations() { - return !mActiveAnimations.isEmpty() || !mUpdatedNodes.isEmpty(); + return mActiveAnimations.size() > 0 || mUpdatedNodes.size() > 0; } public void createAnimatedNode(int tag, ReadableMap config) { @@ -82,7 +82,6 @@ public void createAnimatedNode(int tag, ReadableMap config) { node = new StyleAnimatedNode(config, this); } else if ("value".equals(type)) { node = new ValueAnimatedNode(config); - mUpdatedNodes.add(node); } else if ("props".equals(type)) { node = new PropsAnimatedNode(config, this); } else if ("interpolation".equals(type)) { @@ -104,10 +103,12 @@ public void createAnimatedNode(int tag, ReadableMap config) { } node.mTag = tag; mAnimatedNodes.put(tag, node); + mUpdatedNodes.put(tag, node); } public void dropAnimatedNode(int tag) { mAnimatedNodes.remove(tag); + mUpdatedNodes.remove(tag); } public void startListeningToAnimatedNodeValue(int tag, AnimatedNodeValueListener listener) { @@ -135,7 +136,7 @@ public void setAnimatedNodeValue(int tag, double value) { " does not exists or is not a 'value' node"); } ((ValueAnimatedNode) node).mValue = value; - mUpdatedNodes.add(node); + mUpdatedNodes.put(tag, node); } public void setAnimatedNodeOffset(int tag, double offset) { @@ -145,7 +146,7 @@ public void setAnimatedNodeOffset(int tag, double offset) { " does not exists or is not a 'value' node"); } ((ValueAnimatedNode) node).mOffset = offset; - mUpdatedNodes.add(node); + mUpdatedNodes.put(tag, node); } public void flattenAnimatedNodeOffset(int tag) { @@ -194,7 +195,7 @@ public void startAnimatingNode( animation.mId = animationId; animation.mEndCallback = endCallback; animation.mAnimatedValue = (ValueAnimatedNode) node; - mActiveAnimations.add(animation); + mActiveAnimations.put(animationId, animation); } public void stopAnimation(int animationId) { @@ -203,13 +204,13 @@ public void stopAnimation(int animationId) { // object map that would require additional memory just to support the use-case of stopping // an animation for (int i = 0; i < mActiveAnimations.size(); i++) { - AnimationDriver animation = mActiveAnimations.get(i); + AnimationDriver animation = mActiveAnimations.valueAt(i); if (animation.mId == animationId) { // Invoke animation end callback with {finished: false} WritableMap endCallbackResponse = Arguments.createMap(); endCallbackResponse.putBoolean("finished", false); animation.mEndCallback.invoke(endCallbackResponse); - mActiveAnimations.remove(i); + mActiveAnimations.removeAt(i); return; } } @@ -231,6 +232,7 @@ public void connectAnimatedNodes(int parentNodeTag, int childNodeTag) { " does not exists"); } parentNode.addChild(childNode); + mUpdatedNodes.put(childNodeTag, childNode); } public void disconnectAnimatedNodes(int parentNodeTag, int childNodeTag) { @@ -245,6 +247,7 @@ public void disconnectAnimatedNodes(int parentNodeTag, int childNodeTag) { " does not exists"); } parentNode.removeChild(childNode); + mUpdatedNodes.put(childNodeTag, childNode); } public void connectAnimatedNodeToView(int animatedNodeTag, int viewTag) { @@ -263,6 +266,7 @@ public void connectAnimatedNodeToView(int animatedNodeTag, int viewTag) { "already attached to a view"); } propsAnimatedNode.mConnectedViewTag = viewTag; + mUpdatedNodes.put(animatedNodeTag, node); } public void disconnectAnimatedNodeFromView(int animatedNodeTag, int viewTag) { @@ -327,7 +331,7 @@ public boolean onEventDispatch(Event event) { EventAnimationDriver eventDriver = mEventDrivers.get(event.getViewTag() + eventName); if (eventDriver != null) { event.dispatch(eventDriver); - mUpdatedNodes.add(eventDriver.mValueNode); + mUpdatedNodes.put(eventDriver.mValueNode.mTag, eventDriver.mValueNode); return true; } } @@ -368,7 +372,7 @@ public void runUpdates(long frameTimeNanos) { Queue nodesQueue = new ArrayDeque<>(); for (int i = 0; i < mUpdatedNodes.size(); i++) { - AnimatedNode node = mUpdatedNodes.get(i); + AnimatedNode node = mUpdatedNodes.valueAt(i); if (node.mBFSColor != mAnimatedGraphBFSColor) { node.mBFSColor = mAnimatedGraphBFSColor; activeNodesCount++; @@ -377,7 +381,7 @@ public void runUpdates(long frameTimeNanos) { } for (int i = 0; i < mActiveAnimations.size(); i++) { - AnimationDriver animation = mActiveAnimations.get(i); + AnimationDriver animation = mActiveAnimations.valueAt(i); animation.runAnimationStep(frameTimeNanos); AnimatedNode valueNode = animation.mAnimatedValue; if (valueNode.mBFSColor != mAnimatedGraphBFSColor) { @@ -422,7 +426,7 @@ public void runUpdates(long frameTimeNanos) { // find nodes with zero "incoming nodes", those can be either nodes from `mUpdatedNodes` or // ones connected to active animations for (int i = 0; i < mUpdatedNodes.size(); i++) { - AnimatedNode node = mUpdatedNodes.get(i); + AnimatedNode node = mUpdatedNodes.valueAt(i); if (node.mActiveIncomingNodes == 0 && node.mBFSColor != mAnimatedGraphBFSColor) { node.mBFSColor = mAnimatedGraphBFSColor; updatedNodesCount++; @@ -430,7 +434,7 @@ public void runUpdates(long frameTimeNanos) { } } for (int i = 0; i < mActiveAnimations.size(); i++) { - AnimationDriver animation = mActiveAnimations.get(i); + AnimationDriver animation = mActiveAnimations.valueAt(i); AnimatedNode valueNode = animation.mAnimatedValue; if (valueNode.mActiveIncomingNodes == 0 && valueNode.mBFSColor != mAnimatedGraphBFSColor) { valueNode.mBFSColor = mAnimatedGraphBFSColor; @@ -480,19 +484,15 @@ public void runUpdates(long frameTimeNanos) { // finished, then resize `mActiveAnimations`. if (hasFinishedAnimations) { int dest = 0; - for (int i = 0; i < mActiveAnimations.size(); i++) { - AnimationDriver animation = mActiveAnimations.get(i); - if (!animation.mHasFinished) { - mActiveAnimations.set(dest++, animation); - } else { + for (int i = mActiveAnimations.size() - 1; i >= 0; i--) { + AnimationDriver animation = mActiveAnimations.valueAt(i); + if (animation.mHasFinished) { WritableMap endCallbackResponse = Arguments.createMap(); endCallbackResponse.putBoolean("finished", true); animation.mEndCallback.invoke(endCallbackResponse); + mActiveAnimations.removeAt(i); } } - for (int i = mActiveAnimations.size() - 1; i >= dest; i--) { - mActiveAnimations.remove(i); - } } } }