diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp index 6f8f9e167a43..cc689308bd79 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp +++ b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.cpp @@ -54,7 +54,6 @@ ReanimatedModuleProxy::ReanimatedModuleProxy( const std::shared_ptr &workletsModuleProxy, jsi::Runtime &rnRuntime, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &uiScheduler, const PlatformDepMethodsHolder &platformDepMethodsHolder, const bool isBridgeless, const bool isReducedMotion) @@ -62,7 +61,6 @@ ReanimatedModuleProxy::ReanimatedModuleProxy( isBridgeless_(isBridgeless), isReducedMotion_(isReducedMotion), workletsModuleProxy_(workletsModuleProxy), - uiScheduler_(uiScheduler), valueUnpackerCode_(workletsModuleProxy->getValueUnpackerCode()), uiWorkletRuntime_(std::make_shared( rnRuntime, @@ -207,7 +205,7 @@ void ReanimatedModuleProxy::scheduleOnUI( const jsi::Value &worklet) { auto shareableWorklet = extractShareableOrThrow( rt, worklet, "[Reanimated] Only worklets can be scheduled to run on UI."); - uiScheduler_->scheduleOnUI(COPY_CAPTURE_WITH_THIS { + workletsModuleProxy_->getUIScheduler()->scheduleOnUI(COPY_CAPTURE_WITH_THIS { #if JS_RUNTIME_HERMES // JSI's scope defined here allows for JSI-objects to be cleared up // after each runtime loop. Within these loops we typically create some @@ -264,7 +262,7 @@ jsi::Value ReanimatedModuleProxy::registerEventHandler( rt, worklet, "[Reanimated] Event handler must be a worklet."); int emitterReactTagInt = emitterReactTag.asNumber(); - uiScheduler_->scheduleOnUI(COPY_CAPTURE_WITH_THIS { + workletsModuleProxy_->getUIScheduler()->scheduleOnUI(COPY_CAPTURE_WITH_THIS { auto handler = std::make_shared( newRegistrationId, eventNameStr, emitterReactTagInt, handlerShareable); eventHandlerRegistry_->registerEventHandler(std::move(handler)); @@ -277,7 +275,7 @@ void ReanimatedModuleProxy::unregisterEventHandler( jsi::Runtime &, const jsi::Value ®istrationId) { uint64_t id = registrationId.asNumber(); - uiScheduler_->scheduleOnUI( + workletsModuleProxy_->getUIScheduler()->scheduleOnUI( COPY_CAPTURE_WITH_THIS { eventHandlerRegistry_->unregisterEventHandler(id); }); @@ -349,7 +347,7 @@ jsi::Value ReanimatedModuleProxy::getViewProp( const auto funPtr = std::make_shared( callback.getObject(rnRuntime).asFunction(rnRuntime)); const auto shadowNode = shadowNodeFromValue(rnRuntime, shadowNodeWrapper); - uiScheduler_->scheduleOnUI(COPY_CAPTURE_WITH_THIS { + workletsModuleProxy_->getUIScheduler()->scheduleOnUI(COPY_CAPTURE_WITH_THIS { jsi::Runtime &uiRuntime = uiWorkletRuntime_->getJSIRuntime(); const auto resultStr = obtainPropFromShadowNode(uiRuntime, propNameStr, shadowNode); @@ -377,7 +375,7 @@ jsi::Value ReanimatedModuleProxy::getViewProp( const int viewTagInt = viewTag.asNumber(); - uiScheduler_->scheduleOnUI( + workletsModuleProxy_->getUIScheduler()->scheduleOnUI( COPY_CAPTURE_WITH_THIS () { @@ -859,7 +857,7 @@ void ReanimatedModuleProxy::initializeLayoutAnimationsProxy() { componentDescriptorRegistry, scheduler->getContextContainer(), uiWorkletRuntime_->getJSIRuntime(), - uiScheduler_); + workletsModuleProxy_->getUIScheduler()); } } diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h index deb822895ecb..6e71a2e5654f 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h +++ b/packages/react-native-reanimated/Common/cpp/reanimated/NativeModules/ReanimatedModuleProxy.h @@ -36,7 +36,6 @@ class ReanimatedModuleProxy : public ReanimatedModuleProxySpec { const std::shared_ptr &workletsModuleProxy, jsi::Runtime &rnRuntime, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &uiScheduler, const PlatformDepMethodsHolder &platformDepMethodsHolder, const bool isBridgeless, const bool isReducedMotion); @@ -194,7 +193,6 @@ class ReanimatedModuleProxy : public ReanimatedModuleProxySpec { const bool isBridgeless_; const bool isReducedMotion_; const std::shared_ptr workletsModuleProxy_; - const std::shared_ptr uiScheduler_; const std::string valueUnpackerCode_; std::shared_ptr uiWorkletRuntime_; diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp index 15ef857155ee..e71837b11999 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp +++ b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp @@ -22,11 +22,13 @@ WorkletsModuleProxy::WorkletsModuleProxy( const std::string &valueUnpackerCode, const std::shared_ptr &jsQueue, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &jsScheduler) + const std::shared_ptr &jsScheduler, + const std::shared_ptr &uiScheduler) : WorkletsModuleProxySpec(jsCallInvoker), valueUnpackerCode_(valueUnpackerCode), jsQueue_(jsQueue), - jsScheduler_(jsScheduler) {} + jsScheduler_(jsScheduler), + uiScheduler_(uiScheduler) {} WorkletsModuleProxy::~WorkletsModuleProxy() {} diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h index 2ee6b63439cb..dc7cee4cf27a 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h +++ b/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -16,7 +17,8 @@ class WorkletsModuleProxy : public WorkletsModuleProxySpec { const std::string &valueUnpackerCode, const std::shared_ptr &jsQueue, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &jsScheduler); + const std::shared_ptr &jsScheduler, + const std::shared_ptr &uiScheduler); ~WorkletsModuleProxy(); @@ -38,10 +40,15 @@ class WorkletsModuleProxy : public WorkletsModuleProxySpec { return jsScheduler_; } + [[nodiscard]] inline std::shared_ptr getUIScheduler() const { + return uiScheduler_; + } + private: const std::string valueUnpackerCode_; const std::shared_ptr jsQueue_; const std::shared_ptr jsScheduler_; + const std::shared_ptr uiScheduler_; #ifndef NDEBUG SingleInstanceChecker singleInstanceChecker_; #endif // NDEBUG diff --git a/packages/react-native-reanimated/android/src/fabric/java/com/swmansion/reanimated/NativeProxy.java b/packages/react-native-reanimated/android/src/fabric/java/com/swmansion/reanimated/NativeProxy.java index 228b95759fac..1701b938ca4e 100644 --- a/packages/react-native-reanimated/android/src/fabric/java/com/swmansion/reanimated/NativeProxy.java +++ b/packages/react-native-reanimated/android/src/fabric/java/com/swmansion/reanimated/NativeProxy.java @@ -41,7 +41,6 @@ public class NativeProxy extends NativeProxyCommon { workletsModule, Objects.requireNonNull(context.getJavaScriptContextHolder()).get(), callInvokerHolder, - mAndroidUIScheduler, LayoutAnimations, context.isBridgeless(), fabricUIManager); @@ -58,7 +57,6 @@ private native HybridData initHybrid( WorkletsModule workletsModule, long jsContext, CallInvokerHolderImpl jsCallInvokerHolder, - AndroidUIScheduler androidUIScheduler, LayoutAnimations LayoutAnimations, boolean isBridgeless, FabricUIManager fabricUIManager); diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp index e9bd16820d69..8b9c47533207 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include @@ -9,6 +8,7 @@ #include #include #include +#include #include #include @@ -31,7 +31,6 @@ NativeProxy::NativeProxy( const std::shared_ptr &workletsModuleProxy, jsi::Runtime *rnRuntime, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &uiScheduler, jni::global_ref layoutAnimations, const bool isBridgeless #ifdef RCT_NEW_ARCH_ENABLED @@ -46,7 +45,6 @@ NativeProxy::NativeProxy( workletsModuleProxy, *rnRuntime, jsCallInvoker, - uiScheduler, getPlatformDependentMethods(), isBridgeless, getIsReducedMotion())), @@ -91,7 +89,6 @@ jni::local_ref NativeProxy::initHybrid( jlong jsContext, jni::alias_ref jsCallInvokerHolder, - jni::alias_ref androidUiScheduler, jni::alias_ref layoutAnimations, bool isBridgeless #ifdef RCT_NEW_ARCH_ENABLED @@ -101,14 +98,12 @@ jni::local_ref NativeProxy::initHybrid( #endif ) { auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); - auto uiScheduler = androidUiScheduler->cthis()->getUIScheduler(); auto workletsModuleProxy = jWorkletsModule->cthis()->getWorkletsModuleProxy(); return makeCxxInstance( jThis, workletsModuleProxy, (jsi::Runtime *)jsContext, jsCallInvoker, - uiScheduler, make_global(layoutAnimations), isBridgeless #ifdef RCT_NEW_ARCH_ENABLED diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h index 9082b2e648c9..318e3acf7a78 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h +++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.h @@ -1,11 +1,9 @@ #pragma once #include -#include #include #include -#include #include #include @@ -153,7 +151,6 @@ class NativeProxy : public jni::HybridClass { jlong jsContext, jni::alias_ref jsCallInvokerHolder, - jni::alias_ref androidUiScheduler, jni::alias_ref layoutAnimations, const bool isBridgeless #ifdef RCT_NEW_ARCH_ENABLED @@ -268,7 +265,6 @@ class NativeProxy : public jni::HybridClass { const std::shared_ptr &workletsModuleProxy, jsi::Runtime *rnRuntime, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &uiScheduler, jni::global_ref layoutAnimations, const bool isBridgeless #ifdef RCT_NEW_ARCH_ENABLED diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/OnLoad.cpp b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/OnLoad.cpp index c1d1b783582e..590d598f73b8 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/OnLoad.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/OnLoad.cpp @@ -1,6 +1,5 @@ #include -#include #include #include @@ -9,7 +8,6 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { reanimated::NativeProxy::registerNatives(); reanimated::AnimationFrameCallback::registerNatives(); reanimated::EventHandler::registerNatives(); - reanimated::AndroidUIScheduler::registerNatives(); reanimated::LayoutAnimations::registerNatives(); reanimated::SensorSetter::registerNatives(); reanimated::KeyboardWorkletWrapper::registerNatives(); diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/AndroidUIScheduler.cpp b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.cpp similarity index 93% rename from packages/react-native-reanimated/android/src/main/cpp/reanimated/android/AndroidUIScheduler.cpp rename to packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.cpp index 039028d8f9a0..595c09f7e705 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/AndroidUIScheduler.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.cpp @@ -1,10 +1,10 @@ -#include +#include #include #include #include -namespace reanimated { +namespace worklets { using namespace facebook; using namespace react; @@ -57,4 +57,4 @@ void AndroidUIScheduler::registerNatives() { }); } -} // namespace reanimated +} // namespace worklets diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/AndroidUIScheduler.h b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.h similarity index 89% rename from packages/react-native-reanimated/android/src/main/cpp/reanimated/android/AndroidUIScheduler.h rename to packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.h index e9e7c940dc8b..c38b0ac5a96d 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/AndroidUIScheduler.h +++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.h @@ -10,7 +10,7 @@ #include -namespace reanimated { +namespace worklets { using namespace facebook; using namespace worklets; @@ -18,7 +18,7 @@ using namespace worklets; class AndroidUIScheduler : public jni::HybridClass { public: static auto constexpr kJavaDescriptor = - "Lcom/swmansion/reanimated/AndroidUIScheduler;"; + "Lcom/swmansion/worklets/AndroidUIScheduler;"; static jni::local_ref initHybrid( jni::alias_ref jThis); static void registerNatives(); @@ -41,4 +41,4 @@ class AndroidUIScheduler : public jni::HybridClass { jni::alias_ref jThis); }; -} // namespace reanimated +} // namespace worklets diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp index a96ac90dc2d4..ac8b1c34519a 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp @@ -23,14 +23,16 @@ WorkletsModule::WorkletsModule( const std::string &valueUnpackerCode, jni::alias_ref messageQueueThread, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &jsScheduler) + const std::shared_ptr &jsScheduler, + const std::shared_ptr &uiScheduler) : javaPart_(jni::make_global(jThis)), rnRuntime_(rnRuntime), workletsModuleProxy_(std::make_shared( valueUnpackerCode, std::make_shared(messageQueueThread), jsCallInvoker, - jsScheduler)) { + jsScheduler, + uiScheduler)) { RNRuntimeWorkletDecorator::decorate(*rnRuntime_, workletsModuleProxy_); } @@ -40,18 +42,22 @@ jni::local_ref WorkletsModule::initHybrid( const std::string &valueUnpackerCode, jni::alias_ref messageQueueThread, jni::alias_ref - jsCallInvokerHolder) { + jsCallInvokerHolder, + jni::alias_ref + androidUIScheduler) { auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker(); auto rnRuntime = reinterpret_cast(jsContext); auto jsScheduler = std::make_shared(*rnRuntime, jsCallInvoker); + auto uiScheduler = androidUIScheduler->cthis()->getUIScheduler(); return makeCxxInstance( jThis, rnRuntime, valueUnpackerCode, messageQueueThread, jsCallInvoker, - jsScheduler); + jsScheduler, + uiScheduler); } void WorkletsModule::registerNatives() { diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.h b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.h index 6bf238077645..094287271fca 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.h +++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -34,7 +35,9 @@ class WorkletsModule : public jni::HybridClass { const std::string &valueUnpackerCode, jni::alias_ref messageQueueThread, jni::alias_ref - jsCallInvokerHolder); + jsCallInvokerHolder, + jni::alias_ref + androidUIScheduler); static void registerNatives(); @@ -54,7 +57,8 @@ class WorkletsModule : public jni::HybridClass { const std::string &valueUnpackerCode, jni::alias_ref messageQueueThread, const std::shared_ptr &jsCallInvoker, - const std::shared_ptr &jsScheduler); + const std::shared_ptr &jsScheduler, + const std::shared_ptr &uiScheduler); }; } // namespace worklets diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp index 3c35b26e36a7..9d441273714a 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp @@ -1,8 +1,11 @@ #include +#include #include JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { - return facebook::jni::initialize( - vm, [] { worklets::WorkletsModule::registerNatives(); }); + return facebook::jni::initialize(vm, [] { + worklets::WorkletsModule::registerNatives(); + worklets::AndroidUIScheduler::registerNatives(); + }); } diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java index 9ca28144b94f..58cdc88924d7 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java +++ b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NodesManager.java @@ -128,14 +128,13 @@ public void invalidate() { } if (mNativeProxy != null) { - mNativeProxy.invalidate(); mNativeProxy = null; } } public void initWithContext(ReactApplicationContext reactApplicationContext) { mNativeProxy = new NativeProxy(reactApplicationContext, mWorkletsModule); - mAnimationManager.setAndroidUIScheduler(getNativeProxy().getAndroidUIScheduler()); + mAnimationManager.setAndroidUIScheduler(mWorkletsModule.getAndroidUIScheduler()); compatibility = new ReaCompatibility(reactApplicationContext); compatibility.registerFabricEventListener(this); } diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/layoutReanimation/AnimationsManager.java b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/layoutReanimation/AnimationsManager.java index 15afbede9355..07e4ebaeedb7 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/layoutReanimation/AnimationsManager.java +++ b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/layoutReanimation/AnimationsManager.java @@ -22,8 +22,8 @@ import com.facebook.react.uimanager.ReactStylesDiffMap; import com.facebook.react.uimanager.RootView; import com.facebook.react.uimanager.ViewManager; -import com.swmansion.reanimated.AndroidUIScheduler; import com.swmansion.reanimated.Utils; +import com.swmansion.worklets.AndroidUIScheduler; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java index 741e096f6e0b..3b291a92d0ca 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java +++ b/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/nativeProxy/NativeProxyCommon.java @@ -13,7 +13,6 @@ import com.facebook.react.bridge.ReadableNativeArray; import com.facebook.soloader.SoLoader; import com.swmansion.common.GestureHandlerStateManager; -import com.swmansion.reanimated.AndroidUIScheduler; import com.swmansion.reanimated.BuildConfig; import com.swmansion.reanimated.DevMenuUtils; import com.swmansion.reanimated.NativeProxy; @@ -34,6 +33,9 @@ import java.util.Objects; import java.util.Set; +/** + * @noinspection JavaJniMissingFunction + */ public abstract class NativeProxyCommon { static { SoLoader.loadLibrary("reanimated"); @@ -42,7 +44,6 @@ public abstract class NativeProxyCommon { protected final WorkletsModule mWorkletsModule; protected NodesManager mNodesManager; protected final WeakReference mContext; - protected final AndroidUIScheduler mAndroidUIScheduler; private final ReanimatedSensorContainer reanimatedSensorContainer; private final GestureHandlerStateManager gestureHandlerStateManager; private final KeyboardAnimationManager keyboardAnimationManager; @@ -54,7 +55,6 @@ public abstract class NativeProxyCommon { protected NativeProxyCommon(ReactApplicationContext context) { mWorkletsModule = Objects.requireNonNull(context.getNativeModule(ReanimatedModule.class)).getWorkletsModule(); - mAndroidUIScheduler = new AndroidUIScheduler(context); mContext = new WeakReference<>(context); reanimatedSensorContainer = new ReanimatedSensorContainer(mContext); keyboardAnimationManager = new KeyboardAnimationManager(mContext); @@ -75,10 +75,6 @@ protected NativeProxyCommon(ReactApplicationContext context) { protected native void installJSIBindings(); - public AndroidUIScheduler getAndroidUIScheduler() { - return mAndroidUIScheduler; - } - private void toggleSlowAnimations() { slowAnimationsEnabled = !slowAnimationsEnabled; if (slowAnimationsEnabled) { @@ -224,10 +220,6 @@ public void unsubscribeFromKeyboardEvents(int listenerId) { protected abstract HybridData getHybridData(); - public void invalidate() { - mAndroidUIScheduler.deactivate(); - } - public void prepareLayoutAnimations(LayoutAnimations layoutAnimations) { if (Utils.isChromeDebugger) { Log.w("[REANIMATED]", "You can not use LayoutAnimation with enabled Chrome Debugger"); diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/AndroidUIScheduler.java b/packages/react-native-reanimated/android/src/main/java/com/swmansion/worklets/AndroidUIScheduler.java similarity index 97% rename from packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/AndroidUIScheduler.java rename to packages/react-native-reanimated/android/src/main/java/com/swmansion/worklets/AndroidUIScheduler.java index 126c270a4cdc..7a8c4f63201d 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/AndroidUIScheduler.java +++ b/packages/react-native-reanimated/android/src/main/java/com/swmansion/worklets/AndroidUIScheduler.java @@ -1,4 +1,4 @@ -package com.swmansion.reanimated; +package com.swmansion.worklets; import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/worklets/WorkletsModule.java b/packages/react-native-reanimated/android/src/main/java/com/swmansion/worklets/WorkletsModule.java index ac5f918e9b44..35cf7d078290 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/worklets/WorkletsModule.java +++ b/packages/react-native-reanimated/android/src/main/java/com/swmansion/worklets/WorkletsModule.java @@ -13,7 +13,9 @@ import com.swmansion.reanimated.NativeWorkletsModuleSpec; import java.util.Objects; -/* * @noinspection JavaJniMissingFunction */ +/** + * @noinspection JavaJniMissingFunction + */ @ReactModule(name = WorkletsModule.NAME) public class WorkletsModule extends NativeWorkletsModuleSpec { static { @@ -30,16 +32,23 @@ protected HybridData getHybridData() { } private final WorkletsMessageQueueThread mMessageQueueThread = new WorkletsMessageQueueThread(); + private final AndroidUIScheduler mAndroidUIScheduler; + + public AndroidUIScheduler getAndroidUIScheduler() { + return mAndroidUIScheduler; + } @OptIn(markerClass = FrameworkAPI.class) private native HybridData initHybrid( long jsContext, String valueUnpackerCode, MessageQueueThread messageQueueThread, - CallInvokerHolderImpl jsCallInvokerHolder); + CallInvokerHolderImpl jsCallInvokerHolder, + AndroidUIScheduler androidUIScheduler); public WorkletsModule(ReactApplicationContext reactContext) { super(reactContext); + mAndroidUIScheduler = new AndroidUIScheduler(reactContext); } @OptIn(markerClass = FrameworkAPI.class) @@ -50,7 +59,16 @@ public boolean installTurboModule(String valueUnpackerCode) { var jsCallInvokerHolder = JSCallInvokerResolver.getJSCallInvokerHolder(context); mHybridData = - initHybrid(jsContext, valueUnpackerCode, mMessageQueueThread, jsCallInvokerHolder); + initHybrid( + jsContext, + valueUnpackerCode, + mMessageQueueThread, + jsCallInvokerHolder, + mAndroidUIScheduler); return true; } + + public void invalidate() { + mAndroidUIScheduler.deactivate(); + } } diff --git a/packages/react-native-reanimated/android/src/paper/java/com/swmansion/reanimated/NativeProxy.java b/packages/react-native-reanimated/android/src/paper/java/com/swmansion/reanimated/NativeProxy.java index f98cf80266a8..7f7ebada7cd1 100644 --- a/packages/react-native-reanimated/android/src/paper/java/com/swmansion/reanimated/NativeProxy.java +++ b/packages/react-native-reanimated/android/src/paper/java/com/swmansion/reanimated/NativeProxy.java @@ -35,7 +35,6 @@ public NativeProxy(ReactApplicationContext context, WorkletsModule workletsModul workletsModule, Objects.requireNonNull(context.getJavaScriptContextHolder()).get(), holder, - mAndroidUIScheduler, LayoutAnimations, /* isBridgeless */ false); prepareLayoutAnimations(LayoutAnimations); @@ -50,7 +49,6 @@ private native HybridData initHybrid( WorkletsModule workletsModule, long jsContext, CallInvokerHolderImpl jsCallInvokerHolder, - AndroidUIScheduler androidUIScheduler, LayoutAnimations LayoutAnimations, boolean isBridgeless); diff --git a/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm b/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm index 83c5d2fe9113..3e66116c319a 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm +++ b/packages/react-native-reanimated/apple/reanimated/apple/native/NativeProxy.mm @@ -12,7 +12,6 @@ #import #import #import -#import #import #import @@ -69,18 +68,10 @@ static inline bool getIsReducedMotion() PlatformDepMethodsHolder platformDepMethodsHolder = makePlatformDepMethodsHolder(bridge, nodesManager, reaModule); - std::shared_ptr uiScheduler = std::make_shared(); - const auto workletsModuleProxy = [workletsModule getWorkletsModuleProxy]; auto reanimatedModuleProxy = std::make_shared( - workletsModuleProxy, - rnRuntime, - jsInvoker, - uiScheduler, - platformDepMethodsHolder, - isBridgeless, - getIsReducedMotion()); + workletsModuleProxy, rnRuntime, jsInvoker, platformDepMethodsHolder, isBridgeless, getIsReducedMotion()); commonInit(reaModule, reanimatedModuleProxy); // Layout Animation callbacks setup diff --git a/packages/react-native-reanimated/apple/reanimated/apple/native/PlatformDepMethodsHolderImpl.mm b/packages/react-native-reanimated/apple/reanimated/apple/native/PlatformDepMethodsHolderImpl.mm index 65f5584a4c88..4edfe55cc73c 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/native/PlatformDepMethodsHolderImpl.mm +++ b/packages/react-native-reanimated/apple/reanimated/apple/native/PlatformDepMethodsHolderImpl.mm @@ -10,7 +10,6 @@ #import #import #import -#import #import #import diff --git a/packages/react-native-reanimated/apple/reanimated/apple/native/REAIOSUIScheduler.h b/packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.h similarity index 73% rename from packages/react-native-reanimated/apple/reanimated/apple/native/REAIOSUIScheduler.h rename to packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.h index 9b7e0ff3db81..b6702fba08fa 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/native/REAIOSUIScheduler.h +++ b/packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.h @@ -5,15 +5,15 @@ #import -namespace reanimated { +namespace worklets { using namespace facebook; using namespace react; using namespace worklets; -class REAIOSUIScheduler : public UIScheduler { +class IOSUIScheduler : public UIScheduler { public: void scheduleOnUI(std::function job) override; }; -} // namespace reanimated +} // namespace worklets diff --git a/packages/react-native-reanimated/apple/reanimated/apple/native/REAIOSUIScheduler.mm b/packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.mm similarity index 60% rename from packages/react-native-reanimated/apple/reanimated/apple/native/REAIOSUIScheduler.mm rename to packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.mm index dbf1f050dfe2..ced9f39b2f8b 100644 --- a/packages/react-native-reanimated/apple/reanimated/apple/native/REAIOSUIScheduler.mm +++ b/packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.mm @@ -1,11 +1,11 @@ -#import +#import -namespace reanimated { +namespace worklets { using namespace facebook; using namespace react; -void REAIOSUIScheduler::scheduleOnUI(std::function job) +void IOSUIScheduler::scheduleOnUI(std::function job) { if ([NSThread isMainThread]) { job(); @@ -21,4 +21,4 @@ } } -} // namespace reanimated +} // namespace worklets diff --git a/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm b/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm index 911ef951e8ee..15c03eaf3985 100644 --- a/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm +++ b/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm @@ -1,6 +1,7 @@ #import #import #import +#import #import #import @@ -43,8 +44,9 @@ @implementation WorkletsModule { std::string valueUnpackerCodeStr = [valueUnpackerCode UTF8String]; auto jsCallInvoker = bridge.jsCallInvoker; auto jsScheduler = std::make_shared(rnRuntime, jsCallInvoker); + auto uiScheduler = std::make_shared(); workletsModuleProxy_ = - std::make_shared(valueUnpackerCodeStr, jsQueue, jsCallInvoker, jsScheduler); + std::make_shared(valueUnpackerCodeStr, jsQueue, jsCallInvoker, jsScheduler, uiScheduler); RNRuntimeWorkletDecorator::decorate(rnRuntime, workletsModuleProxy_); return @YES;