react-native-reanimated 2.3.3 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Common/cpp/AnimatedSensor/AnimatedSensorModule.cpp +72 -0
- package/Common/cpp/NativeModules/NativeReanimatedModule.cpp +30 -1
- package/Common/cpp/NativeModules/NativeReanimatedModuleSpec.cpp +64 -39
- package/Common/cpp/Tools/RuntimeDecorator.cpp +2 -0
- package/Common/cpp/headers/AnimatedSensor/AnimatedSensorModule.h +41 -0
- package/Common/cpp/headers/NativeModules/NativeReanimatedModule.h +14 -0
- package/Common/cpp/headers/NativeModules/NativeReanimatedModuleSpec.h +14 -0
- package/Common/cpp/headers/SharedItems/MutableValue.h +4 -1
- package/Common/cpp/headers/SharedItems/ShareableValue.h +3 -0
- package/Common/cpp/headers/SharedItems/ValueWrapper.h +3 -0
- package/Common/cpp/headers/Tools/PlatformDepMethodsHolder.h +11 -0
- package/Common/cpp/headers/Tools/RuntimeDecorator.h +2 -0
- package/LICENSE +1 -1
- package/README.md +2 -2
- package/android/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/7.2/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/7.2/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/7.2/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/7.2/fileChanges/last-build.bin +0 -0
- package/android/.gradle/7.2/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/7.2/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/7.2/fileHashes/resourceHashesCache.bin +0 -0
- package/android/.gradle/7.2/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/checksums/checksums.lock +0 -0
- package/android/.gradle/checksums/md5-checksums.bin +0 -0
- package/android/.gradle/checksums/sha1-checksums.bin +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/CMakeLists.txt +198 -0
- package/android/README.md +15 -0
- package/android/build.gradle +686 -73
- package/android/empty.cpp +1 -0
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/android/gradle.properties +25 -0
- package/android/gradlew +234 -0
- package/android/gradlew.bat +89 -0
- package/android/react-native-reanimated-64-hermes.aar +0 -0
- package/android/react-native-reanimated-64-jsc.aar +0 -0
- package/android/react-native-reanimated-65-hermes.aar +0 -0
- package/android/react-native-reanimated-65-jsc.aar +0 -0
- package/android/react-native-reanimated-66-hermes.aar +0 -0
- package/android/react-native-reanimated-66-jsc.aar +0 -0
- package/android/react-native-reanimated-67-hermes.aar +0 -0
- package/android/react-native-reanimated-67-jsc.aar +0 -0
- package/android/react-native-reanimated-68-hermes.aar +0 -0
- package/android/react-native-reanimated-68-jsc.aar +0 -0
- package/android/rnVersionPatch/62/layoutReanimation/ReanimatedNativeHierarchyManager.java +412 -0
- package/android/rnVersionPatch/62/layoutReanimation/ReanimatedUIImplementation.java +68 -0
- package/android/rnVersionPatch/63/layoutReanimation/ReanimatedUIImplementation.java +68 -0
- package/android/rnVersionPatch/64/layoutReanimation/ReanimatedUIImplementation.java +68 -0
- package/android/rnVersionPatch/65/.gitkeep +0 -0
- package/android/rnVersionPatch/66/.gitkeep +0 -0
- package/android/rnVersionPatch/67/.gitkeep +0 -0
- package/android/rnVersionPatch/68/.gitkeep +0 -0
- package/android/rnVersionPatch/backup/.gitkeep +0 -0
- package/android/settings.gradle +1 -0
- package/android/spotless.gradle +9 -0
- package/android/src/{AndroidManifest.xml → main/AndroidManifest.xml} +0 -0
- package/android/src/main/cpp/AndroidErrorHandler.cpp +42 -0
- package/android/src/main/cpp/AndroidLogger.cpp +27 -0
- package/android/src/main/cpp/AndroidScheduler.cpp +59 -0
- package/android/src/main/cpp/JNIHelper.cpp +59 -0
- package/android/src/main/cpp/LayoutAnimations.cpp +103 -0
- package/android/src/main/cpp/NativeProxy.cpp +327 -0
- package/android/src/main/cpp/OnLoad.cpp +17 -0
- package/android/src/main/cpp/TurboModule.cpp +44 -0
- package/android/src/main/cpp/headers/AndroidErrorHandler.h +30 -0
- package/android/src/main/cpp/headers/AndroidLogger.h +16 -0
- package/android/src/main/cpp/headers/AndroidScheduler.h +41 -0
- package/android/src/main/cpp/headers/JNIHelper.h +30 -0
- package/android/src/main/cpp/headers/LayoutAnimations.h +42 -0
- package/android/src/main/cpp/headers/NativeProxy.h +170 -0
- package/android/src/main/cpp/headers/TurboModule.h +70 -0
- package/android/src/main/java/com/facebook/react/uimanager/UIManagerReanimatedHelper.java +15 -0
- package/android/src/main/java/com/swmansion/common/GestureHandlerStateManager.java +5 -0
- package/android/src/main/java/com/swmansion/reanimated/AndroidErrorHandler.java +8 -0
- package/android/src/main/java/com/swmansion/reanimated/CopiedEvent.java +43 -0
- package/android/src/main/java/com/swmansion/reanimated/MapUtils.java +26 -0
- package/android/src/main/java/com/swmansion/reanimated/NativeMethodsHelper.java +117 -0
- package/android/src/main/java/com/swmansion/reanimated/NativeProxy.java +285 -0
- package/android/src/main/java/com/swmansion/reanimated/NodesManager.java +682 -0
- package/android/src/main/java/com/swmansion/reanimated/ReanimatedJSIModulePackage.java +29 -0
- package/android/src/main/java/com/swmansion/reanimated/ReanimatedModule.java +251 -0
- package/android/src/main/java/com/swmansion/reanimated/ReanimatedPackage.java +96 -0
- package/android/src/main/java/com/swmansion/reanimated/Scheduler.java +51 -0
- package/android/src/main/java/com/swmansion/reanimated/UpdateContext.java +11 -0
- package/android/src/main/java/com/swmansion/reanimated/Utils.java +32 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/AnimationsManager.java +517 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/LayoutAnimations.java +56 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/NativeMethodsHolder.java +11 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ReanimatedNativeHierarchyManager.java +410 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ReanimatedUIImplementation.java +68 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ReanimatedUIManager.java +292 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/Snapshot.java +121 -0
- package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ViewHierarchyObserver.java +12 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/AlwaysNode.java +29 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/BezierNode.java +87 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/BlockNode.java +24 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/CallFuncNode.java +49 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/ClockNode.java +38 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/ClockOpNode.java +73 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/ConcatNode.java +36 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/CondNode.java +41 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/DebugNode.java +33 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/EventNode.java +83 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/FinalNode.java +5 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/FunctionNode.java +20 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/JSCallNode.java +41 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/Node.java +139 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/NoopNode.java +37 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/OperatorNode.java +377 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/ParamNode.java +71 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/PropsNode.java +153 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/SetNode.java +32 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/StyleNode.java +40 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/TransformNode.java +84 -0
- package/android/src/main/java/com/swmansion/reanimated/nodes/ValueNode.java +40 -0
- package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensor.java +41 -0
- package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensorContainer.java +40 -0
- package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensorListener.java +31 -0
- package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensorType.java +35 -0
- package/android/src/main/java/com/swmansion/reanimated/transitions/ChangeTransition.java +84 -0
- package/android/src/main/java/com/swmansion/reanimated/transitions/SaneSidePropagation.java +25 -0
- package/android/src/main/java/com/swmansion/reanimated/transitions/Scale.java +86 -0
- package/android/src/main/java/com/swmansion/reanimated/transitions/TransitionModule.java +41 -0
- package/android/src/main/java/com/swmansion/reanimated/transitions/TransitionUtils.java +161 -0
- package/ios/LayoutReanimation/REAAnimationsManager.h +1 -1
- package/ios/LayoutReanimation/REAAnimationsManager.m +18 -4
- package/ios/REAModule.m +8 -9
- package/ios/REANodesManager.h +4 -1
- package/ios/REANodesManager.m +75 -3
- package/ios/native/NativeMethods.h +1 -1
- package/ios/native/NativeProxy.mm +85 -5
- package/ios/sensor/ReanimatedSensor.h +21 -0
- package/ios/sensor/ReanimatedSensor.m +169 -0
- package/ios/sensor/ReanimatedSensorContainer.h +13 -0
- package/ios/sensor/ReanimatedSensorContainer.m +41 -0
- package/ios/sensor/ReanimatedSensorType.h +7 -0
- package/lib/ConfigHelper.js +2 -2
- package/lib/createAnimatedComponent.js +3 -4
- package/lib/reanimated1/core/AnimatedFunction.js +1 -1
- package/lib/reanimated1/derived/interpolate.js +2 -4
- package/lib/reanimated2/Colors.js +3 -98
- package/lib/reanimated2/Easing.js +5 -0
- package/lib/reanimated2/NativeMethods.js +15 -5
- package/lib/reanimated2/NativeReanimated/NativeReanimated.js +25 -12
- package/lib/reanimated2/NativeReanimated/index.js +2 -6
- package/lib/reanimated2/ViewDescriptorsSet.js +2 -2
- package/lib/reanimated2/animation/styleAnimation.js +2 -1
- package/lib/reanimated2/core.js +30 -24
- package/lib/reanimated2/globals.d.ts +6 -0
- package/lib/reanimated2/hook/index.js +1 -0
- package/lib/reanimated2/hook/useAnimatedGestureHandler.js +1 -2
- package/lib/reanimated2/hook/useAnimatedSensor.js +66 -0
- package/lib/reanimated2/hook/useAnimatedStyle.js +31 -14
- package/lib/reanimated2/hook/utils.js +14 -11
- package/lib/reanimated2/index.js +2 -0
- package/lib/reanimated2/interpolateColor.js +98 -0
- package/lib/reanimated2/interpolation.js +1 -1
- package/lib/reanimated2/jestUtils.js +9 -4
- package/lib/reanimated2/js-reanimated/JSReanimated.js +24 -3
- package/lib/reanimated2/js-reanimated/commonTypes.js +1 -0
- package/lib/reanimated2/layoutReanimation/animationBuilder/ComplexAnimationBuilder.js +8 -0
- package/lib/reanimated2/layoutReanimation/animationBuilder/Keyframe.js +2 -1
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Bounce.js +32 -42
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Fade.js +20 -38
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Flip.js +32 -44
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Lightspeed.js +8 -16
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Pinwheel.js +6 -10
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Roll.js +8 -12
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Rotate.js +20 -36
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Slide.js +16 -20
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Stretch.js +8 -12
- package/lib/reanimated2/layoutReanimation/defaultAnimations/Zoom.js +32 -48
- package/lib/reanimated2/layoutReanimation/defaultTransitions/EntryExitTransition.js +22 -18
- package/lib/reanimated2/mock.js +3 -2
- package/mock.js +6 -4
- package/package.json +44 -36
- package/plugin.js +3 -0
- package/react-native-reanimated.d.ts +102 -15
- package/src/ConfigHelper.ts +4 -4
- package/src/createAnimatedComponent.tsx +3 -3
- package/src/reanimated1/core/AnimatedFunction.js +1 -1
- package/src/reanimated1/derived/interpolate.js +2 -4
- package/src/reanimated2/Colors.ts +8 -151
- package/src/reanimated2/Easing.ts +11 -0
- package/src/reanimated2/NativeMethods.ts +19 -6
- package/src/reanimated2/NativeReanimated/NativeReanimated.ts +42 -14
- package/src/reanimated2/NativeReanimated/index.ts +2 -8
- package/src/reanimated2/ViewDescriptorsSet.ts +2 -3
- package/src/reanimated2/animation/commonTypes.ts +44 -40
- package/src/reanimated2/animation/decay.ts +1 -1
- package/src/reanimated2/animation/delay.ts +2 -16
- package/src/reanimated2/animation/index.ts +8 -8
- package/src/reanimated2/animation/repeat.ts +2 -12
- package/src/reanimated2/animation/sequence.ts +3 -10
- package/src/reanimated2/animation/spring.ts +1 -1
- package/src/reanimated2/animation/styleAnimation.ts +11 -25
- package/src/reanimated2/animation/timing.ts +4 -2
- package/src/reanimated2/animation/util.ts +22 -20
- package/src/reanimated2/commonTypes.ts +68 -1
- package/src/reanimated2/component/FlatList.tsx +2 -1
- package/src/reanimated2/core.ts +35 -29
- package/src/reanimated2/globals.d.ts +6 -0
- package/src/reanimated2/hook/commonTypes.ts +5 -0
- package/src/reanimated2/hook/index.ts +1 -0
- package/src/reanimated2/hook/useAnimatedGestureHandler.ts +1 -2
- package/src/reanimated2/hook/useAnimatedRef.ts +1 -5
- package/src/reanimated2/hook/useAnimatedSensor.ts +91 -0
- package/src/reanimated2/hook/useAnimatedStyle.ts +35 -16
- package/src/reanimated2/hook/utils.ts +20 -18
- package/src/reanimated2/index.ts +2 -0
- package/src/reanimated2/interpolateColor.ts +178 -0
- package/src/reanimated2/interpolation.ts +2 -6
- package/src/reanimated2/jestUtils.ts +9 -4
- package/src/reanimated2/js-reanimated/JSReanimated.ts +28 -6
- package/src/reanimated2/js-reanimated/Mapper.ts +1 -1
- package/src/reanimated2/js-reanimated/MapperRegistry.ts +1 -1
- package/src/reanimated2/js-reanimated/commonTypes.ts +51 -0
- package/src/reanimated2/layoutReanimation/animationBuilder/ComplexAnimationBuilder.ts +13 -0
- package/src/reanimated2/layoutReanimation/animationBuilder/Keyframe.ts +2 -3
- package/src/reanimated2/layoutReanimation/defaultAnimations/Bounce.ts +51 -21
- package/src/reanimated2/layoutReanimation/defaultAnimations/Fade.ts +40 -10
- package/src/reanimated2/layoutReanimation/defaultAnimations/Flip.ts +48 -12
- package/src/reanimated2/layoutReanimation/defaultAnimations/Lightspeed.ts +16 -4
- package/src/reanimated2/layoutReanimation/defaultAnimations/Pinwheel.ts +8 -2
- package/src/reanimated2/layoutReanimation/defaultAnimations/Roll.ts +16 -4
- package/src/reanimated2/layoutReanimation/defaultAnimations/Rotate.ts +32 -8
- package/src/reanimated2/layoutReanimation/defaultAnimations/Slide.ts +32 -10
- package/src/reanimated2/layoutReanimation/defaultAnimations/Stretch.ts +16 -4
- package/src/reanimated2/layoutReanimation/defaultAnimations/Zoom.ts +64 -16
- package/src/reanimated2/layoutReanimation/defaultTransitions/CurvedTransition.ts +2 -1
- package/src/reanimated2/layoutReanimation/defaultTransitions/EntryExitTransition.ts +32 -21
- package/src/reanimated2/layoutReanimation/defaultTransitions/FadingTransition.ts +2 -1
- package/src/reanimated2/layoutReanimation/defaultTransitions/JumpingTransition.ts +2 -1
- package/src/reanimated2/layoutReanimation/defaultTransitions/LinearTransition.ts +2 -1
- package/src/reanimated2/layoutReanimation/defaultTransitions/SequencedTransition.ts +2 -1
- package/src/reanimated2/mock.ts +3 -2
- package/src/reanimated2/utils.ts +1 -1
- package/android/react-native-reanimated-63-hermes.aar +0 -0
- package/android/react-native-reanimated-63-jsc.aar +0 -0
- package/android/src/main/java/com/swmansion/reanimated/ReanimatedProxyPackage.java +0 -15
- package/libSo/fbjni/jni/arm64-v8a/libfbjni.so +0 -0
- package/libSo/fbjni/jni/armeabi-v7a/libfbjni.so +0 -0
- package/libSo/fbjni/jni/x86/libfbjni.so +0 -0
- package/libSo/fbjni/jni/x86_64/libfbjni.so +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
4
|
+
import com.swmansion.reanimated.MapUtils;
|
|
5
|
+
import com.swmansion.reanimated.NodesManager;
|
|
6
|
+
|
|
7
|
+
public abstract class ClockOpNode extends Node {
|
|
8
|
+
|
|
9
|
+
public static class ClockStartNode extends ClockOpNode {
|
|
10
|
+
public ClockStartNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
11
|
+
super(nodeID, config, nodesManager);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@Override
|
|
15
|
+
protected Double eval(Node clock) {
|
|
16
|
+
if (clock instanceof ParamNode) {
|
|
17
|
+
((ParamNode) clock).start();
|
|
18
|
+
} else {
|
|
19
|
+
((ClockNode) clock).start();
|
|
20
|
+
}
|
|
21
|
+
return ZERO;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public static class ClockStopNode extends ClockOpNode {
|
|
26
|
+
public ClockStopNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
27
|
+
super(nodeID, config, nodesManager);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@Override
|
|
31
|
+
protected Double eval(Node clock) {
|
|
32
|
+
if (clock instanceof ParamNode) {
|
|
33
|
+
((ParamNode) clock).stop();
|
|
34
|
+
} else {
|
|
35
|
+
((ClockNode) clock).stop();
|
|
36
|
+
}
|
|
37
|
+
return ZERO;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public static class ClockTestNode extends ClockOpNode {
|
|
42
|
+
public ClockTestNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
43
|
+
super(nodeID, config, nodesManager);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@Override
|
|
47
|
+
protected Double eval(Node clock) {
|
|
48
|
+
if (clock instanceof ParamNode) {
|
|
49
|
+
return ((ParamNode) clock).isRunning() ? 1. : 0.;
|
|
50
|
+
}
|
|
51
|
+
return ((ClockNode) clock).isRunning ? 1. : 0.;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private int clockID;
|
|
56
|
+
|
|
57
|
+
public ClockOpNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
58
|
+
super(nodeID, config, nodesManager);
|
|
59
|
+
clockID =
|
|
60
|
+
MapUtils.getInt(
|
|
61
|
+
config,
|
|
62
|
+
"clock",
|
|
63
|
+
"Reanimated: Argument passed to clock node is either of wrong type or is missing.");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@Override
|
|
67
|
+
protected Double evaluate() {
|
|
68
|
+
Node clock = mNodesManager.findNodeById(clockID, Node.class);
|
|
69
|
+
return eval(clock);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected abstract Double eval(Node clock);
|
|
73
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
4
|
+
import com.swmansion.reanimated.NodesManager;
|
|
5
|
+
import com.swmansion.reanimated.Utils;
|
|
6
|
+
import java.text.NumberFormat;
|
|
7
|
+
import java.util.Locale;
|
|
8
|
+
|
|
9
|
+
public class ConcatNode extends Node {
|
|
10
|
+
private final int[] mInputIDs;
|
|
11
|
+
private static final NumberFormat sFormatter = NumberFormat.getInstance(Locale.ENGLISH);
|
|
12
|
+
|
|
13
|
+
static {
|
|
14
|
+
sFormatter.setMinimumFractionDigits(0);
|
|
15
|
+
sFormatter.setGroupingUsed(false);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public ConcatNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
19
|
+
super(nodeID, config, nodesManager);
|
|
20
|
+
mInputIDs = Utils.processIntArray(config.getArray("input"));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
protected String evaluate() {
|
|
25
|
+
StringBuilder builder = new StringBuilder();
|
|
26
|
+
for (int i = 0; i < mInputIDs.length; i++) {
|
|
27
|
+
Node inputNodes = mNodesManager.findNodeById(mInputIDs[i], Node.class);
|
|
28
|
+
Object value = inputNodes.value();
|
|
29
|
+
if (value instanceof Double) {
|
|
30
|
+
value = sFormatter.format((Double) value);
|
|
31
|
+
}
|
|
32
|
+
builder.append(value);
|
|
33
|
+
}
|
|
34
|
+
return builder.toString();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
4
|
+
import com.swmansion.reanimated.MapUtils;
|
|
5
|
+
import com.swmansion.reanimated.NodesManager;
|
|
6
|
+
|
|
7
|
+
public class CondNode extends Node {
|
|
8
|
+
|
|
9
|
+
private final int mCondID, mIfBlockID, mElseBlockID;
|
|
10
|
+
|
|
11
|
+
public CondNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
12
|
+
super(nodeID, config, nodesManager);
|
|
13
|
+
mCondID =
|
|
14
|
+
MapUtils.getInt(
|
|
15
|
+
config,
|
|
16
|
+
"cond",
|
|
17
|
+
"Reanimated: First argument passed to cond node is either of wrong type or is missing.");
|
|
18
|
+
mIfBlockID =
|
|
19
|
+
MapUtils.getInt(
|
|
20
|
+
config,
|
|
21
|
+
"ifBlock",
|
|
22
|
+
"Reanimated: Second argument passed to cond node is either of wrong type or is missing.");
|
|
23
|
+
mElseBlockID =
|
|
24
|
+
config.hasKey("elseBlock")
|
|
25
|
+
? MapUtils.getInt(
|
|
26
|
+
config,
|
|
27
|
+
"elseBlock",
|
|
28
|
+
"Reanimated: Second argument passed to cond node is either of wrong type or is missing.")
|
|
29
|
+
: -1;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Override
|
|
33
|
+
protected Object evaluate() {
|
|
34
|
+
Object cond = mNodesManager.getNodeValue(mCondID);
|
|
35
|
+
if (cond instanceof Number && ((Number) cond).doubleValue() != 0.0) {
|
|
36
|
+
// This is not a good way to compare doubles but in this case it is what we want
|
|
37
|
+
return mIfBlockID != -1 ? mNodesManager.getNodeValue(mIfBlockID) : ZERO;
|
|
38
|
+
}
|
|
39
|
+
return mElseBlockID != -1 ? mNodesManager.getNodeValue(mElseBlockID) : ZERO;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import android.util.Log;
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
5
|
+
import com.swmansion.reanimated.MapUtils;
|
|
6
|
+
import com.swmansion.reanimated.NodesManager;
|
|
7
|
+
|
|
8
|
+
public class DebugNode extends Node {
|
|
9
|
+
|
|
10
|
+
private final String mMessage;
|
|
11
|
+
private final int mValueID;
|
|
12
|
+
|
|
13
|
+
public DebugNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
14
|
+
super(nodeID, config, nodesManager);
|
|
15
|
+
mMessage =
|
|
16
|
+
MapUtils.getString(
|
|
17
|
+
config,
|
|
18
|
+
"message",
|
|
19
|
+
"Reanimated: First argument passed to debug node is either of wrong type or is missing.");
|
|
20
|
+
mValueID =
|
|
21
|
+
MapUtils.getInt(
|
|
22
|
+
config,
|
|
23
|
+
"value",
|
|
24
|
+
"Reanimated: Second argument passed to debug node is either of wrong type or is missing.");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
protected Object evaluate() {
|
|
29
|
+
Object value = mNodesManager.findNodeById(mValueID, Node.class).value();
|
|
30
|
+
Log.d("REANIMATED", String.format("%s %s", mMessage, value));
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableArray;
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
5
|
+
import com.facebook.react.bridge.WritableArray;
|
|
6
|
+
import com.facebook.react.bridge.WritableMap;
|
|
7
|
+
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
|
8
|
+
import com.swmansion.reanimated.NodesManager;
|
|
9
|
+
import java.util.ArrayList;
|
|
10
|
+
import java.util.List;
|
|
11
|
+
import javax.annotation.Nullable;
|
|
12
|
+
|
|
13
|
+
public class EventNode extends Node implements RCTEventEmitter {
|
|
14
|
+
|
|
15
|
+
private static class EventMap {
|
|
16
|
+
private final int nodeID;
|
|
17
|
+
private final String[] path;
|
|
18
|
+
|
|
19
|
+
public EventMap(ReadableArray eventPath) {
|
|
20
|
+
int size = eventPath.size();
|
|
21
|
+
path = new String[size - 1];
|
|
22
|
+
for (int i = 0; i < size - 1; i++) {
|
|
23
|
+
path[i] = eventPath.getString(i);
|
|
24
|
+
}
|
|
25
|
+
nodeID = eventPath.getInt(size - 1);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public Double lookupValue(ReadableMap event) {
|
|
29
|
+
ReadableMap map = event;
|
|
30
|
+
for (int i = 0; map != null && i < path.length - 1; i++) {
|
|
31
|
+
String key = path[i];
|
|
32
|
+
map = map.hasKey(key) ? map.getMap(key) : null;
|
|
33
|
+
}
|
|
34
|
+
if (map != null) {
|
|
35
|
+
String key = path[path.length - 1];
|
|
36
|
+
return map.hasKey(key) ? map.getDouble(key) : null;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private static List<EventMap> processMapping(ReadableArray mapping) {
|
|
43
|
+
int size = mapping.size();
|
|
44
|
+
List<EventMap> res = new ArrayList<>(size);
|
|
45
|
+
for (int i = 0; i < size; i++) {
|
|
46
|
+
res.add(new EventMap(mapping.getArray(i)));
|
|
47
|
+
}
|
|
48
|
+
return res;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private final List<EventMap> mMapping;
|
|
52
|
+
|
|
53
|
+
public EventNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
54
|
+
super(nodeID, config, nodesManager);
|
|
55
|
+
mMapping = processMapping(config.getArray("argMapping"));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@Override
|
|
59
|
+
public void receiveEvent(int targetTag, String eventName, @Nullable WritableMap event) {
|
|
60
|
+
if (event == null) {
|
|
61
|
+
throw new IllegalArgumentException("Animated events must have event data.");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
for (int i = 0; i < mMapping.size(); i++) {
|
|
65
|
+
EventMap eventMap = mMapping.get(i);
|
|
66
|
+
Double value = eventMap.lookupValue(event);
|
|
67
|
+
if (value != null) {
|
|
68
|
+
mNodesManager.findNodeById(eventMap.nodeID, ValueNode.class).setValue(value);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@Override
|
|
74
|
+
public void receiveTouches(
|
|
75
|
+
String eventName, WritableArray touches, WritableArray changedIndices) {
|
|
76
|
+
throw new RuntimeException("receiveTouches is not support by animated events");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@Override
|
|
80
|
+
protected Double evaluate() {
|
|
81
|
+
return ZERO;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
4
|
+
import com.swmansion.reanimated.NodesManager;
|
|
5
|
+
|
|
6
|
+
public class FunctionNode extends Node {
|
|
7
|
+
|
|
8
|
+
private final int mWhatNodeID;
|
|
9
|
+
|
|
10
|
+
public FunctionNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
11
|
+
super(nodeID, config, nodesManager);
|
|
12
|
+
mWhatNodeID = config.getInt("what");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@Override
|
|
16
|
+
protected Object evaluate() {
|
|
17
|
+
Node what = mNodesManager.findNodeById(mWhatNodeID, Node.class);
|
|
18
|
+
return what.value();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments;
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
5
|
+
import com.facebook.react.bridge.WritableArray;
|
|
6
|
+
import com.facebook.react.bridge.WritableMap;
|
|
7
|
+
import com.swmansion.reanimated.NodesManager;
|
|
8
|
+
import com.swmansion.reanimated.Utils;
|
|
9
|
+
|
|
10
|
+
public class JSCallNode extends Node {
|
|
11
|
+
|
|
12
|
+
private final int[] mInputIDs;
|
|
13
|
+
|
|
14
|
+
public JSCallNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
|
|
15
|
+
super(nodeID, config, nodesManager);
|
|
16
|
+
mInputIDs = Utils.processIntArray(config.getArray("input"));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Override
|
|
20
|
+
protected Double evaluate() {
|
|
21
|
+
WritableArray args = Arguments.createArray();
|
|
22
|
+
for (int i = 0; i < mInputIDs.length; i++) {
|
|
23
|
+
Node node = mNodesManager.findNodeById(mInputIDs[i], Node.class);
|
|
24
|
+
if (node.value() == null) {
|
|
25
|
+
args.pushNull();
|
|
26
|
+
} else {
|
|
27
|
+
Object value = node.value();
|
|
28
|
+
if (value instanceof String) {
|
|
29
|
+
args.pushString((String) value);
|
|
30
|
+
} else {
|
|
31
|
+
args.pushDouble(node.doubleValue());
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
WritableMap eventData = Arguments.createMap();
|
|
36
|
+
eventData.putInt("id", mNodeID);
|
|
37
|
+
eventData.putArray("args", args);
|
|
38
|
+
mNodesManager.sendEvent("onReanimatedCall", eventData);
|
|
39
|
+
return ZERO;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
4
|
+
import com.facebook.react.bridge.UiThreadUtil;
|
|
5
|
+
import com.swmansion.reanimated.NodesManager;
|
|
6
|
+
import com.swmansion.reanimated.UpdateContext;
|
|
7
|
+
import java.util.ArrayList;
|
|
8
|
+
import java.util.HashMap;
|
|
9
|
+
import java.util.HashSet;
|
|
10
|
+
import java.util.List;
|
|
11
|
+
import java.util.Map;
|
|
12
|
+
import java.util.Set;
|
|
13
|
+
import java.util.Stack;
|
|
14
|
+
import javax.annotation.Nullable;
|
|
15
|
+
|
|
16
|
+
public abstract class Node {
|
|
17
|
+
|
|
18
|
+
public static final Double ZERO = Double.valueOf(0);
|
|
19
|
+
public static final Double ONE = Double.valueOf(1);
|
|
20
|
+
|
|
21
|
+
protected final int mNodeID;
|
|
22
|
+
protected final NodesManager mNodesManager;
|
|
23
|
+
|
|
24
|
+
protected final UpdateContext mUpdateContext;
|
|
25
|
+
|
|
26
|
+
private final Map<String, Long> mLastLoopID = new HashMap<>();
|
|
27
|
+
private final Map<String, Object> mMemoizedValue = new HashMap<>();
|
|
28
|
+
private @Nullable List<Node> mChildren; /* lazy-initialized when a child is added */
|
|
29
|
+
|
|
30
|
+
public Node(int nodeID, @Nullable ReadableMap config, NodesManager nodesManager) {
|
|
31
|
+
mLastLoopID.put("", -1L);
|
|
32
|
+
mNodeID = nodeID;
|
|
33
|
+
mNodesManager = nodesManager;
|
|
34
|
+
mUpdateContext = nodesManager.updateContext;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
protected abstract @Nullable Object evaluate();
|
|
38
|
+
|
|
39
|
+
public final @Nullable Object value() {
|
|
40
|
+
if (!mLastLoopID.containsKey(mUpdateContext.callID)
|
|
41
|
+
|| mLastLoopID.get(mUpdateContext.callID) < mUpdateContext.updateLoopID) {
|
|
42
|
+
mLastLoopID.put(mUpdateContext.callID, mUpdateContext.updateLoopID);
|
|
43
|
+
Object result = evaluate();
|
|
44
|
+
mMemoizedValue.put(mUpdateContext.callID, result);
|
|
45
|
+
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
return mMemoizedValue.get(mUpdateContext.callID);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* This method will never return null. If value is null or of a different type we try to cast and
|
|
53
|
+
* return 0 if we fail to properly cast the value. This is to match iOS behavior where the node
|
|
54
|
+
* would not throw even if the value was not set.
|
|
55
|
+
*/
|
|
56
|
+
public final Double doubleValue() {
|
|
57
|
+
Object value = value();
|
|
58
|
+
if (value == null) {
|
|
59
|
+
return ZERO;
|
|
60
|
+
} else if (value instanceof Double) {
|
|
61
|
+
return (Double) value;
|
|
62
|
+
} else if (value instanceof Number) {
|
|
63
|
+
return Double.valueOf(((Number) value).doubleValue());
|
|
64
|
+
} else if (value instanceof Boolean) {
|
|
65
|
+
return ((Boolean) value).booleanValue() ? ONE : ZERO;
|
|
66
|
+
}
|
|
67
|
+
throw new IllegalStateException("Value of node " + this + " cannot be cast to a number");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public void addChild(Node child) {
|
|
71
|
+
if (mChildren == null) {
|
|
72
|
+
mChildren = new ArrayList<>();
|
|
73
|
+
}
|
|
74
|
+
mChildren.add(child);
|
|
75
|
+
child.dangerouslyRescheduleEvaluate();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public void removeChild(Node child) {
|
|
79
|
+
if (mChildren != null) {
|
|
80
|
+
mChildren.remove(child);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
protected void markUpdated() {
|
|
85
|
+
UiThreadUtil.assertOnUiThread();
|
|
86
|
+
mUpdateContext.updatedNodes.add(this);
|
|
87
|
+
mNodesManager.postRunUpdatesAfterAnimation();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public void onDrop() {
|
|
91
|
+
// noop
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
protected final void dangerouslyRescheduleEvaluate() {
|
|
95
|
+
mLastLoopID.put(mUpdateContext.callID, -1L);
|
|
96
|
+
markUpdated();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
protected final void forceUpdateMemoizedValue(Object value) {
|
|
100
|
+
mMemoizedValue.put(mUpdateContext.callID, value);
|
|
101
|
+
markUpdated();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private static void findAndUpdateNodes(
|
|
105
|
+
Node node, Set<Node> visitedNodes, Stack<FinalNode> finalNodes) {
|
|
106
|
+
if (visitedNodes.contains(node)) {
|
|
107
|
+
return;
|
|
108
|
+
} else {
|
|
109
|
+
visitedNodes.add(node);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
List<Node> children = node.mChildren;
|
|
113
|
+
if (children != null) {
|
|
114
|
+
for (Node child : children) {
|
|
115
|
+
findAndUpdateNodes(child, visitedNodes, finalNodes);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (node instanceof FinalNode) {
|
|
119
|
+
finalNodes.push((FinalNode) node);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public static void runUpdates(UpdateContext updateContext) {
|
|
124
|
+
UiThreadUtil.assertOnUiThread();
|
|
125
|
+
ArrayList<Node> updatedNodes = updateContext.updatedNodes;
|
|
126
|
+
Set<Node> visitedNodes = new HashSet<>();
|
|
127
|
+
Stack<FinalNode> finalNodes = new Stack<>();
|
|
128
|
+
for (int i = 0; i < updatedNodes.size(); i++) {
|
|
129
|
+
findAndUpdateNodes(updatedNodes.get(i), visitedNodes, finalNodes);
|
|
130
|
+
if (i == updatedNodes.size() - 1) {
|
|
131
|
+
while (!finalNodes.isEmpty()) {
|
|
132
|
+
finalNodes.pop().update();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
updatedNodes.clear();
|
|
137
|
+
updateContext.updateLoopID++;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
package com.swmansion.reanimated.nodes;
|
|
2
|
+
|
|
3
|
+
import com.swmansion.reanimated.NodesManager;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This node is used by {@link NodesManager} to return in place of a missing node that might have
|
|
7
|
+
* been requested. This way we avoid a top of null-checks and we make nodes manager compatible with
|
|
8
|
+
* the iOS code which does not crash for missing nodes. In most of the cases it is desirable to
|
|
9
|
+
* handle missing nodes gracefully as it usually means the node hasn't been hooked under animated
|
|
10
|
+
* view prop but is referenced in the graph (e.g. to support some edge case).
|
|
11
|
+
*/
|
|
12
|
+
public class NoopNode extends ValueNode {
|
|
13
|
+
|
|
14
|
+
public NoopNode(NodesManager nodesManager) {
|
|
15
|
+
super(-2, null, nodesManager);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@Override
|
|
19
|
+
public void setValue(Object value) {
|
|
20
|
+
// no-op
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public void addChild(Node child) {
|
|
25
|
+
// no-op
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@Override
|
|
29
|
+
public void removeChild(Node child) {
|
|
30
|
+
// no-op
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@Override
|
|
34
|
+
protected void markUpdated() {
|
|
35
|
+
// no-op
|
|
36
|
+
}
|
|
37
|
+
}
|