From 833954a669a980ad574b69d8d4aa4c07627171c5 Mon Sep 17 00:00:00 2001 From: "Andrew Chen (Eng)" Date: Tue, 21 Aug 2018 09:28:13 -0700 Subject: [PATCH] Append LayoutUpdateListener to UIViewOperationQueue Summary: There are multiple UI thread passes during the layout process. The first is with all of the operations from React (createView, manageChildren, etc). The second is during onCollectExtraUpdates after the layout pass, when things like Text need to be precomputed before later being sent over to the views. The onLayoutUpdateListener needs to run AFTER onCollectExtraUpdates operations are executed, so this is now queued up in the UIViewOperationQueue Reviewed By: mdvacca Differential Revision: D9416260 fbshipit-source-id: d1a4eaf38a4f6c82d41def34ffb94d303e8f50d4 --- .../react/uimanager/UIImplementation.java | 2 +- .../react/uimanager/UIViewOperationQueue.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index 2baee93cee9..e2471867049 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -709,7 +709,7 @@ public class UIImplementation { } if (mLayoutUpdateListener != null) { - mLayoutUpdateListener.onLayoutUpdated(cssRoot); + mOperationsQueue.enqueueLayoutUpdateFinished(cssRoot, mLayoutUpdateListener); } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java index 783110b96af..772286cd6c3 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java @@ -556,6 +556,22 @@ public class UIViewOperationQueue { } } + private final class LayoutUpdateFinishedOperation implements UIOperation { + + private final ReactShadowNode mNode; + private final UIImplementation.LayoutUpdateListener mListener; + + private LayoutUpdateFinishedOperation(ReactShadowNode node, UIImplementation.LayoutUpdateListener listener) { + mNode = node; + mListener = listener; + } + + @Override + public void execute() { + mListener.onLayoutUpdated(mNode); + } + } + private class UIBlockOperation implements UIOperation { private final UIBlock mBlock; public UIBlockOperation (UIBlock block) { @@ -829,6 +845,10 @@ public class UIViewOperationQueue { mOperations.add(new SendAccessibilityEvent(tag, eventType)); } + public void enqueueLayoutUpdateFinished(ReactShadowNode node, UIImplementation.LayoutUpdateListener listener) { + mOperations.add(new LayoutUpdateFinishedOperation(node, listener)); + } + public void enqueueUIBlock(UIBlock block) { mOperations.add(new UIBlockOperation(block)); }