1*ab11e3c9SKudo Chien #pragma once
2*ab11e3c9SKudo Chien 
3*ab11e3c9SKudo Chien #include <unistd.h>
4*ab11e3c9SKudo Chien #include <memory>
5*ab11e3c9SKudo Chien #include <string>
6*ab11e3c9SKudo Chien #include <vector>
7*ab11e3c9SKudo Chien 
8*ab11e3c9SKudo Chien #include "AnimatedSensorModule.h"
9*ab11e3c9SKudo Chien #include "ErrorHandler.h"
10*ab11e3c9SKudo Chien #include "LayoutAnimationsProxy.h"
11*ab11e3c9SKudo Chien #include "NativeReanimatedModuleSpec.h"
12*ab11e3c9SKudo Chien #include "PlatformDepMethodsHolder.h"
13*ab11e3c9SKudo Chien #include "RuntimeDecorator.h"
14*ab11e3c9SKudo Chien #include "RuntimeManager.h"
15*ab11e3c9SKudo Chien #include "Scheduler.h"
16*ab11e3c9SKudo Chien #include "SingleInstanceChecker.h"
17*ab11e3c9SKudo Chien 
18*ab11e3c9SKudo Chien namespace reanimated {
19*ab11e3c9SKudo Chien 
20*ab11e3c9SKudo Chien using FrameCallback = std::function<void(double)>;
21*ab11e3c9SKudo Chien 
22*ab11e3c9SKudo Chien class ShareableValue;
23*ab11e3c9SKudo Chien class MutableValue;
24*ab11e3c9SKudo Chien class MapperRegistry;
25*ab11e3c9SKudo Chien class EventHandlerRegistry;
26*ab11e3c9SKudo Chien 
27*ab11e3c9SKudo Chien class NativeReanimatedModule : public NativeReanimatedModuleSpec,
28*ab11e3c9SKudo Chien                                public RuntimeManager {
29*ab11e3c9SKudo Chien   friend ShareableValue;
30*ab11e3c9SKudo Chien   friend MutableValue;
31*ab11e3c9SKudo Chien 
32*ab11e3c9SKudo Chien  public:
33*ab11e3c9SKudo Chien   NativeReanimatedModule(
34*ab11e3c9SKudo Chien       std::shared_ptr<CallInvoker> jsInvoker,
35*ab11e3c9SKudo Chien       std::shared_ptr<Scheduler> scheduler,
36*ab11e3c9SKudo Chien       std::shared_ptr<jsi::Runtime> rt,
37*ab11e3c9SKudo Chien       std::shared_ptr<ErrorHandler> errorHandler,
38*ab11e3c9SKudo Chien       std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)>
39*ab11e3c9SKudo Chien           propObtainer,
40*ab11e3c9SKudo Chien       std::shared_ptr<LayoutAnimationsProxy> layoutAnimationsProxy,
41*ab11e3c9SKudo Chien       PlatformDepMethodsHolder platformDepMethodsHolder);
42*ab11e3c9SKudo Chien 
43*ab11e3c9SKudo Chien   void installCoreFunctions(jsi::Runtime &rt, const jsi::Value &valueSetter)
44*ab11e3c9SKudo Chien       override;
45*ab11e3c9SKudo Chien 
46*ab11e3c9SKudo Chien   jsi::Value makeShareable(jsi::Runtime &rt, const jsi::Value &value) override;
47*ab11e3c9SKudo Chien   jsi::Value makeMutable(jsi::Runtime &rt, const jsi::Value &value) override;
48*ab11e3c9SKudo Chien   jsi::Value makeRemote(jsi::Runtime &rt, const jsi::Value &value) override;
49*ab11e3c9SKudo Chien 
50*ab11e3c9SKudo Chien   jsi::Value startMapper(
51*ab11e3c9SKudo Chien       jsi::Runtime &rt,
52*ab11e3c9SKudo Chien       const jsi::Value &worklet,
53*ab11e3c9SKudo Chien       const jsi::Value &inputs,
54*ab11e3c9SKudo Chien       const jsi::Value &outputs,
55*ab11e3c9SKudo Chien       const jsi::Value &updater,
56*ab11e3c9SKudo Chien       const jsi::Value &viewDescriptors) override;
57*ab11e3c9SKudo Chien   void stopMapper(jsi::Runtime &rt, const jsi::Value &mapperId) override;
58*ab11e3c9SKudo Chien 
59*ab11e3c9SKudo Chien   jsi::Value registerEventHandler(
60*ab11e3c9SKudo Chien       jsi::Runtime &rt,
61*ab11e3c9SKudo Chien       const jsi::Value &eventHash,
62*ab11e3c9SKudo Chien       const jsi::Value &worklet) override;
63*ab11e3c9SKudo Chien   void unregisterEventHandler(
64*ab11e3c9SKudo Chien       jsi::Runtime &rt,
65*ab11e3c9SKudo Chien       const jsi::Value &registrationId) override;
66*ab11e3c9SKudo Chien 
67*ab11e3c9SKudo Chien   jsi::Value getViewProp(
68*ab11e3c9SKudo Chien       jsi::Runtime &rt,
69*ab11e3c9SKudo Chien       const jsi::Value &viewTag,
70*ab11e3c9SKudo Chien       const jsi::Value &propName,
71*ab11e3c9SKudo Chien       const jsi::Value &callback) override;
72*ab11e3c9SKudo Chien 
73*ab11e3c9SKudo Chien   jsi::Value enableLayoutAnimations(jsi::Runtime &rt, const jsi::Value &config)
74*ab11e3c9SKudo Chien       override;
75*ab11e3c9SKudo Chien   jsi::Value configureProps(
76*ab11e3c9SKudo Chien       jsi::Runtime &rt,
77*ab11e3c9SKudo Chien       const jsi::Value &uiProps,
78*ab11e3c9SKudo Chien       const jsi::Value &nativeProps) override;
79*ab11e3c9SKudo Chien 
80*ab11e3c9SKudo Chien   void onRender(double timestampMs);
81*ab11e3c9SKudo Chien   void onEvent(std::string eventName, std::string eventAsString);
82*ab11e3c9SKudo Chien   bool isAnyHandlerWaitingForEvent(std::string eventName);
83*ab11e3c9SKudo Chien 
84*ab11e3c9SKudo Chien   void maybeRequestRender();
85*ab11e3c9SKudo Chien   UpdaterFunction updaterFunction;
86*ab11e3c9SKudo Chien 
87*ab11e3c9SKudo Chien   jsi::Value registerSensor(
88*ab11e3c9SKudo Chien       jsi::Runtime &rt,
89*ab11e3c9SKudo Chien       const jsi::Value &sensorType,
90*ab11e3c9SKudo Chien       const jsi::Value &interval,
91*ab11e3c9SKudo Chien       const jsi::Value &sensorDataContainer) override;
92*ab11e3c9SKudo Chien   void unregisterSensor(jsi::Runtime &rt, const jsi::Value &sensorId) override;
93*ab11e3c9SKudo Chien   jsi::Value subscribeForKeyboardEvents(
94*ab11e3c9SKudo Chien       jsi::Runtime &rt,
95*ab11e3c9SKudo Chien       const jsi::Value &keyboardEventContainer) override;
96*ab11e3c9SKudo Chien   void unsubscribeFromKeyboardEvents(
97*ab11e3c9SKudo Chien       jsi::Runtime &rt,
98*ab11e3c9SKudo Chien       const jsi::Value &listenerId) override;
99*ab11e3c9SKudo Chien 
100*ab11e3c9SKudo Chien  private:
101*ab11e3c9SKudo Chien   std::shared_ptr<MapperRegistry> mapperRegistry;
102*ab11e3c9SKudo Chien   std::shared_ptr<EventHandlerRegistry> eventHandlerRegistry;
103*ab11e3c9SKudo Chien   std::function<void(FrameCallback &, jsi::Runtime &)> requestRender;
104*ab11e3c9SKudo Chien   std::shared_ptr<jsi::Value> dummyEvent;
105*ab11e3c9SKudo Chien   std::vector<FrameCallback> frameCallbacks;
106*ab11e3c9SKudo Chien   bool renderRequested = false;
107*ab11e3c9SKudo Chien   std::function<jsi::Value(jsi::Runtime &, const int, const jsi::String &)>
108*ab11e3c9SKudo Chien       propObtainer;
109*ab11e3c9SKudo Chien   std::function<void(double)> onRenderCallback;
110*ab11e3c9SKudo Chien   std::shared_ptr<LayoutAnimationsProxy> layoutAnimationsProxy;
111*ab11e3c9SKudo Chien   AnimatedSensorModule animatedSensorModule;
112*ab11e3c9SKudo Chien   ConfigurePropsFunction configurePropsPlatformFunction;
113*ab11e3c9SKudo Chien   KeyboardEventSubscribeFunction subscribeForKeyboardEventsFunction;
114*ab11e3c9SKudo Chien   KeyboardEventUnsubscribeFunction unsubscribeFromKeyboardEventsFunction;
115*ab11e3c9SKudo Chien 
116*ab11e3c9SKudo Chien #ifdef DEBUG
117*ab11e3c9SKudo Chien   SingleInstanceChecker<NativeReanimatedModule> singleInstanceChecker_;
118*ab11e3c9SKudo Chien #endif
119*ab11e3c9SKudo Chien };
120*ab11e3c9SKudo Chien 
121*ab11e3c9SKudo Chien } // namespace reanimated
122