diff --git a/Libraries/LayoutAnimation/LayoutAnimation.js b/Libraries/LayoutAnimation/LayoutAnimation.js index 0b84dd5fe1c..ef92d99cec6 100644 --- a/Libraries/LayoutAnimation/LayoutAnimation.js +++ b/Libraries/LayoutAnimation/LayoutAnimation.js @@ -47,9 +47,7 @@ function configureNext( UIManager.configureNextLayoutAnimation( config, onAnimationDidEnd ?? function() {}, - function() { - /* unused */ - }, + function() {} /* unused onError */, ); } } diff --git a/RNTester/js/LayoutAnimationExample.js b/RNTester/js/LayoutAnimationExample.js index 184c3d5b29c..fb8aac62264 100644 --- a/RNTester/js/LayoutAnimationExample.js +++ b/RNTester/js/LayoutAnimationExample.js @@ -20,7 +20,9 @@ class AddRemoveExample extends React.Component<{}, $FlowFixMeState> { }; UNSAFE_componentWillUpdate() { - LayoutAnimation.easeInEaseOut(); + LayoutAnimation.easeInEaseOut(args => + console.log('AddRemoveExample completed', args), + ); } _onPressAddView = () => { @@ -73,7 +75,9 @@ class CrossFadeExample extends React.Component<{}, $FlowFixMeState> { }; _onPressToggle = () => { - LayoutAnimation.easeInEaseOut(); + LayoutAnimation.easeInEaseOut(args => + console.log('CrossFadeExample completed', args), + ); this.setState(state => ({toggled: !state.toggled})); }; @@ -116,12 +120,15 @@ class LayoutUpdateExample extends React.Component<{}, $FlowFixMeState> { this._clearTimeout(); this.setState({width: 150}); - LayoutAnimation.configureNext({ - duration: 1000, - update: { - type: LayoutAnimation.Types.linear, + LayoutAnimation.configureNext( + { + duration: 1000, + update: { + type: LayoutAnimation.Types.linear, + }, }, - }); + args => console.log('LayoutUpdateExample completed', args), + ); this.timeout = setTimeout(() => this.setState({width: 100}), 500); }; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java index 8cabf9ad6ef..f5953bacdc4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java @@ -729,8 +729,8 @@ public class NativeViewHierarchyManager { mJSResponderHandler.clearJSResponder(); } - void configureLayoutAnimation(final ReadableMap config) { - mLayoutAnimator.initializeFromConfig(config); + void configureLayoutAnimation(final ReadableMap config, final Callback onAnimationComplete) { + mLayoutAnimator.initializeFromConfig(config, onAnimationComplete); } void clearLayoutAnimation() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index 24512031ff3..dfa310b76d4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -720,11 +720,8 @@ public class UIImplementation { * interrupted. In this case, callback parameter will be false. * @param error will be called if there was an error processing the animation */ - public void configureNextLayoutAnimation( - ReadableMap config, - Callback success, - Callback error) { - mOperationsQueue.enqueueConfigureLayoutAnimation(config, success, error); + public void configureNextLayoutAnimation(ReadableMap config, Callback success) { + mOperationsQueue.enqueueConfigureLayoutAnimation(config, success); } public void setJSResponder(int reactTag, boolean blockNativeResponder) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index ec94a1abec6..51a229f73ae 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -709,8 +709,7 @@ public class UIManagerModule extends ReactContextBaseJavaModule * Configure an animation to be used for the native layout changes, and native views creation. The * animation will only apply during the current batch operations. * - *
TODO(7728153) : animating view deletion is currently not supported. TODO(7613721) : - * callbacks are not supported, this feature will likely be killed. + *
TODO(7728153) : animating view deletion is currently not supported.
*
* @param config the configuration of the animation for view addition/removal/update.
* @param success will be called when the animation completes, or when the animation get
@@ -719,7 +718,7 @@ public class UIManagerModule extends ReactContextBaseJavaModule
*/
@ReactMethod
public void configureNextLayoutAnimation(ReadableMap config, Callback success, Callback error) {
- mUIImplementation.configureNextLayoutAnimation(config, success, error);
+ mUIImplementation.configureNextLayoutAnimation(config, success);
}
/**
diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java
index cf366322ef7..cf66d2a5c50 100644
--- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java
+++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java
@@ -369,14 +369,16 @@ public class UIViewOperationQueue {
private class ConfigureLayoutAnimationOperation implements UIOperation {
private final ReadableMap mConfig;
+ private final Callback mAnimationComplete;
- private ConfigureLayoutAnimationOperation(final ReadableMap config) {
+ private ConfigureLayoutAnimationOperation(final ReadableMap config, final Callback animationComplete) {
mConfig = config;
+ mAnimationComplete = animationComplete;
}
@Override
public void execute() {
- mNativeViewHierarchyManager.configureLayoutAnimation(mConfig);
+ mNativeViewHierarchyManager.configureLayoutAnimation(mConfig, mAnimationComplete);
}
}
@@ -741,9 +743,8 @@ public class UIViewOperationQueue {
public void enqueueConfigureLayoutAnimation(
final ReadableMap config,
- final Callback onSuccess,
- final Callback onError) {
- mOperations.add(new ConfigureLayoutAnimationOperation(config));
+ final Callback onAnimationComplete) {
+ mOperations.add(new ConfigureLayoutAnimationOperation(config, onAnimationComplete));
}
public void enqueueMeasure(
diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutAnimationController.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutAnimationController.java
index 2f08da20eca..232cb01f907 100644
--- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutAnimationController.java
+++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutAnimationController.java
@@ -8,11 +8,14 @@ package com.facebook.react.uimanager.layoutanimation;
import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe;
+import android.os.Handler;
+import android.os.Looper;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
+import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.UiThreadUtil;
@@ -20,25 +23,22 @@ import com.facebook.react.bridge.UiThreadUtil;
* Class responsible for animation layout changes, if a valid layout animation config has been
* supplied. If not animation is available, layout change is applied immediately instead of
* performing an animation.
- *
- * TODO(7613721): Invoke success callback at the end of animation and when animation gets cancelled.
*/
@NotThreadSafe
public class LayoutAnimationController {
- private static final boolean ENABLED = true;
-
private final AbstractLayoutAnimation mLayoutCreateAnimation = new LayoutCreateAnimation();
private final AbstractLayoutAnimation mLayoutUpdateAnimation = new LayoutUpdateAnimation();
private final AbstractLayoutAnimation mLayoutDeleteAnimation = new LayoutDeleteAnimation();
private final SparseArray