From c0d27de37eec7b6860387e35dae4dfc455d4b6e2 Mon Sep 17 00:00:00 2001 From: "Andrew Chen (Eng)" Date: Wed, 21 Mar 2018 14:21:37 -0700 Subject: [PATCH] Fix removal of virtual nodes in FabricReconciler Reviewed By: mdvacca Differential Revision: D7338949 fbshipit-source-id: 31263c138689f9b3f59deb26851132df04b8a823 --- .../react/fabric/FabricReconciler.java | 19 +++++++++---------- .../facebook/react/uimanager/ViewAtIndex.java | 11 ++++++++++- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricReconciler.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricReconciler.java index eba24f2754..cc851c228f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricReconciler.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricReconciler.java @@ -89,12 +89,11 @@ public class FabricReconciler { // If a View is not re-ordered, then the ReactTag is deleted (ReactShadowNode and native View // are released from memory) List tagsToDelete = new LinkedList<>(); - int[] indicesToRemove = new int[prevList.size() - firstRemovedOrAddedViewIndex]; - int indicesToRemoveIndex = 0; - for (int j = firstRemovedOrAddedViewIndex; j < prevList.size(); j++) { + List indicesToRemove = new LinkedList<>(); + for (int j = prevList.size() - 1; j >= firstRemovedOrAddedViewIndex; j--) { ReactShadowNode nodeToRemove = prevList.get(j); if (nodeToRemove.isVirtual()) continue; - indicesToRemove[indicesToRemoveIndex++] = j; + indicesToRemove.add(0, j); if (!addedTags.contains(nodeToRemove.getReactTag())) { tagsToDelete.add(nodeToRemove.getReactTag()); // TODO: T26729293 since we are not cloning ReactShadowNode's we need to "manually" remove @@ -103,21 +102,21 @@ public class FabricReconciler { } } - int[] tagsToDeleteArray = ArrayUtils.copyListToArray(tagsToDelete); - ViewAtIndex[] viewsToAddArray = viewsToAdd.toArray(new ViewAtIndex[viewsToAdd.size()]); - // TODO (t27180994): Mutate views synchronously on main thread - if (indicesToRemove.length > 0 || viewsToAddArray.length > 0 || tagsToDeleteArray.length > 0) { + if (!(indicesToRemove.isEmpty() && viewsToAdd.isEmpty() && tagsToDelete.isEmpty())) { + int[] indicesToRemoveArray = ArrayUtils.copyListToArray(indicesToRemove); + ViewAtIndex[] viewsToAddArray = viewsToAdd.toArray(new ViewAtIndex[viewsToAdd.size()]); + int[] tagsToDeleteArray = ArrayUtils.copyListToArray(tagsToDelete); if (DEBUG) { Log.d( TAG, "manageChildren.enqueueManageChildren parent: " + parent.getReactTag() + - "\n\tIndices2Remove: " + Arrays.toString(indicesToRemove) + + "\n\tIndices2Remove: " + Arrays.toString(indicesToRemoveArray) + "\n\tViews2Add: " + Arrays.toString(viewsToAddArray) + "\n\tTags2Delete: " + Arrays.toString(tagsToDeleteArray)); } uiViewOperationQueue.enqueueManageChildren( - parent.getReactTag(), indicesToRemove, viewsToAddArray, tagsToDeleteArray); + parent.getReactTag(), indicesToRemoveArray, viewsToAddArray, tagsToDeleteArray); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java index ef2a914d3c..c242d7c310 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java @@ -29,8 +29,17 @@ public class ViewAtIndex { mIndex = index; } + @Override + public boolean equals(Object obj) { + if (obj == null || obj.getClass() != getClass()) { + return false; + } + ViewAtIndex other = (ViewAtIndex) obj; + return mIndex == other.mIndex && mTag == other.mTag; + } + @Override public String toString() { - return "[" + mIndex + ", " + mTag + "]"; + return "[" + mTag + ", " + mIndex + "]"; } }