From 7bf56e1902aed2ac2d2bab39773294cf57a425c6 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Fri, 10 Jul 2020 23:32:37 -0700 Subject: [PATCH] NativeAnimatedModule: don't restore default values when disconnected nodes in Fabric Summary: See title. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D22488069 fbshipit-source-id: a0cb2dc65e5ea4befd7921acd194a67840b1498d --- .../react/animated/PropsAnimatedNode.java | 10 ++++++++++ .../animated/NativeAnimatedNodeTraversalTest.java | 15 ++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java b/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java index 42cb57a7ec3..e8f77e0dbaf 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.java @@ -13,6 +13,8 @@ import com.facebook.react.bridge.JavaOnlyMap; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableMapKeySetIterator; import com.facebook.react.bridge.UIManager; +import com.facebook.react.uimanager.common.UIManagerType; +import com.facebook.react.uimanager.common.ViewUtil; import java.util.HashMap; import java.util.Map; @@ -69,6 +71,14 @@ import java.util.Map; if (mConnectedViewTag == -1) { return; } + // Don't restore default values in Fabric. + // In Non-Fabric this had the effect of "restore the value to whatever the value was on the + // ShadowNode instead of in the View hierarchy". However, "synchronouslyUpdateViewOnUIThread" + // will not have that impact on Fabric, because the FabricUIManager doesn't have access to the + // ShadowNode layer. + if (ViewUtil.getUIManagerType(mConnectedViewTag) == UIManagerType.FABRIC) { + return; + } ReadableMapKeySetIterator it = mPropMap.keySetIterator(); while (it.hasNextKey()) { diff --git a/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java b/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java index 30a9a3bc41e..fc08cc8177b 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java @@ -183,6 +183,15 @@ public class NativeAnimatedNodeTraversalTest { }; } }); + PowerMockito.when(mUIManagerMock.resolveCustomDirectEventName(any(String.class))) + .thenAnswer( + new Answer() { + @Override + public String answer(InvocationOnMock invocation) throws Throwable { + String arg = invocation.getArguments()[0].toString(); + return "on" + arg.substring(3); + } + }); mNativeAnimatedNodesManager = new NativeAnimatedNodesManager(mReactApplicationContextMock); } @@ -946,7 +955,7 @@ public class NativeAnimatedNodeTraversalTest { mNativeAnimatedNodesManager.addAnimatedEventToView( viewTag, - "topScroll", + "onScroll", JavaOnlyMap.of( "animatedValueTag", 1, "nativeEventPath", JavaOnlyArray.of("contentOffset", "y"))); @@ -999,7 +1008,7 @@ public class NativeAnimatedNodeTraversalTest { public Object answer(InvocationOnMock invocation) throws Throwable { return MapBuilder.of( "customDirectEventTypes", - MapBuilder.of("topScroll", MapBuilder.of("registrationName", "onScroll"))); + MapBuilder.of("onScroll", MapBuilder.of("registrationName", "onScroll"))); } }); mNativeAnimatedNodesManager = new NativeAnimatedNodesManager(mReactApplicationContextMock); @@ -1024,7 +1033,7 @@ public class NativeAnimatedNodeTraversalTest { @Test public void testRestoreDefaultProps() { - int viewTag = 1000; + int viewTag = 1001; // restoreDefaultProps not called in Fabric, make sure it's a non-Fabric tag int propsNodeTag = 3; mNativeAnimatedNodesManager.createAnimatedNode( 1, JavaOnlyMap.of("type", "value", "value", 1d, "offset", 0d));