diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java index 3c8d923699..a3ce58bf3b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -452,6 +452,23 @@ public class ReactShadowNode { return mTotalNativeChildren; } + public boolean isDescendantOf(ReactShadowNode ancestorNode) { + ReactShadowNode parentNode = getParent(); + + boolean isDescendant = false; + + while (parentNode != null) { + if (parentNode == ancestorNode) { + isDescendant = true; + break; + } else { + parentNode = parentNode.getParent(); + } + } + + return isDescendant; + } + /** * Returns the offset within the native children owned by all layout-only nodes in the subtree * rooted at this node for the given child. Put another way, this returns the number of native 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 ab6e6f2aa9..6fc29266fe 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -469,6 +469,22 @@ public class UIImplementation { mOperationsQueue.enqueueFindTargetForTouch(reactTag, targetX, targetY, callback); } + /** + * Check if the first shadow node is the descendant of the second shadow node + */ + public void viewIsDescendantOf( + final int reactTag, + final int ancestorReactTag, + final Callback callback) { + ReactShadowNode node = mShadowNodeRegistry.getNode(reactTag); + ReactShadowNode ancestorNode = mShadowNodeRegistry.getNode(ancestorReactTag); + if (node == null || ancestorNode == null) { + callback.invoke(false); + return; + } + callback.invoke(node.isDescendantOf(ancestorNode)); + } + /** * Determines the location on screen, width, and height of the given view relative to the root * view and returns the values via an async callback. 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 c9074438f8..e173b0795c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -412,6 +412,17 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements callback); } + /** + * Check if the first shadow node is the descendant of the second shadow node + */ + @ReactMethod + public void viewIsDescendantOf( + final int reactTag, + final int ancestorReactTag, + final Callback callback) { + mUIImplementation.viewIsDescendantOf(reactTag, ancestorReactTag, callback); + } + /** * Registers a new Animation that can then be added to a View using {@link #addAnimation}. */