1*04819bfdSŁukasz Kosmaty #include "AndroidScheduler.h"
2*04819bfdSŁukasz Kosmaty #include <android/log.h>
3*04819bfdSŁukasz Kosmaty #include <fbjni/fbjni.h>
4*04819bfdSŁukasz Kosmaty #include <jsi/jsi.h>
5*04819bfdSŁukasz Kosmaty #include <memory>
6*04819bfdSŁukasz Kosmaty #include <string>
7*04819bfdSŁukasz Kosmaty 
8*04819bfdSŁukasz Kosmaty namespace reanimated {
9*04819bfdSŁukasz Kosmaty 
10*04819bfdSŁukasz Kosmaty using namespace facebook;
11*04819bfdSŁukasz Kosmaty using namespace react;
12*04819bfdSŁukasz Kosmaty 
13*04819bfdSŁukasz Kosmaty class SchedulerWrapper : public Scheduler {
14*04819bfdSŁukasz Kosmaty  private:
15*04819bfdSŁukasz Kosmaty   jni::global_ref<AndroidScheduler::javaobject> scheduler_;
16*04819bfdSŁukasz Kosmaty 
17*04819bfdSŁukasz Kosmaty  public:
SchedulerWrapper(jni::global_ref<AndroidScheduler::javaobject> scheduler)18*04819bfdSŁukasz Kosmaty   explicit SchedulerWrapper(
19*04819bfdSŁukasz Kosmaty       jni::global_ref<AndroidScheduler::javaobject> scheduler)
20*04819bfdSŁukasz Kosmaty       : scheduler_(scheduler) {}
21*04819bfdSŁukasz Kosmaty 
scheduleOnUI(std::function<void ()> job)22*04819bfdSŁukasz Kosmaty   void scheduleOnUI(std::function<void()> job) override {
23*04819bfdSŁukasz Kosmaty     Scheduler::scheduleOnUI(job);
24*04819bfdSŁukasz Kosmaty     if (!scheduledOnUI) {
25*04819bfdSŁukasz Kosmaty       scheduledOnUI = true;
26*04819bfdSŁukasz Kosmaty       scheduler_->cthis()->scheduleOnUI();
27*04819bfdSŁukasz Kosmaty     }
28*04819bfdSŁukasz Kosmaty   }
29*04819bfdSŁukasz Kosmaty 
~SchedulerWrapper()30*04819bfdSŁukasz Kosmaty   ~SchedulerWrapper() {}
31*04819bfdSŁukasz Kosmaty };
32*04819bfdSŁukasz Kosmaty 
AndroidScheduler(jni::alias_ref<AndroidScheduler::javaobject> jThis)33*04819bfdSŁukasz Kosmaty AndroidScheduler::AndroidScheduler(
34*04819bfdSŁukasz Kosmaty     jni::alias_ref<AndroidScheduler::javaobject> jThis)
35*04819bfdSŁukasz Kosmaty     : javaPart_(jni::make_global(jThis)),
36*04819bfdSŁukasz Kosmaty       scheduler_(new SchedulerWrapper(jni::make_global(jThis))) {}
37*04819bfdSŁukasz Kosmaty 
initHybrid(jni::alias_ref<jhybridobject> jThis)38*04819bfdSŁukasz Kosmaty jni::local_ref<AndroidScheduler::jhybriddata> AndroidScheduler::initHybrid(
39*04819bfdSŁukasz Kosmaty     jni::alias_ref<jhybridobject> jThis) {
40*04819bfdSŁukasz Kosmaty   return makeCxxInstance(jThis);
41*04819bfdSŁukasz Kosmaty }
42*04819bfdSŁukasz Kosmaty 
triggerUI()43*04819bfdSŁukasz Kosmaty void AndroidScheduler::triggerUI() {
44*04819bfdSŁukasz Kosmaty   scheduler_->triggerUI();
45*04819bfdSŁukasz Kosmaty }
46*04819bfdSŁukasz Kosmaty 
scheduleOnUI()47*04819bfdSŁukasz Kosmaty void AndroidScheduler::scheduleOnUI() {
48*04819bfdSŁukasz Kosmaty   static auto method = javaPart_->getClass()->getMethod<void()>("scheduleOnUI");
49*04819bfdSŁukasz Kosmaty   method(javaPart_.get());
50*04819bfdSŁukasz Kosmaty }
51*04819bfdSŁukasz Kosmaty 
registerNatives()52*04819bfdSŁukasz Kosmaty void AndroidScheduler::registerNatives() {
53*04819bfdSŁukasz Kosmaty   registerHybrid({
54*04819bfdSŁukasz Kosmaty       makeNativeMethod("initHybrid", AndroidScheduler::initHybrid),
55*04819bfdSŁukasz Kosmaty       makeNativeMethod("triggerUI", AndroidScheduler::triggerUI),
56*04819bfdSŁukasz Kosmaty   });
57*04819bfdSŁukasz Kosmaty }
58*04819bfdSŁukasz Kosmaty 
59*04819bfdSŁukasz Kosmaty } // namespace reanimated
60