From 21735bc21688df8ecf676aab09a957ed90c87984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Fazekas?= Date: Fri, 28 Nov 2025 15:39:39 +0100 Subject: [PATCH 1/2] chore: add reset + fix: invoke play, pause, --- .../com/margelo/nitro/rive/HybridRiveView.kt | 21 +++++- .../main/java/com/rive/RiveReactNativeView.kt | 5 +- ios/HybridRiveView.swift | 22 +++++-- ios/RiveReactNativeView.swift | 6 +- .../android/c++/JHybridRiveViewSpec.cpp | 49 ++++++++++++-- .../android/c++/JHybridRiveViewSpec.hpp | 5 +- .../margelo/nitro/rive/HybridRiveViewSpec.kt | 8 ++- .../generated/ios/RNRive-Swift-Cxx-Bridge.cpp | 16 ++--- .../generated/ios/RNRive-Swift-Cxx-Bridge.hpp | 65 ++++++++++++------- .../ios/c++/HybridRiveViewSpecSwift.hpp | 16 ++++- .../ios/swift/HybridRiveViewSpec.swift | 5 +- .../ios/swift/HybridRiveViewSpec_cxx.swift | 51 ++++++++++++--- .../shared/c++/HybridRiveViewSpec.cpp | 1 + .../shared/c++/HybridRiveViewSpec.hpp | 5 +- src/specs/RiveView.nitro.ts | 6 +- 15 files changed, 216 insertions(+), 65 deletions(-) diff --git a/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt b/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt index f379337f..f691becc 100644 --- a/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt +++ b/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt @@ -112,9 +112,12 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { return HybridViewModelInstance(viewModelInstance) } - override fun play() = executeOnUiThread { view.play() } + override fun play() = asyncExecuteOnUiThread { view.play() } + + override fun pause() = asyncExecuteOnUiThread { view.pause() } + + override fun reset() = asyncExecuteOnUiThread { view.reset() } - override fun pause() = executeOnUiThread { view.pause() } override fun onEventListener(onEvent: (event: UnifiedRiveEvent) -> Unit) = executeOnUiThread { view.addEventListener(onEvent) } @@ -186,6 +189,20 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { } } + private fun asyncExecuteOnUiThread(action: () -> Unit): Promise { + return Promise.async { + context.currentActivity?.runOnUiThread() { + try { + action() + } catch (e: Exception) { + throw Error(e.message) // TODO: Correctly handling errors (https://nitro.margelo.com/docs/errors) + } catch (e: Error) { + throw Error(e.message) + } + } + } + + } private fun executeOnUiThread(action: () -> Unit) { context.currentActivity?.runOnUiThread() { try { diff --git a/android/src/main/java/com/rive/RiveReactNativeView.kt b/android/src/main/java/com/rive/RiveReactNativeView.kt index cdc00515..4d999418 100644 --- a/android/src/main/java/com/rive/RiveReactNativeView.kt +++ b/android/src/main/java/com/rive/RiveReactNativeView.kt @@ -187,7 +187,10 @@ class RiveReactNativeView(context: ThemedReactContext) : FrameLayout(context) { fun play() = riveAnimationView?.play() - fun pause() = riveAnimationView?.pause(); + fun pause() = riveAnimationView?.pause() + + fun reset() = riveAnimationView?.reset() + fun addEventListener(onEvent: (event: RNEvent) -> Unit) { val eventListener = object : RiveFileController.RiveEventListener { diff --git a/ios/HybridRiveView.swift b/ios/HybridRiveView.swift index f375c788..74906eb5 100644 --- a/ios/HybridRiveView.swift +++ b/ios/HybridRiveView.swift @@ -66,6 +66,24 @@ where Wrapped == HybridDataBindMode { } class HybridRiveView: HybridRiveViewSpec { + func play() throws -> NitroModules.Promise { + return Promise.async { + try await self.getRiveView().play() + } + } + + func pause() throws -> NitroModules.Promise { + return Promise.async { + try await self.getRiveView().pause() + } + } + + func reset() throws -> NitroModules.Promise { + return Promise.async { + try await self.getRiveView().reset() + } + } + // MARK: View Props var dataBind: HybridDataBindMode? = nil { didSet { @@ -103,10 +121,6 @@ class HybridRiveView: HybridRiveViewSpec { return HybridViewModelInstance(viewModelInstance: viewModelInstance) } - func play() throws { try getRiveView().play() } - - func pause() throws { try getRiveView().pause() } - func onEventListener(onEvent: @escaping (UnifiedRiveEvent) -> Void) throws { try getRiveView().addEventListener(onEvent) } diff --git a/ios/RiveReactNativeView.swift b/ios/RiveReactNativeView.swift index e733dcbc..f517eb1c 100644 --- a/ios/RiveReactNativeView.swift +++ b/ios/RiveReactNativeView.swift @@ -121,20 +121,22 @@ class RiveReactNativeView: UIView, RiveStateMachineDelegate { stateMachine?.bind(viewModelInstance: instance) artboard?.bind(viewModelInstance: instance) } - baseViewModel?.play() + play() } + @MainActor func play() { baseViewModel?.play() } + @MainActor func pause() { baseViewModel?.pause() } func refreshAfterAssetChange() { if baseViewModel?.isPlaying == false { - baseViewModel?.play() + play() } } diff --git a/nitrogen/generated/android/c++/JHybridRiveViewSpec.cpp b/nitrogen/generated/android/c++/JHybridRiveViewSpec.cpp index 586a02cb..5e3df0a8 100644 --- a/nitrogen/generated/android/c++/JHybridRiveViewSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridRiveViewSpec.cpp @@ -208,13 +208,50 @@ namespace margelo::nitro::rive { auto __result = method(_javaPart); return __result != nullptr ? std::make_optional(__result->cthis()->shared_cast()) : std::nullopt; } - void JHybridRiveViewSpec::play() { - static const auto method = javaClassStatic()->getMethod("play"); - method(_javaPart); + std::shared_ptr> JHybridRiveViewSpec::play() { + static const auto method = javaClassStatic()->getMethod()>("play"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& /* unit */) { + __promise->resolve(); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); } - void JHybridRiveViewSpec::pause() { - static const auto method = javaClassStatic()->getMethod("pause"); - method(_javaPart); + std::shared_ptr> JHybridRiveViewSpec::pause() { + static const auto method = javaClassStatic()->getMethod()>("pause"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& /* unit */) { + __promise->resolve(); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } + std::shared_ptr> JHybridRiveViewSpec::reset() { + static const auto method = javaClassStatic()->getMethod()>("reset"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& /* unit */) { + __promise->resolve(); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); } void JHybridRiveViewSpec::onEventListener(const std::function& onEvent) { static const auto method = javaClassStatic()->getMethod /* onEvent */)>("onEventListener_cxx"); diff --git a/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp index 9ba7c91b..3fbc581e 100644 --- a/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp @@ -74,8 +74,9 @@ namespace margelo::nitro::rive { std::shared_ptr> awaitViewReady() override; void bindViewModelInstance(const std::shared_ptr& viewModelInstance) override; std::optional> getViewModelInstance() override; - void play() override; - void pause() override; + std::shared_ptr> play() override; + std::shared_ptr> pause() override; + std::shared_ptr> reset() override; void onEventListener(const std::function& onEvent) override; void removeEventListeners() override; void setNumberInputValue(const std::string& name, double value, const std::optional& path) override; diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveViewSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveViewSpec.kt index 4fb35639..07a2e3b7 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveViewSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveViewSpec.kt @@ -120,11 +120,15 @@ abstract class HybridRiveViewSpec: HybridView() { @DoNotStrip @Keep - abstract fun play(): Unit + abstract fun play(): Promise @DoNotStrip @Keep - abstract fun pause(): Unit + abstract fun pause(): Promise + + @DoNotStrip + @Keep + abstract fun reset(): Promise abstract fun onEventListener(onEvent: (event: UnifiedRiveEvent) -> Unit): Unit diff --git a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp index 63ad5deb..ffd43bf2 100644 --- a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp @@ -138,6 +138,14 @@ namespace margelo::nitro::rive::bridge::swift { }; } + // pragma MARK: std::function + Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept { + auto swiftClosure = RNRive::Func_void::fromUnsafe(swiftClosureWrapper); + return [swiftClosure = std::move(swiftClosure)]() mutable -> void { + swiftClosure.call(); + }; + } + // pragma MARK: std::function Func_void_UnifiedRiveEvent create_Func_void_UnifiedRiveEvent(void* NON_NULL swiftClosureWrapper) noexcept { auto swiftClosure = RNRive::Func_void_UnifiedRiveEvent::fromUnsafe(swiftClosureWrapper); @@ -289,13 +297,5 @@ namespace margelo::nitro::rive::bridge::swift { swiftClosure.call(value); }; } - - // pragma MARK: std::function - Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept { - auto swiftClosure = RNRive::Func_void::fromUnsafe(swiftClosureWrapper); - return [swiftClosure = std::move(swiftClosure)]() mutable -> void { - swiftClosure.call(); - }; - } } // namespace margelo::nitro::rive::bridge::swift diff --git a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp index 0a712400..1775ce84 100644 --- a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp @@ -563,6 +563,40 @@ namespace margelo::nitro::rive::bridge::swift { return *optional; } + // pragma MARK: std::shared_ptr> + /** + * Specialized version of `std::shared_ptr>`. + */ + using std__shared_ptr_Promise_void__ = std::shared_ptr>; + inline std::shared_ptr> create_std__shared_ptr_Promise_void__() noexcept { + return Promise::create(); + } + inline PromiseHolder wrap_std__shared_ptr_Promise_void__(std::shared_ptr> promise) noexcept { + return PromiseHolder(std::move(promise)); + } + + // pragma MARK: std::function + /** + * Specialized version of `std::function`. + */ + using Func_void = std::function; + /** + * Wrapper class for a `std::function`, this can be used from Swift. + */ + class Func_void_Wrapper final { + public: + explicit Func_void_Wrapper(std::function&& func): _function(std::make_unique>(std::move(func))) {} + inline void call() const noexcept { + _function->operator()(); + } + private: + std::unique_ptr> _function; + } SWIFT_NONCOPYABLE; + Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept; + inline Func_void_Wrapper wrap_Func_void(Func_void value) noexcept { + return Func_void_Wrapper(std::move(value)); + } + // pragma MARK: std::variant /** * Wrapper struct for `std::variant`. @@ -690,6 +724,15 @@ namespace margelo::nitro::rive::bridge::swift { return Result>>::withError(error); } + // pragma MARK: Result>> + using Result_std__shared_ptr_Promise_void___ = Result>>; + inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::shared_ptr>& value) noexcept { + return Result>>::withValue(value); + } + inline Result_std__shared_ptr_Promise_void___ create_Result_std__shared_ptr_Promise_void___(const std::exception_ptr& error) noexcept { + return Result>>::withError(error); + } + // pragma MARK: Result using Result_bool_ = Result; inline Result_bool_ create_Result_bool_(bool value) noexcept { @@ -997,27 +1040,5 @@ namespace margelo::nitro::rive::bridge::swift { inline Func_void_std__string_Wrapper wrap_Func_void_std__string(Func_void_std__string value) noexcept { return Func_void_std__string_Wrapper(std::move(value)); } - - // pragma MARK: std::function - /** - * Specialized version of `std::function`. - */ - using Func_void = std::function; - /** - * Wrapper class for a `std::function`, this can be used from Swift. - */ - class Func_void_Wrapper final { - public: - explicit Func_void_Wrapper(std::function&& func): _function(std::make_unique>(std::move(func))) {} - inline void call() const noexcept { - _function->operator()(); - } - private: - std::unique_ptr> _function; - } SWIFT_NONCOPYABLE; - Func_void create_Func_void(void* NON_NULL swiftClosureWrapper) noexcept; - inline Func_void_Wrapper wrap_Func_void(Func_void value) noexcept { - return Func_void_Wrapper(std::move(value)); - } } // namespace margelo::nitro::rive::bridge::swift diff --git a/nitrogen/generated/ios/c++/HybridRiveViewSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridRiveViewSpecSwift.hpp index 2772e7ef..8fe61aca 100644 --- a/nitrogen/generated/ios/c++/HybridRiveViewSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridRiveViewSpecSwift.hpp @@ -179,17 +179,29 @@ namespace margelo::nitro::rive { auto __value = std::move(__result.value()); return __value; } - inline void play() override { + inline std::shared_ptr> play() override { auto __result = _swiftPart.play(); if (__result.hasError()) [[unlikely]] { std::rethrow_exception(__result.error()); } + auto __value = std::move(__result.value()); + return __value; } - inline void pause() override { + inline std::shared_ptr> pause() override { auto __result = _swiftPart.pause(); if (__result.hasError()) [[unlikely]] { std::rethrow_exception(__result.error()); } + auto __value = std::move(__result.value()); + return __value; + } + inline std::shared_ptr> reset() override { + auto __result = _swiftPart.reset(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; } inline void onEventListener(const std::function& onEvent) override { auto __result = _swiftPart.onEventListener(onEvent); diff --git a/nitrogen/generated/ios/swift/HybridRiveViewSpec.swift b/nitrogen/generated/ios/swift/HybridRiveViewSpec.swift index a148fdfe..a407a8db 100644 --- a/nitrogen/generated/ios/swift/HybridRiveViewSpec.swift +++ b/nitrogen/generated/ios/swift/HybridRiveViewSpec.swift @@ -25,8 +25,9 @@ public protocol HybridRiveViewSpec_protocol: HybridObject, HybridView { func awaitViewReady() throws -> Promise func bindViewModelInstance(viewModelInstance: (any HybridViewModelInstanceSpec)) throws -> Void func getViewModelInstance() throws -> (any HybridViewModelInstanceSpec)? - func play() throws -> Void - func pause() throws -> Void + func play() throws -> Promise + func pause() throws -> Promise + func reset() throws -> Promise func onEventListener(onEvent: @escaping (_ event: UnifiedRiveEvent) -> Void) throws -> Void func removeEventListeners() throws -> Void func setNumberInputValue(name: String, value: Double, path: String?) throws -> Void diff --git a/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift index fe232959..7e1c4667 100644 --- a/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift +++ b/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift @@ -386,24 +386,59 @@ open class HybridRiveViewSpec_cxx { } @inline(__always) - public final func play() -> bridge.Result_void_ { + public final func play() -> bridge.Result_std__shared_ptr_Promise_void___ { do { - try self.__implementation.play() - return bridge.create_Result_void_() + let __result = try self.__implementation.play() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in + let __promise = bridge.create_std__shared_ptr_Promise_void__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise) + __result + .then({ __result in __promiseHolder.resolve() }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp) } catch (let __error) { let __exceptionPtr = __error.toCpp() - return bridge.create_Result_void_(__exceptionPtr) + return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr) } } @inline(__always) - public final func pause() -> bridge.Result_void_ { + public final func pause() -> bridge.Result_std__shared_ptr_Promise_void___ { do { - try self.__implementation.pause() - return bridge.create_Result_void_() + let __result = try self.__implementation.pause() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in + let __promise = bridge.create_std__shared_ptr_Promise_void__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise) + __result + .then({ __result in __promiseHolder.resolve() }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp) } catch (let __error) { let __exceptionPtr = __error.toCpp() - return bridge.create_Result_void_(__exceptionPtr) + return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr) + } + } + + @inline(__always) + public final func reset() -> bridge.Result_std__shared_ptr_Promise_void___ { + do { + let __result = try self.__implementation.reset() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_void__ in + let __promise = bridge.create_std__shared_ptr_Promise_void__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_void__(__promise) + __result + .then({ __result in __promiseHolder.resolve() }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_void___(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_void___(__exceptionPtr) } } diff --git a/nitrogen/generated/shared/c++/HybridRiveViewSpec.cpp b/nitrogen/generated/shared/c++/HybridRiveViewSpec.cpp index 05e959f2..7c8efc88 100644 --- a/nitrogen/generated/shared/c++/HybridRiveViewSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridRiveViewSpec.cpp @@ -37,6 +37,7 @@ namespace margelo::nitro::rive { prototype.registerHybridMethod("getViewModelInstance", &HybridRiveViewSpec::getViewModelInstance); prototype.registerHybridMethod("play", &HybridRiveViewSpec::play); prototype.registerHybridMethod("pause", &HybridRiveViewSpec::pause); + prototype.registerHybridMethod("reset", &HybridRiveViewSpec::reset); prototype.registerHybridMethod("onEventListener", &HybridRiveViewSpec::onEventListener); prototype.registerHybridMethod("removeEventListeners", &HybridRiveViewSpec::removeEventListeners); prototype.registerHybridMethod("setNumberInputValue", &HybridRiveViewSpec::setNumberInputValue); diff --git a/nitrogen/generated/shared/c++/HybridRiveViewSpec.hpp b/nitrogen/generated/shared/c++/HybridRiveViewSpec.hpp index 0bf16814..14f387a9 100644 --- a/nitrogen/generated/shared/c++/HybridRiveViewSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridRiveViewSpec.hpp @@ -96,8 +96,9 @@ namespace margelo::nitro::rive { virtual std::shared_ptr> awaitViewReady() = 0; virtual void bindViewModelInstance(const std::shared_ptr& viewModelInstance) = 0; virtual std::optional> getViewModelInstance() = 0; - virtual void play() = 0; - virtual void pause() = 0; + virtual std::shared_ptr> play() = 0; + virtual std::shared_ptr> pause() = 0; + virtual std::shared_ptr> reset() = 0; virtual void onEventListener(const std::function& onEvent) = 0; virtual void removeEventListeners() = 0; virtual void setNumberInputValue(const std::string& name, double value, const std::optional& path) = 0; diff --git a/src/specs/RiveView.nitro.ts b/src/specs/RiveView.nitro.ts index 5b763b6d..bcd7fdc8 100644 --- a/src/specs/RiveView.nitro.ts +++ b/src/specs/RiveView.nitro.ts @@ -61,9 +61,11 @@ export interface RiveViewMethods extends HybridViewMethods { */ getViewModelInstance(): ViewModelInstance | undefined; /** Starts playing the Rive graphic */ - play(): void; + play(): Promise; /** Pauses the the Rive graphic */ - pause(): void; + pause(): Promise; + /** Resets the Rive graphic to its initial state */ + reset(): Promise; /** * Adds an event listener to the Rive view * @param onEvent - The function to call when an event is triggered From 750590d2649bd3aa6582397f943fd9e05fc10c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20Fazekas?= Date: Mon, 1 Dec 2025 13:49:06 +0100 Subject: [PATCH 2/2] fix: remove extra blank lines in Kotlin files --- android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt | 3 +-- android/src/main/java/com/rive/RiveReactNativeView.kt | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt b/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt index 8adb6cce..f1abb1ff 100644 --- a/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt +++ b/android/src/main/java/com/margelo/nitro/rive/HybridRiveView.kt @@ -118,7 +118,6 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { override fun reset() = asyncExecuteOnUiThread { view.reset() } - override fun onEventListener(onEvent: (event: UnifiedRiveEvent) -> Unit) = executeOnUiThread { view.addEventListener(onEvent) } @@ -200,8 +199,8 @@ class HybridRiveView(val context: ThemedReactContext) : HybridRiveViewSpec() { } } } - } + private fun executeOnUiThread(action: () -> Unit) { context.currentActivity?.runOnUiThread { try { diff --git a/android/src/main/java/com/rive/RiveReactNativeView.kt b/android/src/main/java/com/rive/RiveReactNativeView.kt index 7915b65e..5137ee9e 100644 --- a/android/src/main/java/com/rive/RiveReactNativeView.kt +++ b/android/src/main/java/com/rive/RiveReactNativeView.kt @@ -190,7 +190,6 @@ class RiveReactNativeView(context: ThemedReactContext) : FrameLayout(context) { fun reset() = riveAnimationView?.reset() - fun addEventListener(onEvent: (event: RNEvent) -> Unit) { val eventListener = object : RiveFileController.RiveEventListener { override fun notifyEvent(event: RiveEvent) {