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.
Files changed (249) hide show
  1. package/Common/cpp/AnimatedSensor/AnimatedSensorModule.cpp +72 -0
  2. package/Common/cpp/NativeModules/NativeReanimatedModule.cpp +30 -1
  3. package/Common/cpp/NativeModules/NativeReanimatedModuleSpec.cpp +64 -39
  4. package/Common/cpp/Tools/RuntimeDecorator.cpp +2 -0
  5. package/Common/cpp/headers/AnimatedSensor/AnimatedSensorModule.h +41 -0
  6. package/Common/cpp/headers/NativeModules/NativeReanimatedModule.h +14 -0
  7. package/Common/cpp/headers/NativeModules/NativeReanimatedModuleSpec.h +14 -0
  8. package/Common/cpp/headers/SharedItems/MutableValue.h +4 -1
  9. package/Common/cpp/headers/SharedItems/ShareableValue.h +3 -0
  10. package/Common/cpp/headers/SharedItems/ValueWrapper.h +3 -0
  11. package/Common/cpp/headers/Tools/PlatformDepMethodsHolder.h +11 -0
  12. package/Common/cpp/headers/Tools/RuntimeDecorator.h +2 -0
  13. package/LICENSE +1 -1
  14. package/README.md +2 -2
  15. package/android/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  16. package/android/.gradle/7.2/dependencies-accessors/gc.properties +0 -0
  17. package/android/.gradle/7.2/executionHistory/executionHistory.bin +0 -0
  18. package/android/.gradle/7.2/executionHistory/executionHistory.lock +0 -0
  19. package/android/.gradle/7.2/fileChanges/last-build.bin +0 -0
  20. package/android/.gradle/7.2/fileHashes/fileHashes.bin +0 -0
  21. package/android/.gradle/7.2/fileHashes/fileHashes.lock +0 -0
  22. package/android/.gradle/7.2/fileHashes/resourceHashesCache.bin +0 -0
  23. package/android/.gradle/7.2/gc.properties +0 -0
  24. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  25. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  26. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  27. package/android/.gradle/checksums/checksums.lock +0 -0
  28. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  29. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  30. package/android/.gradle/vcs-1/gc.properties +0 -0
  31. package/android/CMakeLists.txt +198 -0
  32. package/android/README.md +15 -0
  33. package/android/build.gradle +686 -73
  34. package/android/empty.cpp +1 -0
  35. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  36. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  37. package/android/gradle.properties +25 -0
  38. package/android/gradlew +234 -0
  39. package/android/gradlew.bat +89 -0
  40. package/android/react-native-reanimated-64-hermes.aar +0 -0
  41. package/android/react-native-reanimated-64-jsc.aar +0 -0
  42. package/android/react-native-reanimated-65-hermes.aar +0 -0
  43. package/android/react-native-reanimated-65-jsc.aar +0 -0
  44. package/android/react-native-reanimated-66-hermes.aar +0 -0
  45. package/android/react-native-reanimated-66-jsc.aar +0 -0
  46. package/android/react-native-reanimated-67-hermes.aar +0 -0
  47. package/android/react-native-reanimated-67-jsc.aar +0 -0
  48. package/android/react-native-reanimated-68-hermes.aar +0 -0
  49. package/android/react-native-reanimated-68-jsc.aar +0 -0
  50. package/android/rnVersionPatch/62/layoutReanimation/ReanimatedNativeHierarchyManager.java +412 -0
  51. package/android/rnVersionPatch/62/layoutReanimation/ReanimatedUIImplementation.java +68 -0
  52. package/android/rnVersionPatch/63/layoutReanimation/ReanimatedUIImplementation.java +68 -0
  53. package/android/rnVersionPatch/64/layoutReanimation/ReanimatedUIImplementation.java +68 -0
  54. package/android/rnVersionPatch/65/.gitkeep +0 -0
  55. package/android/rnVersionPatch/66/.gitkeep +0 -0
  56. package/android/rnVersionPatch/67/.gitkeep +0 -0
  57. package/android/rnVersionPatch/68/.gitkeep +0 -0
  58. package/android/rnVersionPatch/backup/.gitkeep +0 -0
  59. package/android/settings.gradle +1 -0
  60. package/android/spotless.gradle +9 -0
  61. package/android/src/{AndroidManifest.xml → main/AndroidManifest.xml} +0 -0
  62. package/android/src/main/cpp/AndroidErrorHandler.cpp +42 -0
  63. package/android/src/main/cpp/AndroidLogger.cpp +27 -0
  64. package/android/src/main/cpp/AndroidScheduler.cpp +59 -0
  65. package/android/src/main/cpp/JNIHelper.cpp +59 -0
  66. package/android/src/main/cpp/LayoutAnimations.cpp +103 -0
  67. package/android/src/main/cpp/NativeProxy.cpp +327 -0
  68. package/android/src/main/cpp/OnLoad.cpp +17 -0
  69. package/android/src/main/cpp/TurboModule.cpp +44 -0
  70. package/android/src/main/cpp/headers/AndroidErrorHandler.h +30 -0
  71. package/android/src/main/cpp/headers/AndroidLogger.h +16 -0
  72. package/android/src/main/cpp/headers/AndroidScheduler.h +41 -0
  73. package/android/src/main/cpp/headers/JNIHelper.h +30 -0
  74. package/android/src/main/cpp/headers/LayoutAnimations.h +42 -0
  75. package/android/src/main/cpp/headers/NativeProxy.h +170 -0
  76. package/android/src/main/cpp/headers/TurboModule.h +70 -0
  77. package/android/src/main/java/com/facebook/react/uimanager/UIManagerReanimatedHelper.java +15 -0
  78. package/android/src/main/java/com/swmansion/common/GestureHandlerStateManager.java +5 -0
  79. package/android/src/main/java/com/swmansion/reanimated/AndroidErrorHandler.java +8 -0
  80. package/android/src/main/java/com/swmansion/reanimated/CopiedEvent.java +43 -0
  81. package/android/src/main/java/com/swmansion/reanimated/MapUtils.java +26 -0
  82. package/android/src/main/java/com/swmansion/reanimated/NativeMethodsHelper.java +117 -0
  83. package/android/src/main/java/com/swmansion/reanimated/NativeProxy.java +285 -0
  84. package/android/src/main/java/com/swmansion/reanimated/NodesManager.java +682 -0
  85. package/android/src/main/java/com/swmansion/reanimated/ReanimatedJSIModulePackage.java +29 -0
  86. package/android/src/main/java/com/swmansion/reanimated/ReanimatedModule.java +251 -0
  87. package/android/src/main/java/com/swmansion/reanimated/ReanimatedPackage.java +96 -0
  88. package/android/src/main/java/com/swmansion/reanimated/Scheduler.java +51 -0
  89. package/android/src/main/java/com/swmansion/reanimated/UpdateContext.java +11 -0
  90. package/android/src/main/java/com/swmansion/reanimated/Utils.java +32 -0
  91. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/AnimationsManager.java +517 -0
  92. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/LayoutAnimations.java +56 -0
  93. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/NativeMethodsHolder.java +11 -0
  94. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ReanimatedNativeHierarchyManager.java +410 -0
  95. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ReanimatedUIImplementation.java +68 -0
  96. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ReanimatedUIManager.java +292 -0
  97. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/Snapshot.java +121 -0
  98. package/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ViewHierarchyObserver.java +12 -0
  99. package/android/src/main/java/com/swmansion/reanimated/nodes/AlwaysNode.java +29 -0
  100. package/android/src/main/java/com/swmansion/reanimated/nodes/BezierNode.java +87 -0
  101. package/android/src/main/java/com/swmansion/reanimated/nodes/BlockNode.java +24 -0
  102. package/android/src/main/java/com/swmansion/reanimated/nodes/CallFuncNode.java +49 -0
  103. package/android/src/main/java/com/swmansion/reanimated/nodes/ClockNode.java +38 -0
  104. package/android/src/main/java/com/swmansion/reanimated/nodes/ClockOpNode.java +73 -0
  105. package/android/src/main/java/com/swmansion/reanimated/nodes/ConcatNode.java +36 -0
  106. package/android/src/main/java/com/swmansion/reanimated/nodes/CondNode.java +41 -0
  107. package/android/src/main/java/com/swmansion/reanimated/nodes/DebugNode.java +33 -0
  108. package/android/src/main/java/com/swmansion/reanimated/nodes/EventNode.java +83 -0
  109. package/android/src/main/java/com/swmansion/reanimated/nodes/FinalNode.java +5 -0
  110. package/android/src/main/java/com/swmansion/reanimated/nodes/FunctionNode.java +20 -0
  111. package/android/src/main/java/com/swmansion/reanimated/nodes/JSCallNode.java +41 -0
  112. package/android/src/main/java/com/swmansion/reanimated/nodes/Node.java +139 -0
  113. package/android/src/main/java/com/swmansion/reanimated/nodes/NoopNode.java +37 -0
  114. package/android/src/main/java/com/swmansion/reanimated/nodes/OperatorNode.java +377 -0
  115. package/android/src/main/java/com/swmansion/reanimated/nodes/ParamNode.java +71 -0
  116. package/android/src/main/java/com/swmansion/reanimated/nodes/PropsNode.java +153 -0
  117. package/android/src/main/java/com/swmansion/reanimated/nodes/SetNode.java +32 -0
  118. package/android/src/main/java/com/swmansion/reanimated/nodes/StyleNode.java +40 -0
  119. package/android/src/main/java/com/swmansion/reanimated/nodes/TransformNode.java +84 -0
  120. package/android/src/main/java/com/swmansion/reanimated/nodes/ValueNode.java +40 -0
  121. package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensor.java +41 -0
  122. package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensorContainer.java +40 -0
  123. package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensorListener.java +31 -0
  124. package/android/src/main/java/com/swmansion/reanimated/sensor/ReanimatedSensorType.java +35 -0
  125. package/android/src/main/java/com/swmansion/reanimated/transitions/ChangeTransition.java +84 -0
  126. package/android/src/main/java/com/swmansion/reanimated/transitions/SaneSidePropagation.java +25 -0
  127. package/android/src/main/java/com/swmansion/reanimated/transitions/Scale.java +86 -0
  128. package/android/src/main/java/com/swmansion/reanimated/transitions/TransitionModule.java +41 -0
  129. package/android/src/main/java/com/swmansion/reanimated/transitions/TransitionUtils.java +161 -0
  130. package/ios/LayoutReanimation/REAAnimationsManager.h +1 -1
  131. package/ios/LayoutReanimation/REAAnimationsManager.m +18 -4
  132. package/ios/REAModule.m +8 -9
  133. package/ios/REANodesManager.h +4 -1
  134. package/ios/REANodesManager.m +75 -3
  135. package/ios/native/NativeMethods.h +1 -1
  136. package/ios/native/NativeProxy.mm +85 -5
  137. package/ios/sensor/ReanimatedSensor.h +21 -0
  138. package/ios/sensor/ReanimatedSensor.m +169 -0
  139. package/ios/sensor/ReanimatedSensorContainer.h +13 -0
  140. package/ios/sensor/ReanimatedSensorContainer.m +41 -0
  141. package/ios/sensor/ReanimatedSensorType.h +7 -0
  142. package/lib/ConfigHelper.js +2 -2
  143. package/lib/createAnimatedComponent.js +3 -4
  144. package/lib/reanimated1/core/AnimatedFunction.js +1 -1
  145. package/lib/reanimated1/derived/interpolate.js +2 -4
  146. package/lib/reanimated2/Colors.js +3 -98
  147. package/lib/reanimated2/Easing.js +5 -0
  148. package/lib/reanimated2/NativeMethods.js +15 -5
  149. package/lib/reanimated2/NativeReanimated/NativeReanimated.js +25 -12
  150. package/lib/reanimated2/NativeReanimated/index.js +2 -6
  151. package/lib/reanimated2/ViewDescriptorsSet.js +2 -2
  152. package/lib/reanimated2/animation/styleAnimation.js +2 -1
  153. package/lib/reanimated2/core.js +30 -24
  154. package/lib/reanimated2/globals.d.ts +6 -0
  155. package/lib/reanimated2/hook/index.js +1 -0
  156. package/lib/reanimated2/hook/useAnimatedGestureHandler.js +1 -2
  157. package/lib/reanimated2/hook/useAnimatedSensor.js +66 -0
  158. package/lib/reanimated2/hook/useAnimatedStyle.js +31 -14
  159. package/lib/reanimated2/hook/utils.js +14 -11
  160. package/lib/reanimated2/index.js +2 -0
  161. package/lib/reanimated2/interpolateColor.js +98 -0
  162. package/lib/reanimated2/interpolation.js +1 -1
  163. package/lib/reanimated2/jestUtils.js +9 -4
  164. package/lib/reanimated2/js-reanimated/JSReanimated.js +24 -3
  165. package/lib/reanimated2/js-reanimated/commonTypes.js +1 -0
  166. package/lib/reanimated2/layoutReanimation/animationBuilder/ComplexAnimationBuilder.js +8 -0
  167. package/lib/reanimated2/layoutReanimation/animationBuilder/Keyframe.js +2 -1
  168. package/lib/reanimated2/layoutReanimation/defaultAnimations/Bounce.js +32 -42
  169. package/lib/reanimated2/layoutReanimation/defaultAnimations/Fade.js +20 -38
  170. package/lib/reanimated2/layoutReanimation/defaultAnimations/Flip.js +32 -44
  171. package/lib/reanimated2/layoutReanimation/defaultAnimations/Lightspeed.js +8 -16
  172. package/lib/reanimated2/layoutReanimation/defaultAnimations/Pinwheel.js +6 -10
  173. package/lib/reanimated2/layoutReanimation/defaultAnimations/Roll.js +8 -12
  174. package/lib/reanimated2/layoutReanimation/defaultAnimations/Rotate.js +20 -36
  175. package/lib/reanimated2/layoutReanimation/defaultAnimations/Slide.js +16 -20
  176. package/lib/reanimated2/layoutReanimation/defaultAnimations/Stretch.js +8 -12
  177. package/lib/reanimated2/layoutReanimation/defaultAnimations/Zoom.js +32 -48
  178. package/lib/reanimated2/layoutReanimation/defaultTransitions/EntryExitTransition.js +22 -18
  179. package/lib/reanimated2/mock.js +3 -2
  180. package/mock.js +6 -4
  181. package/package.json +44 -36
  182. package/plugin.js +3 -0
  183. package/react-native-reanimated.d.ts +102 -15
  184. package/src/ConfigHelper.ts +4 -4
  185. package/src/createAnimatedComponent.tsx +3 -3
  186. package/src/reanimated1/core/AnimatedFunction.js +1 -1
  187. package/src/reanimated1/derived/interpolate.js +2 -4
  188. package/src/reanimated2/Colors.ts +8 -151
  189. package/src/reanimated2/Easing.ts +11 -0
  190. package/src/reanimated2/NativeMethods.ts +19 -6
  191. package/src/reanimated2/NativeReanimated/NativeReanimated.ts +42 -14
  192. package/src/reanimated2/NativeReanimated/index.ts +2 -8
  193. package/src/reanimated2/ViewDescriptorsSet.ts +2 -3
  194. package/src/reanimated2/animation/commonTypes.ts +44 -40
  195. package/src/reanimated2/animation/decay.ts +1 -1
  196. package/src/reanimated2/animation/delay.ts +2 -16
  197. package/src/reanimated2/animation/index.ts +8 -8
  198. package/src/reanimated2/animation/repeat.ts +2 -12
  199. package/src/reanimated2/animation/sequence.ts +3 -10
  200. package/src/reanimated2/animation/spring.ts +1 -1
  201. package/src/reanimated2/animation/styleAnimation.ts +11 -25
  202. package/src/reanimated2/animation/timing.ts +4 -2
  203. package/src/reanimated2/animation/util.ts +22 -20
  204. package/src/reanimated2/commonTypes.ts +68 -1
  205. package/src/reanimated2/component/FlatList.tsx +2 -1
  206. package/src/reanimated2/core.ts +35 -29
  207. package/src/reanimated2/globals.d.ts +6 -0
  208. package/src/reanimated2/hook/commonTypes.ts +5 -0
  209. package/src/reanimated2/hook/index.ts +1 -0
  210. package/src/reanimated2/hook/useAnimatedGestureHandler.ts +1 -2
  211. package/src/reanimated2/hook/useAnimatedRef.ts +1 -5
  212. package/src/reanimated2/hook/useAnimatedSensor.ts +91 -0
  213. package/src/reanimated2/hook/useAnimatedStyle.ts +35 -16
  214. package/src/reanimated2/hook/utils.ts +20 -18
  215. package/src/reanimated2/index.ts +2 -0
  216. package/src/reanimated2/interpolateColor.ts +178 -0
  217. package/src/reanimated2/interpolation.ts +2 -6
  218. package/src/reanimated2/jestUtils.ts +9 -4
  219. package/src/reanimated2/js-reanimated/JSReanimated.ts +28 -6
  220. package/src/reanimated2/js-reanimated/Mapper.ts +1 -1
  221. package/src/reanimated2/js-reanimated/MapperRegistry.ts +1 -1
  222. package/src/reanimated2/js-reanimated/commonTypes.ts +51 -0
  223. package/src/reanimated2/layoutReanimation/animationBuilder/ComplexAnimationBuilder.ts +13 -0
  224. package/src/reanimated2/layoutReanimation/animationBuilder/Keyframe.ts +2 -3
  225. package/src/reanimated2/layoutReanimation/defaultAnimations/Bounce.ts +51 -21
  226. package/src/reanimated2/layoutReanimation/defaultAnimations/Fade.ts +40 -10
  227. package/src/reanimated2/layoutReanimation/defaultAnimations/Flip.ts +48 -12
  228. package/src/reanimated2/layoutReanimation/defaultAnimations/Lightspeed.ts +16 -4
  229. package/src/reanimated2/layoutReanimation/defaultAnimations/Pinwheel.ts +8 -2
  230. package/src/reanimated2/layoutReanimation/defaultAnimations/Roll.ts +16 -4
  231. package/src/reanimated2/layoutReanimation/defaultAnimations/Rotate.ts +32 -8
  232. package/src/reanimated2/layoutReanimation/defaultAnimations/Slide.ts +32 -10
  233. package/src/reanimated2/layoutReanimation/defaultAnimations/Stretch.ts +16 -4
  234. package/src/reanimated2/layoutReanimation/defaultAnimations/Zoom.ts +64 -16
  235. package/src/reanimated2/layoutReanimation/defaultTransitions/CurvedTransition.ts +2 -1
  236. package/src/reanimated2/layoutReanimation/defaultTransitions/EntryExitTransition.ts +32 -21
  237. package/src/reanimated2/layoutReanimation/defaultTransitions/FadingTransition.ts +2 -1
  238. package/src/reanimated2/layoutReanimation/defaultTransitions/JumpingTransition.ts +2 -1
  239. package/src/reanimated2/layoutReanimation/defaultTransitions/LinearTransition.ts +2 -1
  240. package/src/reanimated2/layoutReanimation/defaultTransitions/SequencedTransition.ts +2 -1
  241. package/src/reanimated2/mock.ts +3 -2
  242. package/src/reanimated2/utils.ts +1 -1
  243. package/android/react-native-reanimated-63-hermes.aar +0 -0
  244. package/android/react-native-reanimated-63-jsc.aar +0 -0
  245. package/android/src/main/java/com/swmansion/reanimated/ReanimatedProxyPackage.java +0 -15
  246. package/libSo/fbjni/jni/arm64-v8a/libfbjni.so +0 -0
  247. package/libSo/fbjni/jni/armeabi-v7a/libfbjni.so +0 -0
  248. package/libSo/fbjni/jni/x86/libfbjni.so +0 -0
  249. package/libSo/fbjni/jni/x86_64/libfbjni.so +0 -0
