15e538c67SŁukasz Kosmaty // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
25e538c67SŁukasz Kosmaty 
35e538c67SŁukasz Kosmaty #pragma once
45e538c67SŁukasz Kosmaty 
5*29e8b6f8SŁukasz Kosmaty #include "JNIDeallocator.h"
6*29e8b6f8SŁukasz Kosmaty 
75e538c67SŁukasz Kosmaty #include <fbjni/fbjni.h>
85e538c67SŁukasz Kosmaty #include <folly/dynamic.h>
95e538c67SŁukasz Kosmaty 
105e538c67SŁukasz Kosmaty #include <react/jni/WritableNativeArray.h>
115e538c67SŁukasz Kosmaty #include <react/jni/WritableNativeMap.h>
125e538c67SŁukasz Kosmaty 
135e538c67SŁukasz Kosmaty namespace jni = facebook::jni;
145e538c67SŁukasz Kosmaty namespace react = facebook::react;
155e538c67SŁukasz Kosmaty 
165e538c67SŁukasz Kosmaty namespace expo {
17*29e8b6f8SŁukasz Kosmaty class JSIInteropModuleRegistry;
18*29e8b6f8SŁukasz Kosmaty 
19*29e8b6f8SŁukasz Kosmaty class JavaCallback : public jni::HybridClass<JavaCallback, Destructible> {
205e538c67SŁukasz Kosmaty public:
215e538c67SŁukasz Kosmaty   static auto constexpr
225e538c67SŁukasz Kosmaty     kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaCallback;";
235e538c67SŁukasz Kosmaty   static auto constexpr TAG = "JavaCallback";
245e538c67SŁukasz Kosmaty 
25*29e8b6f8SŁukasz Kosmaty   using Callback = std::function<void(folly::dynamic)>;
26*29e8b6f8SŁukasz Kosmaty 
275e538c67SŁukasz Kosmaty   static void registerNatives();
285e538c67SŁukasz Kosmaty 
29*29e8b6f8SŁukasz Kosmaty   static jni::local_ref<JavaCallback::javaobject> newInstance(
30*29e8b6f8SŁukasz Kosmaty     JSIInteropModuleRegistry *jsiInteropModuleRegistry,
31*29e8b6f8SŁukasz Kosmaty     Callback callback
32*29e8b6f8SŁukasz Kosmaty   );
33*29e8b6f8SŁukasz Kosmaty 
345e538c67SŁukasz Kosmaty private:
355e538c67SŁukasz Kosmaty   friend HybridBase;
365e538c67SŁukasz Kosmaty 
375e538c67SŁukasz Kosmaty 
385e538c67SŁukasz Kosmaty   JavaCallback(Callback callback);
395e538c67SŁukasz Kosmaty 
405e538c67SŁukasz Kosmaty   void invoke();
415e538c67SŁukasz Kosmaty 
425e538c67SŁukasz Kosmaty   void invokeBool(bool result);
435e538c67SŁukasz Kosmaty 
445e538c67SŁukasz Kosmaty   void invokeInt(int result);
455e538c67SŁukasz Kosmaty 
465e538c67SŁukasz Kosmaty   void invokeDouble(double result);
475e538c67SŁukasz Kosmaty 
485e538c67SŁukasz Kosmaty   void invokeFloat(float result);
495e538c67SŁukasz Kosmaty 
505e538c67SŁukasz Kosmaty   void invokeString(jni::alias_ref<jstring> result);
515e538c67SŁukasz Kosmaty 
525e538c67SŁukasz Kosmaty   void invokeArray(jni::alias_ref<react::WritableNativeArray::javaobject> result);
535e538c67SŁukasz Kosmaty 
545e538c67SŁukasz Kosmaty   void invokeMap(jni::alias_ref<react::WritableNativeMap::javaobject> result);
555e538c67SŁukasz Kosmaty 
565e538c67SŁukasz Kosmaty   Callback callback;
575e538c67SŁukasz Kosmaty };
585e538c67SŁukasz Kosmaty } // namespace expo
59