1*4440fb50SKudo Chien #pragma once 2*4440fb50SKudo Chien 3*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED 4*4440fb50SKudo Chien #include <react/renderer/uimanager/UIManager.h> 5*4440fb50SKudo Chien #include "NewestShadowNodesRegistry.h" 6*4440fb50SKudo Chien #endif 7*4440fb50SKudo Chien 8*4440fb50SKudo Chien #include <memory> 9*4440fb50SKudo Chien #include <string> 10*4440fb50SKudo Chien #include <unordered_set> 11*4440fb50SKudo Chien #include <utility> 12*4440fb50SKudo Chien #include <vector> 13*4440fb50SKudo Chien 14*4440fb50SKudo Chien #include "AnimatedSensorModule.h" 15*4440fb50SKudo Chien #include "ErrorHandler.h" 16*4440fb50SKudo Chien #include "LayoutAnimationsManager.h" 17*4440fb50SKudo Chien #include "NativeReanimatedModuleSpec.h" 18*4440fb50SKudo Chien #include "PlatformDepMethodsHolder.h" 19*4440fb50SKudo Chien #include "RuntimeDecorator.h" 20*4440fb50SKudo Chien #include "RuntimeManager.h" 21*4440fb50SKudo Chien #include "Scheduler.h" 22*4440fb50SKudo Chien #include "SingleInstanceChecker.h" 23*4440fb50SKudo Chien 24*4440fb50SKudo Chien namespace reanimated { 25*4440fb50SKudo Chien 26*4440fb50SKudo Chien using FrameCallback = std::function<void(double)>; 27*4440fb50SKudo Chien 28*4440fb50SKudo Chien class EventHandlerRegistry; 29*4440fb50SKudo Chien 30*4440fb50SKudo Chien class NativeReanimatedModule : public NativeReanimatedModuleSpec, 31*4440fb50SKudo Chien public RuntimeManager { 32*4440fb50SKudo Chien public: 33*4440fb50SKudo Chien NativeReanimatedModule( 34*4440fb50SKudo Chien const std::shared_ptr<CallInvoker> &jsInvoker, 35*4440fb50SKudo Chien const std::shared_ptr<Scheduler> &scheduler, 36*4440fb50SKudo Chien const std::shared_ptr<jsi::Runtime> &rt, 37*4440fb50SKudo Chien const std::shared_ptr<ErrorHandler> &errorHandler, 38*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED 39*4440fb50SKudo Chien // nothing 40*4440fb50SKudo Chien #else 41*4440fb50SKudo Chien std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)> 42*4440fb50SKudo Chien propObtainer, 43*4440fb50SKudo Chien #endif 44*4440fb50SKudo Chien PlatformDepMethodsHolder platformDepMethodsHolder); 45*4440fb50SKudo Chien 46*4440fb50SKudo Chien ~NativeReanimatedModule(); 47*4440fb50SKudo Chien 48*4440fb50SKudo Chien std::shared_ptr<JSRuntimeHelper> runtimeHelper; 49*4440fb50SKudo Chien 50*4440fb50SKudo Chien void installCoreFunctions( 51*4440fb50SKudo Chien jsi::Runtime &rt, 52*4440fb50SKudo Chien const jsi::Value &callGuard, 53*4440fb50SKudo Chien const jsi::Value &valueUnpacker) override; 54*4440fb50SKudo Chien 55*4440fb50SKudo Chien jsi::Value makeShareableClone( 56*4440fb50SKudo Chien jsi::Runtime &rt, 57*4440fb50SKudo Chien const jsi::Value &value, 58*4440fb50SKudo Chien const jsi::Value &shouldRetainRemote) override; 59*4440fb50SKudo Chien 60*4440fb50SKudo Chien jsi::Value makeSynchronizedDataHolder( 61*4440fb50SKudo Chien jsi::Runtime &rt, 62*4440fb50SKudo Chien const jsi::Value &initialShareable) override; 63*4440fb50SKudo Chien jsi::Value getDataSynchronously( 64*4440fb50SKudo Chien jsi::Runtime &rt, 65*4440fb50SKudo Chien const jsi::Value &synchronizedDataHolderRef) override; 66*4440fb50SKudo Chien void updateDataSynchronously( 67*4440fb50SKudo Chien jsi::Runtime &rt, 68*4440fb50SKudo Chien const jsi::Value &synchronizedDataHolderRef, 69*4440fb50SKudo Chien const jsi::Value &newData); 70*4440fb50SKudo Chien 71*4440fb50SKudo Chien void scheduleOnUI(jsi::Runtime &rt, const jsi::Value &worklet) override; 72*4440fb50SKudo Chien 73*4440fb50SKudo Chien jsi::Value registerEventHandler( 74*4440fb50SKudo Chien jsi::Runtime &rt, 75*4440fb50SKudo Chien const jsi::Value &eventHash, 76*4440fb50SKudo Chien const jsi::Value &worklet) override; 77*4440fb50SKudo Chien void unregisterEventHandler( 78*4440fb50SKudo Chien jsi::Runtime &rt, 79*4440fb50SKudo Chien const jsi::Value ®istrationId) override; 80*4440fb50SKudo Chien 81*4440fb50SKudo Chien jsi::Value getViewProp( 82*4440fb50SKudo Chien jsi::Runtime &rt, 83*4440fb50SKudo Chien const jsi::Value &viewTag, 84*4440fb50SKudo Chien const jsi::Value &propName, 85*4440fb50SKudo Chien const jsi::Value &callback) override; 86*4440fb50SKudo Chien 87*4440fb50SKudo Chien jsi::Value enableLayoutAnimations(jsi::Runtime &rt, const jsi::Value &config) 88*4440fb50SKudo Chien override; 89*4440fb50SKudo Chien jsi::Value configureProps( 90*4440fb50SKudo Chien jsi::Runtime &rt, 91*4440fb50SKudo Chien const jsi::Value &uiProps, 92*4440fb50SKudo Chien const jsi::Value &nativeProps) override; 93*4440fb50SKudo Chien jsi::Value configureLayoutAnimation( 94*4440fb50SKudo Chien jsi::Runtime &rt, 95*4440fb50SKudo Chien const jsi::Value &viewTag, 96*4440fb50SKudo Chien const jsi::Value &type, 97*4440fb50SKudo Chien const jsi::Value &sharedTransitionTag, 98*4440fb50SKudo Chien const jsi::Value &config) override; 99*4440fb50SKudo Chien 100*4440fb50SKudo Chien void onRender(double timestampMs); 101*4440fb50SKudo Chien 102*4440fb50SKudo Chien void onEvent( 103*4440fb50SKudo Chien double eventTimestamp, 104*4440fb50SKudo Chien const std::string &eventName, 105*4440fb50SKudo Chien const jsi::Value &payload); 106*4440fb50SKudo Chien 107*4440fb50SKudo Chien bool isAnyHandlerWaitingForEvent(std::string eventName); 108*4440fb50SKudo Chien 109*4440fb50SKudo Chien void maybeRequestRender(); 110*4440fb50SKudo Chien UpdatePropsFunction updatePropsFunction; 111*4440fb50SKudo Chien 112*4440fb50SKudo Chien bool handleEvent( 113*4440fb50SKudo Chien const std::string &eventName, 114*4440fb50SKudo Chien const jsi::Value &payload, 115*4440fb50SKudo Chien double currentTime); 116*4440fb50SKudo Chien 117*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED 118*4440fb50SKudo Chien bool handleRawEvent(const RawEvent &rawEvent, double currentTime); 119*4440fb50SKudo Chien 120*4440fb50SKudo Chien void updateProps( 121*4440fb50SKudo Chien jsi::Runtime &rt, 122*4440fb50SKudo Chien const jsi::Value &shadowNodeValue, 123*4440fb50SKudo Chien const jsi::Value &props); 124*4440fb50SKudo Chien 125*4440fb50SKudo Chien void removeShadowNodeFromRegistry(jsi::Runtime &rt, const jsi::Value &tag); 126*4440fb50SKudo Chien 127*4440fb50SKudo Chien void performOperations(); 128*4440fb50SKudo Chien 129*4440fb50SKudo Chien void dispatchCommand( 130*4440fb50SKudo Chien jsi::Runtime &rt, 131*4440fb50SKudo Chien const jsi::Value &shadowNodeValue, 132*4440fb50SKudo Chien const jsi::Value &commandNameValue, 133*4440fb50SKudo Chien const jsi::Value &argsValue); 134*4440fb50SKudo Chien 135*4440fb50SKudo Chien jsi::Value measure(jsi::Runtime &rt, const jsi::Value &shadowNodeValue); 136*4440fb50SKudo Chien 137*4440fb50SKudo Chien void setUIManager(std::shared_ptr<UIManager> uiManager); 138*4440fb50SKudo Chien 139*4440fb50SKudo Chien void setNewestShadowNodesRegistry( 140*4440fb50SKudo Chien std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry); 141*4440fb50SKudo Chien #endif 142*4440fb50SKudo Chien 143*4440fb50SKudo Chien jsi::Value registerSensor( 144*4440fb50SKudo Chien jsi::Runtime &rt, 145*4440fb50SKudo Chien const jsi::Value &sensorType, 146*4440fb50SKudo Chien const jsi::Value &interval, 147*4440fb50SKudo Chien const jsi::Value &iosReferenceFrame, 148*4440fb50SKudo Chien const jsi::Value &sensorDataContainer) override; 149*4440fb50SKudo Chien void unregisterSensor(jsi::Runtime &rt, const jsi::Value &sensorId) override; 150*4440fb50SKudo Chien 151*4440fb50SKudo Chien void cleanupSensors(); 152*4440fb50SKudo Chien 153*4440fb50SKudo Chien jsi::Value subscribeForKeyboardEvents( 154*4440fb50SKudo Chien jsi::Runtime &rt, 155*4440fb50SKudo Chien const jsi::Value &keyboardEventContainer, 156*4440fb50SKudo Chien const jsi::Value &isStatusBarTranslucent) override; 157*4440fb50SKudo Chien void unsubscribeFromKeyboardEvents( 158*4440fb50SKudo Chien jsi::Runtime &rt, 159*4440fb50SKudo Chien const jsi::Value &listenerId) override; 160*4440fb50SKudo Chien layoutAnimationsManager()161*4440fb50SKudo Chien inline LayoutAnimationsManager &layoutAnimationsManager() { 162*4440fb50SKudo Chien return layoutAnimationsManager_; 163*4440fb50SKudo Chien } 164*4440fb50SKudo Chien 165*4440fb50SKudo Chien private: 166*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED 167*4440fb50SKudo Chien bool isThereAnyLayoutProp(jsi::Runtime &rt, const jsi::Value &props); 168*4440fb50SKudo Chien #endif // RCT_NEW_ARCH_ENABLED 169*4440fb50SKudo Chien 170*4440fb50SKudo Chien std::unique_ptr<EventHandlerRegistry> eventHandlerRegistry; 171*4440fb50SKudo Chien std::function<void(FrameCallback &, jsi::Runtime &)> requestRender; 172*4440fb50SKudo Chien std::vector<FrameCallback> frameCallbacks; 173*4440fb50SKudo Chien bool renderRequested = false; 174*4440fb50SKudo Chien std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)> 175*4440fb50SKudo Chien propObtainer; 176*4440fb50SKudo Chien std::function<void(double)> onRenderCallback; 177*4440fb50SKudo Chien AnimatedSensorModule animatedSensorModule; 178*4440fb50SKudo Chien ConfigurePropsFunction configurePropsPlatformFunction; 179*4440fb50SKudo Chien 180*4440fb50SKudo Chien #ifdef RCT_NEW_ARCH_ENABLED 181*4440fb50SKudo Chien SynchronouslyUpdateUIPropsFunction synchronouslyUpdateUIPropsFunction; 182*4440fb50SKudo Chien 183*4440fb50SKudo Chien std::shared_ptr<UIManager> uiManager_; 184*4440fb50SKudo Chien 185*4440fb50SKudo Chien // After app reload, surfaceId on iOS is still 1 but on Android it's 11. 186*4440fb50SKudo Chien // We can store surfaceId of the most recent ShadowNode as a workaround. 187*4440fb50SKudo Chien SurfaceId surfaceId_ = -1; 188*4440fb50SKudo Chien 189*4440fb50SKudo Chien std::vector<std::pair<ShadowNode::Shared, std::unique_ptr<jsi::Value>>> 190*4440fb50SKudo Chien operationsInBatch_; // TODO: refactor std::pair to custom struct 191*4440fb50SKudo Chien 192*4440fb50SKudo Chien std::shared_ptr<NewestShadowNodesRegistry> newestShadowNodesRegistry_; 193*4440fb50SKudo Chien 194*4440fb50SKudo Chien std::vector<Tag> tagsToRemove_; // from newestShadowNodesRegistry_ 195*4440fb50SKudo Chien #endif 196*4440fb50SKudo Chien 197*4440fb50SKudo Chien std::unordered_set<std::string> nativePropNames_; // filled by configureProps 198*4440fb50SKudo Chien LayoutAnimationsManager layoutAnimationsManager_; 199*4440fb50SKudo Chien 200*4440fb50SKudo Chien KeyboardEventSubscribeFunction subscribeForKeyboardEventsFunction; 201*4440fb50SKudo Chien KeyboardEventUnsubscribeFunction unsubscribeFromKeyboardEventsFunction; 202*4440fb50SKudo Chien 203*4440fb50SKudo Chien #ifdef DEBUG 204*4440fb50SKudo Chien SingleInstanceChecker<NativeReanimatedModule> singleInstanceChecker_; 205*4440fb50SKudo Chien #endif 206*4440fb50SKudo Chien }; 207*4440fb50SKudo Chien 208*4440fb50SKudo Chien } // namespace reanimated 209