@@ -0,0 +1,377 @@
1
+ package com.swmansion.reanimated.nodes;
2
+
3
+ import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
4
+ import com.facebook.react.bridge.ReadableMap;
5
+ import com.swmansion.reanimated.NodesManager;
6
+ import com.swmansion.reanimated.Utils;
7
+
8
+ public class OperatorNode extends Node {
9
+
10
+ private static boolean truthy(Object value) {
11
+ return value != null && !value.equals(0.);
12
+ }
13
+
14
+ private interface Operator {
15
+ double evaluate(Node[] input);
16
+ }
17
+
18
+ private abstract static class ReduceOperator implements Operator {
19
+ @Override
20
+ public double evaluate(Node[] input) {
21
+ double acc = input[0].doubleValue();
22
+ for (int i = 1; i < input.length; i++) {
23
+ acc = reduce(acc, input[i].doubleValue());
24
+ }
25
+ return acc;
26
+ }
27
+
28
+ public abstract double reduce(Double x, Double y);
29
+ }
30
+
31
+ private abstract static class SingleOperator implements Operator {
32
+ @Override
33
+ public double evaluate(Node[] input) {
34
+ return eval((Double) input[0].value());
35
+ }
36
+
37
+ public abstract double eval(Double x);
38
+ }
39
+
40
+ private abstract static class CompOperator implements Operator {
41
+ @Override
42
+ public double evaluate(Node[] input) {
43
+ return eval((Double) input[0].value(), (Double) input[1].value()) ? 1. : 0.;
44
+ }
45
+
46
+ public abstract boolean eval(Double x, Double y);
47
+ }
48
+
49
+ // arithmetic
50
+ private static final Operator ADD =
51
+ new ReduceOperator() {
52
+ @Override
53
+ public double reduce(Double x, Double y) {
54
+ return x + y;
55
+ }
56
+ };
57
+ private static final Operator SUB =
58
+ new ReduceOperator() {
59
+ @Override
60
+ public double reduce(Double x, Double y) {
61
+ return x - y;
62
+ }
63
+ };
64
+ private static final Operator MULTIPLY =
65
+ new ReduceOperator() {
66
+ @Override
67
+ public double reduce(Double x, Double y) {
68
+ return x * y;
69
+ }
70
+ };
71
+ private static final Operator DIVIDE =
72
+ new ReduceOperator() {
73
+ @Override
74
+ public double reduce(Double x, Double y) {
75
+ return x / y;
76
+ }
77
+ };
78
+ private static final Operator POW =
79
+ new ReduceOperator() {
80
+ @Override
81
+ public double reduce(Double x, Double y) {
82
+ return Math.pow(x, y);
83
+ }
84
+ };
85
+ private static final Operator MODULO =
86
+ new ReduceOperator() {
87
+ @Override
88
+ public double reduce(Double x, Double y) {
89
+ return ((x % y) + y) % y;
90
+ }
91
+ };
92
+ private static final Operator SQRT =
93
+ new SingleOperator() {
94
+ @Override
95
+ public double eval(Double x) {
96
+ return Math.sqrt(x);
97
+ }
98
+ };
99
+ private static final Operator LOG =
100
+ new SingleOperator() {
101
+ @Override
102
+ public double eval(Double x) {
103
+ return Math.log(x);
104
+ }
105
+ };
106
+ private static final Operator SIN =
107
+ new SingleOperator() {
108
+ @Override
109
+ public double eval(Double x) {
110
+ return Math.sin(x);
111
+ }
112
+ };
113
+ private static final Operator COS =
114
+ new SingleOperator() {
115
+ @Override
116
+ public double eval(Double x) {
117
+ return Math.cos(x);
118
+ }
119
+ };
120
+ private static final Operator TAN =
121
+ new SingleOperator() {
122
+ @Override
123
+ public double eval(Double x) {
124
+ return Math.tan(x);
125
+ }
126
+ };
127
+ private static final Operator ACOS =
128
+ new SingleOperator() {
129
+ @Override
130
+ public double eval(Double x) {
131
+ return Math.acos(x);
132
+ }
133
+ };
134
+ private static final Operator ASIN =
135
+ new SingleOperator() {
136
+ @Override
137
+ public double eval(Double x) {
138
+ return Math.asin(x);
139
+ }
140
+ };
141
+ private static final Operator ATAN =
142
+ new SingleOperator() {
143
+ @Override
144
+ public double eval(Double x) {
145
+ return Math.atan(x);
146
+ }
147
+ };
148
+ private static final Operator EXP =
149
+ new SingleOperator() {
150
+ @Override
151
+ public double eval(Double x) {
152
+ return Math.exp(x);
153
+ }
154
+ };
155
+ private static final Operator ROUND =
156
+ new SingleOperator() {
157
+ @Override
158
+ public double eval(Double x) {
159
+ return Math.round(x);
160
+ }
161
+ };
162
+ private static final Operator ABS =
163
+ new SingleOperator() {
164
+ @Override
165
+ public double eval(Double x) {
166
+ return Math.abs(x);
167
+ }
168
+ };
169
+ private static final Operator FLOOR =
170
+ new SingleOperator() {
171
+ @Override
172
+ public double eval(Double x) {
173
+ return Math.floor(x);
174
+ }
175
+ };
176
+ private static final Operator CEIL =
177
+ new SingleOperator() {
178
+ @Override
179
+ public double eval(Double x) {
180
+ return Math.ceil(x);
181
+ }
182
+ };
183
+ private static final Operator MIN =
184
+ new ReduceOperator() {
185
+ @Override
186
+ public double reduce(Double x, Double y) {
187
+ return Math.min(x, y);
188
+ }
189
+ };
190
+ private static final Operator MAX =
191
+ new ReduceOperator() {
192
+ @Override
193
+ public double reduce(Double x, Double y) {
194
+ return Math.max(x, y);
195
+ }
196
+ };
197
+
198
+ // logical
199
+ private static final Operator AND =
200
+ new Operator() {
201
+ @Override
202
+ public double evaluate(Node[] input) {
203
+ boolean res = truthy(input[0].value());
204
+ for (int i = 1; i < input.length && res; i++) {
205
+ res = res && truthy(input[i].value());
206
+ }
207
+ return res ? 1. : 0.;
208
+ }
209
+ };
210
+ private static final Operator OR =
211
+ new Operator() {
212
+ @Override
213
+ public double evaluate(Node[] input) {
214
+ boolean res = truthy(input[0].value());
215
+ for (int i = 1; i < input.length && !res; i++) {
216
+ res = res || truthy(input[i].value());
217
+ }
218
+ return res ? 1. : 0.;
219
+ }
220
+ };
221
+ private static final Operator NOT =
222
+ new Operator() {
223
+ @Override
224
+ public double evaluate(Node[] input) {
225
+ return truthy(input[0].value()) ? 0. : 1.;
226
+ }
227
+ };
228
+ private static final Operator DEFINED =
229
+ new Operator() {
230
+ @Override
231
+ public double evaluate(Node[] input) {
232
+ Object res = input[0].value();
233
+ return (res != null && !(res instanceof Double && ((Double) res).isNaN())) ? 1. : 0.;
234
+ }
235
+ };
236
+
237
+ // comparison
238
+ private static final Operator LESS_THAN =
239
+ new CompOperator() {
240
+ @Override
241
+ public boolean eval(Double x, Double y) {
242
+ if (x == null || y == null) {
243
+ return false;
244
+ }
245
+ return x < y;
246
+ }
247
+ };
248
+ private static final Operator EQ =
249
+ new CompOperator() {
250
+ @Override
251
+ public boolean eval(Double x, Double y) {
252
+ if (x == null || y == null) {
253
+ return x == y;
254
+ }
255
+ return x.doubleValue() == y.doubleValue();
256
+ }
257
+ };
258
+ private static final Operator GREATER_THAN =
259
+ new CompOperator() {
260
+ @Override
261
+ public boolean eval(Double x, Double y) {
262
+ if (x == null || y == null) {
263
+ return false;
264
+ }
265
+ return x > y;
266
+ }
267
+ };
268
+ private static final Operator LESS_OR_EQ =
269
+ new CompOperator() {
270
+ @Override
271
+ public boolean eval(Double x, Double y) {
272
+ return x <= y;
273
+ }
274
+ };
275
+ private static final Operator GREATER_OR_EQ =
276
+ new CompOperator() {
277
+ @Override
278
+ public boolean eval(Double x, Double y) {
279
+ return x >= y;
280
+ }
281
+ };
282
+ private static final Operator NEQ =
283
+ new CompOperator() {
284
+ @Override
285
+ public boolean eval(Double x, Double y) {
286
+ if (x == null || y == null) {
287
+ return x == y;
288
+ }
289
+ return x.doubleValue() != y.doubleValue();
290
+ }
291
+ };
292
+
293
+ private final int[] mInputIDs;
294
+ private final Node[] mInputNodes;
295
+ private final Operator mOperator;
296
+
297
+ public OperatorNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
298
+ super(nodeID, config, nodesManager);
299
+ mInputIDs = Utils.processIntArray(config.getArray("input"));
300
+ mInputNodes = new Node[mInputIDs.length];
301
+
302
+ String op = config.getString("op");
303
+ if ("add".equals(op)) {
304
+ mOperator = ADD;
305
+ } else if ("sub".equals(op)) {
306
+ mOperator = SUB;
307
+ } else if ("multiply".equals(op)) {
308
+ mOperator = MULTIPLY;
309
+ } else if ("divide".equals(op)) {
310
+ mOperator = DIVIDE;
311
+ } else if ("pow".equals(op)) {
312
+ mOperator = POW;
313
+ } else if ("modulo".equals(op)) {
314
+ mOperator = MODULO;
315
+ } else if ("sqrt".equals(op)) {
316
+ mOperator = SQRT;
317
+ } else if ("log".equals(op)) {
318
+ mOperator = LOG;
319
+ } else if ("sin".equals(op)) {
320
+ mOperator = SIN;
321
+ } else if ("cos".equals(op)) {
322
+ mOperator = COS;
323
+ } else if ("tan".equals(op)) {
324
+ mOperator = TAN;
325
+ } else if ("acos".equals(op)) {
326
+ mOperator = ACOS;
327
+ } else if ("asin".equals(op)) {
328
+ mOperator = ASIN;
329
+ } else if ("atan".equals(op)) {
330
+ mOperator = ATAN;
331
+ } else if ("exp".equals(op)) {
332
+ mOperator = EXP;
333
+ } else if ("round".equals(op)) {
334
+ mOperator = ROUND;
335
+ } else if ("and".equals(op)) {
336
+ mOperator = AND;
337
+ } else if ("or".equals(op)) {
338
+ mOperator = OR;
339
+ } else if ("not".equals(op)) {
340
+ mOperator = NOT;
341
+ } else if ("defined".equals(op)) {
342
+ mOperator = DEFINED;
343
+ } else if ("lessThan".equals(op)) {
344
+ mOperator = LESS_THAN;
345
+ } else if ("eq".equals(op)) {
346
+ mOperator = EQ;
347
+ } else if ("greaterThan".equals(op)) {
348
+ mOperator = GREATER_THAN;
349
+ } else if ("lessOrEq".equals(op)) {
350
+ mOperator = LESS_OR_EQ;
351
+ } else if ("greaterOrEq".equals(op)) {
352
+ mOperator = GREATER_OR_EQ;
353
+ } else if ("neq".equals(op)) {
354
+ mOperator = NEQ;
355
+ } else if ("abs".equals(op)) {
356
+ mOperator = ABS;
357
+ } else if ("floor".equals(op)) {
358
+ mOperator = FLOOR;
359
+ } else if ("ceil".equals(op)) {
360
+ mOperator = CEIL;
361
+ } else if ("max".equals(op)) {
362
+ mOperator = MAX;
363
+ } else if ("min".equals(op)) {
364
+ mOperator = MIN;
365
+ } else {
366
+ throw new JSApplicationIllegalArgumentException("Unrecognized operator " + op);
367
+ }
368
+ }
369
+
370
+ @Override
371
+ protected Object evaluate() {
372
+ for (int i = 0; i < mInputIDs.length; i++) {
373
+ mInputNodes[i] = mNodesManager.findNodeById(mInputIDs[i], Node.class);
374
+ }
375
+ return mOperator.evaluate(mInputNodes);
376
+ }
377
+ }
@@ -0,0 +1,71 @@
1
+ package com.swmansion.reanimated.nodes;
2
+
3
+ import com.facebook.react.bridge.ReadableMap;
4
+ import com.swmansion.reanimated.NodesManager;
5
+ import java.util.Stack;
6
+
7
+ public class ParamNode extends ValueNode {
8
+
9
+ private final Stack<Integer> mArgsStack;
10
+ private String mPrevCallID;
11
+
12
+ public ParamNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
13
+ super(nodeID, config, nodesManager);
14
+ mArgsStack = new Stack<>();
15
+ }
16
+
17
+ @Override
18
+ public void setValue(Object value) {
19
+ Node node = mNodesManager.findNodeById(mArgsStack.peek(), Node.class);
20
+ String callID = mUpdateContext.callID;
21
+ mUpdateContext.callID = mPrevCallID;
22
+ ((ValueNode) node).setValue(value);
23
+ mUpdateContext.callID = callID;
24
+ forceUpdateMemoizedValue(value);
25
+ }
26
+
27
+ public void beginContext(Integer ref, String prevCallID) {
28
+ mPrevCallID = prevCallID;
29
+ mArgsStack.push(ref);
30
+ }
31
+
32
+ public void endContext() {
33
+ mArgsStack.pop();
34
+ }
35
+
36
+ @Override
37
+ protected Object evaluate() {
38
+ String callID = mUpdateContext.callID;
39
+ mUpdateContext.callID = mPrevCallID;
40
+ Node node = mNodesManager.findNodeById(mArgsStack.peek(), Node.class);
41
+ Object val = node.value();
42
+ mUpdateContext.callID = callID;
43
+ return val;
44
+ }
45
+
46
+ public void start() {
47
+ Node node = mNodesManager.findNodeById(mArgsStack.peek(), Node.class);
48
+ if (node instanceof ParamNode) {
49
+ ((ParamNode) node).start();
50
+ } else {
51
+ ((ClockNode) node).start();
52
+ }
53
+ }
54
+
55
+ public void stop() {
56
+ Node node = mNodesManager.findNodeById(mArgsStack.peek(), Node.class);
57
+ if (node instanceof ParamNode) {
58
+ ((ParamNode) node).stop();
59
+ } else {
60
+ ((ClockNode) node).stop();
61
+ }
62
+ }
63
+
64
+ public boolean isRunning() {
65
+ Node node = mNodesManager.findNodeById(mArgsStack.peek(), Node.class);
66
+ if (node instanceof ParamNode) {
67
+ return ((ParamNode) node).isRunning();
68
+ }
69
+ return ((ClockNode) node).isRunning;
70
+ }
71
+ }
@@ -0,0 +1,153 @@
1
+ package com.swmansion.reanimated.nodes;
2
+
3
+ import android.view.View;
4
+ import com.facebook.react.bridge.Arguments;
5
+ import com.facebook.react.bridge.JavaOnlyMap;
6
+ import com.facebook.react.bridge.ReadableMap;
7
+ import com.facebook.react.bridge.ReadableMapKeySetIterator;
8
+ import com.facebook.react.bridge.ReadableType;
9
+ import com.facebook.react.bridge.WritableArray;
10
+ import com.facebook.react.bridge.WritableMap;
11
+ import com.facebook.react.uimanager.ReactStylesDiffMap;
12
+ import com.facebook.react.uimanager.UIImplementation;
13
+ import com.swmansion.reanimated.NodesManager;
14
+ import com.swmansion.reanimated.Utils;
15
+ import java.util.Map;
16
+
17
+ public class PropsNode extends Node implements FinalNode {
18
+
19
+ private final Map<String, Integer> mMapping;
20
+ private final UIImplementation mUIImplementation;
21
+ private int mConnectedViewTag = View.NO_ID;
22
+
23
+ private final JavaOnlyMap mPropMap;
24
+ private final ReactStylesDiffMap mDiffMap;
25
+
26
+ private static void addProp(WritableMap propMap, String key, Object value) {
27
+ if (value == null) {
28
+ propMap.putNull(key);
29
+ } else if (value instanceof Double) {
30
+ propMap.putDouble(key, (Double) value);
31
+ } else if (value instanceof Integer) {
32
+ propMap.putInt(key, (Integer) value);
33
+ } else if (value instanceof Number) {
34
+ propMap.putDouble(key, ((Number) value).doubleValue());
35
+ } else if (value instanceof Boolean) {
36
+ propMap.putBoolean(key, (Boolean) value);
37
+ } else if (value instanceof String) {
38
+ propMap.putString(key, (String) value);
39
+ } else if (value instanceof WritableArray) {
40
+ propMap.putArray(key, (WritableArray) value);
41
+ } else if (value instanceof WritableMap) {
42
+ propMap.putMap(key, (WritableMap) value);
43
+ } else {
44
+ throw new IllegalStateException("Unknown type of animated value");
45
+ }
46
+ }
47
+
48
+ public PropsNode(
49
+ int nodeID,
50
+ ReadableMap config,
51
+ NodesManager nodesManager,
52
+ UIImplementation uiImplementation) {
53
+ super(nodeID, config, nodesManager);
54
+ mMapping = Utils.processMapping(config.getMap("props"));
55
+ mUIImplementation = uiImplementation;
56
+ mPropMap = new JavaOnlyMap();
57
+ mDiffMap = new ReactStylesDiffMap(mPropMap);
58
+ }
59
+
60
+ public void connectToView(int viewTag) {
61
+ mConnectedViewTag = viewTag;
62
+ dangerouslyRescheduleEvaluate();
63
+ }
64
+
65
+ public void disconnectFromView(int viewTag) {
66
+ mConnectedViewTag = View.NO_ID;
67
+ }
68
+
69
+ @Override
70
+ protected Double evaluate() {
71
+ boolean hasUIProps = false;
72
+ boolean hasNativeProps = false;
73
+ boolean hasJSProps = false;
74
+ WritableMap jsProps = Arguments.createMap();
75
+ final WritableMap nativeProps = Arguments.createMap();
76
+
77
+ for (Map.Entry<String, Integer> entry : mMapping.entrySet()) {
78
+ Node node = mNodesManager.findNodeById(entry.getValue(), Node.class);
79
+ if (node instanceof StyleNode) {
80
+ WritableMap style = (WritableMap) node.value();
81
+ ReadableMapKeySetIterator iter = style.keySetIterator();
82
+ while (iter.hasNextKey()) {
83
+ String key = iter.nextKey();
84
+ WritableMap dest;
85
+ if (mNodesManager.uiProps.contains(key)) {
86
+ hasUIProps = true;
87
+ dest = mPropMap;
88
+ } else if (mNodesManager.nativeProps.contains(key)) {
89
+ hasNativeProps = true;
90
+ dest = nativeProps;
91
+ } else {
92
+ hasJSProps = true;
93
+ dest = jsProps;
94
+ }
95
+ ReadableType type = style.getType(key);
96
+ switch (type) {
97
+ case Number:
98
+ dest.putDouble(key, style.getDouble(key));
99
+ break;
100
+ case String:
101
+ dest.putString(key, style.getString(key));
102
+ break;
103
+ case Array:
104
+ dest.putArray(key, (WritableArray) style.getArray(key));
105
+ break;
106
+ default:
107
+ throw new IllegalArgumentException("Unexpected type " + type);
108
+ }
109
+ }
110
+ } else {
111
+ String key = entry.getKey();
112
+ Object value = node.value();
113
+ if (mNodesManager.uiProps.contains(key)) {
114
+ hasUIProps = true;
115
+ addProp(mPropMap, key, value);
116
+ } else {
117
+ hasNativeProps = true;
118
+ addProp(nativeProps, key, value);
119
+ }
120
+ }
121
+ }
122
+
123
+ if (mConnectedViewTag != View.NO_ID) {
124
+ if (hasUIProps) {
125
+ mUIImplementation.synchronouslyUpdateViewOnUIThread(mConnectedViewTag, mDiffMap);
126
+ }
127
+ if (hasNativeProps) {
128
+ mNodesManager.enqueueUpdateViewOnNativeThread(mConnectedViewTag, nativeProps, false);
129
+ }
130
+ if (hasJSProps) {
131
+ WritableMap evt = Arguments.createMap();
132
+ evt.putInt("viewTag", mConnectedViewTag);
133
+ evt.putMap("props", jsProps);
134
+ mNodesManager.sendEvent("onReanimatedPropsChange", evt);
135
+ }
136
+ }
137
+
138
+ return ZERO;
139
+ }
140
+
141
+ @Override
142
+ public void update() {
143
+ // Since we are updating nodes after detaching them from views there is a time where it's
144
+ // possible that the view was disconnected and still receive an update, this is normal and
145
+ // we can simply skip that update.
146
+ if (mConnectedViewTag == View.NO_ID) {
147
+ return;
148
+ }
149
+
150
+ // call value for side effect (diff map update via changes made to prop map)
151
+ value();
152
+ }
153
+ }
@@ -0,0 +1,32 @@
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 SetNode extends Node {
8
+
9
+ private int mWhatNodeID, mValueNodeID;
10
+
11
+ public SetNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
12
+ super(nodeID, config, nodesManager);
13
+ mWhatNodeID =
14
+ MapUtils.getInt(
15
+ config,
16
+ "what",
17
+ "Reanimated: First argument passed to set node is either of wrong type or is missing.");
18
+ mValueNodeID =
19
+ MapUtils.getInt(
20
+ config,
21
+ "value",
22
+ "Reanimated: Second argument passed to set node is either of wrong type or is missing.");
23
+ }
24
+
25
+ @Override
26
+ protected Object evaluate() {
27
+ Object newValue = mNodesManager.getNodeValue(mValueNodeID);
28
+ ValueNode what = mNodesManager.findNodeById(mWhatNodeID, ValueNode.class);
29
+ what.setValue(newValue);
30
+ return newValue;
31
+ }
32
+ }
@@ -0,0 +1,40 @@
1
+ package com.swmansion.reanimated.nodes;
2
+
3
+ import com.facebook.react.bridge.JavaOnlyMap;
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
+ import java.util.Map;
10
+
11
+ public class StyleNode extends Node {
12
+
13
+ private final Map<String, Integer> mMapping;
14
+
15
+ public StyleNode(int nodeID, ReadableMap config, NodesManager nodesManager) {
16
+ super(nodeID, config, nodesManager);
17
+ mMapping = Utils.processMapping(config.getMap("style"));
18
+ }
19
+
20
+ @Override
21
+ protected WritableMap evaluate() {
22
+ JavaOnlyMap propMap = new JavaOnlyMap();
23
+ for (Map.Entry<String, Integer> entry : mMapping.entrySet()) {
24
+ Node node = mNodesManager.findNodeById(entry.getValue(), Node.class);
25
+ if (node instanceof TransformNode) {
26
+ propMap.putArray(entry.getKey(), (WritableArray) node.value());
27
+ } else {
28
+ Object val = node.value();
29
+ if (val instanceof Double) {
30
+ propMap.putDouble(entry.getKey(), (Double) val);
31
+ } else if (val instanceof String) {
32
+ propMap.putString(entry.getKey(), (String) val);
33
+ } else {
34
+ throw new IllegalStateException("Wrong style form");
35
+ }
36
+ }
37
+ }
38
+ return propMap;
39
+ }
40
+ }