104819bfdSŁukasz Kosmaty #pragma once 204819bfdSŁukasz Kosmaty 3*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED 4*5f154df9Saleqsio #include <react/renderer/uimanager/UIManager.h> 5*5f154df9Saleqsio #include "NewestShadowNodesRegistry.h" 6*5f154df9Saleqsio #endif 7*5f154df9Saleqsio 804819bfdSŁukasz Kosmaty #include <memory> 904819bfdSŁukasz Kosmaty #include <string> 10*5f154df9Saleqsio #include <unordered_set> 11*5f154df9Saleqsio #include <utility> 1204819bfdSŁukasz Kosmaty #include <vector> 1304819bfdSŁukasz Kosmaty 1404819bfdSŁukasz Kosmaty #include "AnimatedSensorModule.h" 1504819bfdSŁukasz Kosmaty #include "ErrorHandler.h" 16*5f154df9Saleqsio #include "LayoutAnimationsManager.h" 1704819bfdSŁukasz Kosmaty #include "NativeReanimatedModuleSpec.h" 1804819bfdSŁukasz Kosmaty #include "PlatformDepMethodsHolder.h" 1904819bfdSŁukasz Kosmaty #include "RuntimeDecorator.h" 2004819bfdSŁukasz Kosmaty #include "RuntimeManager.h" 2104819bfdSŁukasz Kosmaty #include "Scheduler.h" 2204819bfdSŁukasz Kosmaty #include "SingleInstanceChecker.h" 2304819bfdSŁukasz Kosmaty 2404819bfdSŁukasz Kosmaty namespace reanimated { 2504819bfdSŁukasz Kosmaty 2604819bfdSŁukasz Kosmaty using FrameCallback = std::function<void(double)>; 2704819bfdSŁukasz Kosmaty 2804819bfdSŁukasz Kosmaty class EventHandlerRegistry; 2904819bfdSŁukasz Kosmaty 3004819bfdSŁukasz Kosmaty class NativeReanimatedModule : public NativeReanimatedModuleSpec, 3104819bfdSŁukasz Kosmaty public RuntimeManager { 3204819bfdSŁukasz Kosmaty public: 3304819bfdSŁukasz Kosmaty NativeReanimatedModule( 34*5f154df9Saleqsio const std::shared_ptr<CallInvoker> &jsInvoker, 35*5f154df9Saleqsio const std::shared_ptr<Scheduler> &scheduler, 36*5f154df9Saleqsio const std::shared_ptr<jsi::Runtime> &rt, 37*5f154df9Saleqsio const std::shared_ptr<ErrorHandler> &errorHandler, 38*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED 39*5f154df9Saleqsio // nothing 40*5f154df9Saleqsio #else 4104819bfdSŁukasz Kosmaty std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)> 4204819bfdSŁukasz Kosmaty propObtainer, 43*5f154df9Saleqsio #endif 4404819bfdSŁukasz Kosmaty PlatformDepMethodsHolder platformDepMethodsHolder); 4504819bfdSŁukasz Kosmaty 46*5f154df9Saleqsio ~NativeReanimatedModule(); 4704819bfdSŁukasz Kosmaty 48*5f154df9Saleqsio std::shared_ptr<JSRuntimeHelper> runtimeHelper; 4904819bfdSŁukasz Kosmaty 50*5f154df9Saleqsio void installCoreFunctions( 5104819bfdSŁukasz Kosmaty jsi::Runtime &rt, 52*5f154df9Saleqsio const jsi::Value &callGuard, 53*5f154df9Saleqsio const jsi::Value &valueUnpacker) override; 54*5f154df9Saleqsio 55*5f154df9Saleqsio jsi::Value makeShareableClone( 56*5f154df9Saleqsio jsi::Runtime &rt, 57*5f154df9Saleqsio const jsi::Value &value, 58*5f154df9Saleqsio const jsi::Value &shouldRetainRemote) override; 59*5f154df9Saleqsio 60*5f154df9Saleqsio jsi::Value makeSynchronizedDataHolder( 61*5f154df9Saleqsio jsi::Runtime &rt, 62*5f154df9Saleqsio const jsi::Value &initialShareable) override; 63*5f154df9Saleqsio jsi::Value getDataSynchronously( 64*5f154df9Saleqsio jsi::Runtime &rt, 65*5f154df9Saleqsio const jsi::Value &synchronizedDataHolderRef) override; 66*5f154df9Saleqsio void updateDataSynchronously( 67*5f154df9Saleqsio jsi::Runtime &rt, 68*5f154df9Saleqsio const jsi::Value &synchronizedDataHolderRef, 69*5f154df9Saleqsio const jsi::Value &newData); 70*5f154df9Saleqsio 71*5f154df9Saleqsio void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) override; 7204819bfdSŁukasz Kosmaty 7304819bfdSŁukasz Kosmaty jsi::Value registerEventHandler( 7404819bfdSŁukasz Kosmaty jsi::Runtime &rt, 7504819bfdSŁukasz Kosmaty const jsi::Value &eventHash, 7604819bfdSŁukasz Kosmaty const jsi::Value &worklet) override; 7704819bfdSŁukasz Kosmaty void unregisterEventHandler( 7804819bfdSŁukasz Kosmaty jsi::Runtime &rt, 7904819bfdSŁukasz Kosmaty const jsi::Value ®istrationId) override; 8004819bfdSŁukasz Kosmaty 8104819bfdSŁukasz Kosmaty jsi::Value getViewProp( 8204819bfdSŁukasz Kosmaty jsi::Runtime &rt, 8304819bfdSŁukasz Kosmaty const jsi::Value &viewTag, 8404819bfdSŁukasz Kosmaty const jsi::Value &propName, 8504819bfdSŁukasz Kosmaty const jsi::Value &callback) override; 8604819bfdSŁukasz Kosmaty 8704819bfdSŁukasz Kosmaty jsi::Value enableLayoutAnimations(jsi::Runtime &rt, const jsi::Value &config) 8804819bfdSŁukasz Kosmaty override; 8904819bfdSŁukasz Kosmaty jsi::Value configureProps( 9004819bfdSŁukasz Kosmaty jsi::Runtime &rt, 9104819bfdSŁukasz Kosmaty const jsi::Value &uiProps, 9204819bfdSŁukasz Kosmaty const jsi::Value &nativeProps) override; 93*5f154df9Saleqsio jsi::Value configureLayoutAnimation( 94*5f154df9Saleqsio jsi::Runtime &rt, 95*5f154df9Saleqsio const jsi::Value &viewTag, 96*5f154df9Saleqsio const jsi::Value &type, 97*5f154df9Saleqsio const jsi::Value &sharedTransitionTag, 98*5f154df9Saleqsio const jsi::Value &config) override; 9904819bfdSŁukasz Kosmaty 10004819bfdSŁukasz Kosmaty void onRender(double timestampMs); 101*5f154df9Saleqsio 102*5f154df9Saleqsio void onEvent( 103*5f154df9Saleqsio double eventTimestamp, 104*5f154df9Saleqsio const std::string &eventName, 105*5f154df9Saleqsio const jsi::Value &payload); 106*5f154df9Saleqsio 10704819bfdSŁukasz Kosmaty bool isAnyHandlerWaitingForEvent(std::string eventName); 10804819bfdSŁukasz Kosmaty 10904819bfdSŁukasz Kosmaty void maybeRequestRender(); 110*5f154df9Saleqsio UpdatePropsFunction updatePropsFunction; 111*5f154df9Saleqsio 112*5f154df9Saleqsio bool handleEvent( 113*5f154df9Saleqsio const std::string &eventName, 114*5f154df9Saleqsio const jsi::Value &payload, 115*5f154df9Saleqsio double currentTime); 116*5f154df9Saleqsio 117*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED 118*5f154df9Saleqsio bool handleRawEvent(const RawEvent &rawEvent, double currentTime); 119*5f154df9Saleqsio 120*5f154df9Saleqsio void updateProps( 121*5f154df9Saleqsio jsi::Runtime &rt, 122*5f154df9Saleqsio const jsi::Value &shadowNodeValue, 123*5f154df9Saleqsio const jsi::Value &props); 124*5f154df9Saleqsio 125*5f154df9Saleqsio void removeShadowNodeFromRegistry(jsi::Runtime &rt, const jsi::Value &tag); 126*5f154df9Saleqsio 127*5f154df9Saleqsio void performOperations(); 128*5f154df9Saleqsio 129*5f154df9Saleqsio void dispatchCommand( 130*5f154df9Saleqsio jsi::Runtime &rt, 131*5f154df9Saleqsio const jsi::Value &shadowNodeValue, 132*5f154df9Saleqsio const jsi::Value &commandNameValue, 133*5f154df9Saleqsio const jsi::Value &argsValue); 134*5f154df9Saleqsio 135*5f154df9Saleqsio jsi::Value measure(jsi::Runtime &rt, const jsi::Value &shadowNodeValue); 136*5f154df9Saleqsio 137*5f154df9Saleqsio void setUIManager(std::shared_ptr<UIManager> uiManager); 138*5f154df9Saleqsio 139*5f154df9Saleqsio void setNewestShadowNodesRegistry( 140*5f154df9Saleqsio std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry); 141*5f154df9Saleqsio #endif 14204819bfdSŁukasz Kosmaty 14304819bfdSŁukasz Kosmaty jsi::Value registerSensor( 14404819bfdSŁukasz Kosmaty jsi::Runtime &rt, 14504819bfdSŁukasz Kosmaty const jsi::Value &sensorType, 14604819bfdSŁukasz Kosmaty const jsi::Value &interval, 147*5f154df9Saleqsio const jsi::Value &iosReferenceFrame, 14804819bfdSŁukasz Kosmaty const jsi::Value &sensorDataContainer) override; 14904819bfdSŁukasz Kosmaty void unregisterSensor(jsi::Runtime &rt, const jsi::Value &sensorId) override; 150*5f154df9Saleqsio 151*5f154df9Saleqsio void cleanupSensors(); 152*5f154df9Saleqsio 15304819bfdSŁukasz Kosmaty jsi::Value subscribeForKeyboardEvents( 15404819bfdSŁukasz Kosmaty jsi::Runtime &rt, 155*5f154df9Saleqsio const jsi::Value &keyboardEventContainer, 156*5f154df9Saleqsio const jsi::Value &isStatusBarTranslucent) override; 15704819bfdSŁukasz Kosmaty void unsubscribeFromKeyboardEvents( 15804819bfdSŁukasz Kosmaty jsi::Runtime &rt, 15904819bfdSŁukasz Kosmaty const jsi::Value &listenerId) override; 16004819bfdSŁukasz Kosmaty layoutAnimationsManager()161*5f154df9Saleqsio inline LayoutAnimationsManager &layoutAnimationsManager() { 162*5f154df9Saleqsio return layoutAnimationsManager_; 163*5f154df9Saleqsio } 164*5f154df9Saleqsio 16504819bfdSŁukasz Kosmaty private: 166*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED 167*5f154df9Saleqsio bool isThereAnyLayoutProp(jsi::Runtime &rt, const jsi::Value &props); 168*5f154df9Saleqsio #endif // RCT_NEW_ARCH_ENABLED 169*5f154df9Saleqsio 170*5f154df9Saleqsio std::unique_ptr<EventHandlerRegistry> eventHandlerRegistry; 17104819bfdSŁukasz Kosmaty std::function<void(FrameCallback &, jsi::Runtime &)> requestRender; 17204819bfdSŁukasz Kosmaty std::vector<FrameCallback> frameCallbacks; 17304819bfdSŁukasz Kosmaty bool renderRequested = false; 17404819bfdSŁukasz Kosmaty std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)> 17504819bfdSŁukasz Kosmaty propObtainer; 17604819bfdSŁukasz Kosmaty std::function<void(double)> onRenderCallback; 17704819bfdSŁukasz Kosmaty AnimatedSensorModule animatedSensorModule; 17804819bfdSŁukasz Kosmaty ConfigurePropsFunction configurePropsPlatformFunction; 179*5f154df9Saleqsio 180*5f154df9Saleqsio #ifdef RCT_NEW_ARCH_ENABLED 181*5f154df9Saleqsio SynchronouslyUpdateUIPropsFunction synchronouslyUpdateUIPropsFunction; 182*5f154df9Saleqsio 183*5f154df9Saleqsio std::shared_ptr<UIManager> uiManager_; 184*5f154df9Saleqsio 185*5f154df9Saleqsio // After app reload, surfaceId on iOS is still 1 but on Android it's 11. 186*5f154df9Saleqsio // We can store surfaceId of the most recent ShadowNode as a workaround. 187*5f154df9Saleqsio SurfaceId surfaceId_ = -1; 188*5f154df9Saleqsio 189*5f154df9Saleqsio std::vector<std::pair<ShadowNode::Shared, std::unique_ptr<jsi::Value>>> 190*5f154df9Saleqsio operationsInBatch_; // TODO: refactor std::pair to custom struct 191*5f154df9Saleqsio 192*5f154df9Saleqsio std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry_; 193*5f154df9Saleqsio 194*5f154df9Saleqsio std::vector<Tag> tagsToRemove_; // from newestShadowNodesRegistry_ 195*5f154df9Saleqsio #endif 196*5f154df9Saleqsio 197*5f154df9Saleqsio std::unordered_set<std::string> nativePropNames_; // filled by configureProps 198*5f154df9Saleqsio LayoutAnimationsManager layoutAnimationsManager_; 199*5f154df9Saleqsio 20004819bfdSŁukasz Kosmaty KeyboardEventSubscribeFunction subscribeForKeyboardEventsFunction; 20104819bfdSŁukasz Kosmaty KeyboardEventUnsubscribeFunction unsubscribeFromKeyboardEventsFunction; 20204819bfdSŁukasz Kosmaty 20304819bfdSŁukasz Kosmaty #ifdef DEBUG 20404819bfdSŁukasz Kosmaty SingleInstanceChecker<NativeReanimatedModule> singleInstanceChecker_; 20504819bfdSŁukasz Kosmaty #endif 20604819bfdSŁukasz Kosmaty }; 20704819bfdSŁukasz Kosmaty 20804819bfdSŁukasz Kosmaty } // namespace reanimated 209