diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java index 00b00d89c..fcb56f777 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java @@ -83,7 +83,7 @@ public class NativeViewHierarchyManager { mRootTags = new SparseBooleanArray(); } - protected final View resolveView(int tag) { + public final View resolveView(int tag) { View view = mTagsToViews.get(tag); if (view == null) { throw new IllegalViewOperationException("Trying to resolve view with tag " + tag @@ -92,7 +92,7 @@ public class NativeViewHierarchyManager { return view; } - protected final ViewManager resolveViewManager(int tag) { + public final ViewManager resolveViewManager(int tag) { ViewManager viewManager = mTagsToViewManagers.get(tag); if (viewManager == null) { throw new IllegalViewOperationException("ViewManager for tag " + tag + " could not be found"); diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIBlock.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIBlock.java new file mode 100644 index 000000000..86678d897 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIBlock.java @@ -0,0 +1,10 @@ +package com.facebook.react.uimanager; + +import android.view.View; + +/** + * A task to execute on the UI View for third party libraries. + */ +public interface UIBlock { + public void execute(NativeViewHierarchyManager nativeViewHierarchyManager); +} 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 20df2a161..3aa56e2f2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -774,4 +774,8 @@ public class UIImplementation { } cssNode.markUpdateSeen(); } + + public void addUIBlock(UIBlock block) { + mOperationsQueue.enqueueUIBlock(block); + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index 2503b285d..abfed9d68 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -473,4 +473,24 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements public void sendAccessibilityEvent(int tag, int eventType) { mUIImplementation.sendAccessibilityEvent(tag, eventType); } + + /** + * Schedule a block to be executed on the UI thread. Useful if you need to execute + * view logic after all currently queued view updates have completed. + * + * @param block that contains UI logic you want to execute. + * + * Usage Example: + + UIManagerModule uiManager = reactContext.getNativeModule(UIManagerModule.class); + uiManager.addUIBlock(new UIBlock() { + public void execute (NativeViewHierarchyManager nvhm) { + View view = nvhm.resolveView(tag); + // ...execute your code on View (e.g. snapshot the view) + } + }); + */ + public void addUIBlock (UIBlock block) { + mUIImplementation.addUIBlock(block); + } } 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 b10c2e6ce..4123c8a5a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java @@ -494,6 +494,18 @@ public class UIViewOperationQueue { } } + private class UIBlockOperation implements UIOperation { + private final UIBlock mBlock; + public UIBlockOperation (UIBlock block) { + mBlock = block; + } + + @Override + public void execute() { + mBlock.execute(mNativeViewHierarchyManager); + } + } + private final class SendAccessibilityEvent extends ViewOperation { private final int mEventType; @@ -721,6 +733,10 @@ public class UIViewOperationQueue { mOperations.add(new SendAccessibilityEvent(tag, eventType)); } + public void enqueueUIBlock(UIBlock block) { + mOperations.add(new UIBlockOperation(block)); + } + /* package */ void dispatchViewUpdates(final int batchId) { // Store the current operation queues to dispatch and create new empty ones to continue // receiving new operations