Add viewIsDescendantOf for UIManager on Android

Summary:
Add the ability for UIManager to check if a node is an ancestor of anther one on Android like #7876 did on iOS
Closes https://github.com/facebook/react-native/pull/13129

Differential Revision: D4938319

Pulled By: hramos

fbshipit-source-id: abe20779be2142a1ea9ac46f52d8cd8609236419
This commit is contained in:
Swordsman-Inaction 2017-05-23 10:54:39 -07:00 committed by Facebook Github Bot
parent 2d1c721fd6
commit 663df57c62
3 changed files with 44 additions and 0 deletions

View File

@ -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

View File

@ -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.

View File

@ -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}.
*/