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