From cc3f9a753801c11cc6582b5152fc1c5079025aa8 Mon Sep 17 00:00:00 2001 From: Max Komarychev Date: Mon, 18 Mar 2019 07:22:55 -0700 Subject: [PATCH] Fix native implementation of `Animated.modulo` (#23973) Summary: fixes #23875 [ios,android][fixes] incorrect behavior of `Animated.modulo` Use the same formula as used in js: `mod(a,m)=>(a % m + m) % m` (https://github.com/facebook/react-native/blob/master/Libraries/Animated/src/nodes/AnimatedModulo.js#L35) Native implementation of `Animated.modulo` was different from what was used in javascript, more details available here: https://github.com/facebook/react-native/issues/23875 [iOS] [Fixed] incorrect behavior of Animated.modulo [Android] [Fixed] incorrect behavior of Animated.modulo Pull Request resolved: https://github.com/facebook/react-native/pull/23973 Differential Revision: D14502697 Pulled By: cpojer fbshipit-source-id: befef2b99ae758f98459caaadc8ebdbbd547e69a --- Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m | 3 ++- .../java/com/facebook/react/animated/ModulusAnimatedNode.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m index e9b6f13b2a4..e75391c6dc0 100644 --- a/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m @@ -15,7 +15,8 @@ NSNumber *inputNode = self.config[@"input"]; NSNumber *modulus = self.config[@"modulus"]; RCTValueAnimatedNode *parent = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNode]; - self.value = fmodf(parent.value, modulus.floatValue); + const float m = modulus.floatValue; + self.value = fmodf(fmodf(parent.value, m) + m, m); } @end diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/ModulusAnimatedNode.java b/ReactAndroid/src/main/java/com/facebook/react/animated/ModulusAnimatedNode.java index 6d90a827294..e1e7be68535 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/ModulusAnimatedNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/ModulusAnimatedNode.java @@ -29,7 +29,8 @@ import com.facebook.react.bridge.ReadableMap; public void update() { AnimatedNode animatedNode = mNativeAnimatedNodesManager.getNodeById(mInputNode); if (animatedNode != null && animatedNode instanceof ValueAnimatedNode) { - mValue = ((ValueAnimatedNode) animatedNode).getValue() % mModulus; + final double value = ((ValueAnimatedNode) animatedNode).getValue(); + mValue = (value % mModulus + mModulus) % mModulus; } else { throw new JSApplicationCausedNativeException("Illegal node ID set as an input for " + "Animated.modulus node");