diff --git a/android/src/main/java/com/margelo/nitro/rive/EventPropertiesOutputExtensions.kt b/android/src/main/java/com/margelo/nitro/rive/EventPropertiesOutputExtensions.kt index a1f671c6..ba22794e 100644 --- a/android/src/main/java/com/margelo/nitro/rive/EventPropertiesOutputExtensions.kt +++ b/android/src/main/java/com/margelo/nitro/rive/EventPropertiesOutputExtensions.kt @@ -5,8 +5,8 @@ object EventPropertiesOutputExtensions { EventPropertiesOutput.First(value) fun string(value: String): EventPropertiesOutput = - EventPropertiesOutput.Second(value) + EventPropertiesOutput.Third(value) fun number(value: Double): EventPropertiesOutput = - EventPropertiesOutput.Third(value) + EventPropertiesOutput.Second(value) } diff --git a/example/__tests__/optional-prop-clear.harness.tsx b/example/__tests__/optional-prop-clear.harness.tsx new file mode 100644 index 00000000..4895082c --- /dev/null +++ b/example/__tests__/optional-prop-clear.harness.tsx @@ -0,0 +1,140 @@ +/** + * Fabric sends `null` (not `undefined`) when a prop is removed. Nitro's + * JSIConverter> only maps `undefined` to nullopt, so clearing + * an optional RiveView prop throws during commit — e.g. + * "RiveView.layoutScaleFactor: Value is null, expected a number" — + * https://github.com/mrousavy/nitro/issues/1184. + * + * The throw surfaces as a React error, not through onError, and an error + * boundary above the view would swallow it — hence the boundary here, which + * turns it into an assertable value. + */ +import { + describe, + it, + expect, + render, + waitFor, + cleanup, +} from 'react-native-harness'; +import { Component, type ReactNode } from 'react'; +import { View } from 'react-native'; +import { + RiveView, + RiveFileFactory, + DataBindMode, + Fit, + type RiveFile, + type RiveViewRef, +} from '@rive-app/react-native'; + +const QUICK_START = require('../assets/rive/quick_start.riv'); + +type Ctx = { + ref: RiveViewRef | null; + error: string | null; + thrown: string | null; +}; + +function createCtx(): Ctx { + return { ref: null, error: null, thrown: null }; +} + +class CatchCommitError extends Component< + { ctx: Ctx; children: ReactNode }, + { failed: boolean } +> { + state = { failed: false }; + + static getDerivedStateFromError() { + return { failed: true }; + } + + componentDidCatch(error: Error) { + this.props.ctx.thrown = error.message; + } + + render() { + return this.state.failed ? null : this.props.children; + } +} + +function Probe({ + file, + ctx, + dataBind, + layoutScaleFactor, +}: { + file: RiveFile; + ctx: Ctx; + dataBind?: DataBindMode; + layoutScaleFactor?: number; +}) { + return ( + + + (ctx.ref = r) }} + style={{ flex: 1 }} + file={file} + fit={Fit.Contain} + dataBind={dataBind} + layoutScaleFactor={layoutScaleFactor} + onError={(e) => (ctx.error = e.message)} + /> + + + ); +} + +async function renderAndWait(element: React.ReactElement, ctx: Ctx) { + const result = await render(element); + await waitFor(() => expect(ctx.ref).not.toBeNull(), { timeout: 5000 }); + await ctx.ref!.awaitViewReady(); + return result; +} + +describe('optional prop clear', () => { + it('clearing dataBind back to undefined restores the default mode', async () => { + const file = await RiveFileFactory.fromSource(QUICK_START, undefined); + const ctx = createCtx(); + + const { rerender } = await renderAndWait( + , + ctx + ); + expect(ctx.ref!.getViewModelInstance()).toBeUndefined(); + + // Removing the prop makes Fabric send null for it + await rerender(); + await new Promise((r) => setTimeout(r, 800)); + + expect(ctx.thrown).toBeNull(); + expect(ctx.error).toBeNull(); + // Back to the default Auto mode, which binds the default instance + expect(ctx.ref!.getViewModelInstance()).toBeDefined(); + + cleanup(); + }); + + it('clearing layoutScaleFactor back to undefined does not throw', async () => { + const file = await RiveFileFactory.fromSource(QUICK_START, undefined); + const ctx = createCtx(); + + const { rerender } = await renderAndWait( + , + ctx + ); + + // optional rejects the null sentinel outright + await rerender( + + ); + await new Promise((r) => setTimeout(r, 800)); + + expect(ctx.thrown).toBeNull(); + expect(ctx.error).toBeNull(); + + cleanup(); + }); +}); diff --git a/example/__tests__/view-recreate.harness.tsx b/example/__tests__/view-recreate.harness.tsx new file mode 100644 index 00000000..2fa36d14 --- /dev/null +++ b/example/__tests__/view-recreate.harness.tsx @@ -0,0 +1,145 @@ +import { + describe, + it, + expect, + render, + waitFor, + cleanup, +} from 'react-native-harness'; +import { useState } from 'react'; +import { View } from 'react-native'; +import { + RiveView, + RiveFileFactory, + Fit, + type RiveFile, + type RiveViewRef, +} from '@rive-app/react-native'; +import type { ViewModelInstance } from '@rive-app/react-native'; + +/** + * Fabric deletes a component view when its subtree stops being mounted + * (`display: 'none'`, or a react-native-screens screen frozen by + * `enableFreeze(true)`) and recreates it from the same, unchanged ShadowNode + * when the subtree comes back. The recreated view has to be configured from + * those props. + * + * On iOS it was not: nitro tracks props with `isDirty` flags stored on the + * shared Props object and clears them once applied, so the second view + * instance was handed a props object whose flags the first instance had + * already consumed. It never received its file, stayed blank forever, and the + * ref JS holds kept pointing at the dead view. See PR #365. + */ + +const QUICK_START = require('../assets/rive/quick_start.riv'); + +function expectDefined(value: T): asserts value is NonNullable { + expect(value).toBeDefined(); +} + +type TestContext = { + ref: RiveViewRef | null; + error: string | null; + setHidden: ((hidden: boolean) => void) | null; +}; + +// The visibility state lives here so that flipping it re-renders this +// component only, leaving the RiveView's own ShadowNode untouched — the +// situation a frozen screen creates. +function HideableRive({ + context, + file, + instance, +}: { + context: TestContext; + file: RiveFile; + instance: ViewModelInstance; +}) { + const [hidden, setHidden] = useState(false); + context.setHidden = setHidden; + + return ( + + ); +} + +// A trigger only reaches its listener while a live view advances the state +// machine the instance is bound to, which is what makes this a usable answer +// to "is the view still driving this data binding?". +async function triggerReachesListener( + instance: ViewModelInstance +): Promise { + const trigger = instance.triggerProperty('gameOver'); + expectDefined(trigger); + let fired = false; + const removeListener = trigger.addListener(() => { + fired = true; + }); + trigger.trigger(); + await waitFor( + () => { + expect(fired).toBe(true); + }, + { timeout: 1000 } + ).catch(() => {}); + removeListener(); + trigger.dispose(); + return fired; +} + +describe('view recreated by Fabric (PR #365)', () => { + it('keeps driving its data binding after hide/show', async () => { + const file = await RiveFileFactory.fromSource(QUICK_START, undefined); + const vm = file.defaultArtboardViewModel(); + expectDefined(vm); + const instance = vm.createDefaultInstance(); + expectDefined(instance); + + const context: TestContext = { ref: null, error: null, setHidden: null }; + + await render( + + ); + + await waitFor( + () => { + expect(context.ref).not.toBeNull(); + }, + { timeout: 5000 } + ); + await context.ref!.awaitViewReady(); + + // Control: the trigger reaches its listener while the view is alive, so a + // failure below means the view stopped working, not that the probe never did. + expect(await triggerReachesListener(instance)).toBe(true); + + context.setHidden!(true); + await new Promise((r) => setTimeout(r, 400)); + context.setHidden!(false); + await new Promise((r) => setTimeout(r, 600)); + + expect(context.error).toBeNull(); + expect(await triggerReachesListener(instance)).toBe(true); + + cleanup(); + }); +}); diff --git a/example/ios/Podfile b/example/ios/Podfile index fe285a35..97480889 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -58,5 +58,20 @@ target 'RiveExample' do # :ccache_enabled => true ) + # NitroModules 0.37.0 exposes `ReactProp.hpp` in its modulemap, which reaches + # `` through React's `RawValue.h`. glog 0.3.5 includes headers from + # inside `namespace google`, which is illegal once glog is imported as a module, so + # every target that builds the NitroModules module fails to compile. Same class of + # breakage as mrousavy/nitro#1520, which fixed only the `cxxreact` half of it in 0.37.0. + # Nothing in React Native `@import`s glog, so drop its modulemap and let every target + # include it textually. Remove once Nitro keeps React's renderer headers out of its + # public modulemap. + Dir.glob(File.join(__dir__, 'Pods', 'Target Support Files', '*', '*.xcconfig')).each do |xcconfig| + contents = File.read(xcconfig) + patched = contents.gsub( + /\s*(-Xcc\s+)?-fmodule-map-file="\$\{PODS_ROOT\}\/Headers\/Public\/glog\/glog\.modulemap"/, '' + ) + File.write(xcconfig, patched) if patched != contents + end end end diff --git a/example/package.json b/example/package.json index 0e3c0050..f3316de4 100644 --- a/example/package.json +++ b/example/package.json @@ -21,7 +21,7 @@ "react": "19.1.0", "react-native": "0.80.3", "react-native-gesture-handler": "2.29.1", - "react-native-nitro-modules": "0.35.10", + "react-native-nitro-modules": "0.37.0", "react-native-reanimated": "4.1.5", "react-native-safe-area-context": "^5.4.0", "react-native-screens": "~4.18.0", diff --git a/expo-example/package.json b/expo-example/package.json index be6b0353..5c0a5a1d 100644 --- a/expo-example/package.json +++ b/expo-example/package.json @@ -35,7 +35,7 @@ "react-dom": "19.1.0", "react-native": "0.81.5", "react-native-gesture-handler": "2.29.1", - "react-native-nitro-modules": "0.35.10", + "react-native-nitro-modules": "0.37.0", "react-native-reanimated": "4.1.5", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0", diff --git a/expo55-example/package.json b/expo55-example/package.json index 9c2b79ba..3ffa85f1 100644 --- a/expo55-example/package.json +++ b/expo55-example/package.json @@ -35,7 +35,7 @@ "react-dom": "19.2.0", "react-native": "0.83.4", "react-native-gesture-handler": "~2.29.0", - "react-native-nitro-modules": "0.35.10", + "react-native-nitro-modules": "0.37.0", "react-native-reanimated": "4.2.1", "react-native-safe-area-context": "~5.6.2", "react-native-screens": "~4.23.0", diff --git a/expo57-example/app.config.js b/expo57-example/app.config.js index 8dc23d0a..0c00789e 100644 --- a/expo57-example/app.config.js +++ b/expo57-example/app.config.js @@ -57,6 +57,7 @@ module.exports = { fonts: ['./assets/kanit_regular.ttf'], }, ], + './plugins/with-textual-glog', ], experiments: { typedRoutes: true, diff --git a/expo57-example/package.json b/expo57-example/package.json index 04bb4631..6cdd6b28 100644 --- a/expo57-example/package.json +++ b/expo57-example/package.json @@ -34,7 +34,7 @@ "react-dom": "19.2.3", "react-native": "0.86.0", "react-native-gesture-handler": "~2.32.0", - "react-native-nitro-modules": "0.35.10", + "react-native-nitro-modules": "0.37.0", "react-native-reanimated": "4.5.0", "react-native-safe-area-context": "~5.7.0", "react-native-screens": "4.25.2", diff --git a/expo57-example/plugins/with-textual-glog.js b/expo57-example/plugins/with-textual-glog.js new file mode 100644 index 00000000..17178260 --- /dev/null +++ b/expo57-example/plugins/with-textual-glog.js @@ -0,0 +1,41 @@ +const { withDangerousMod } = require('expo/config-plugins'); +const fs = require('fs'); +const path = require('path'); + +// NitroModules 0.37.0 exposes React's renderer headers in its modulemap, and they +// reach `` through `RawValue.h`. glog 0.3.5 includes headers from +// inside `namespace google`, which is illegal once glog is imported as a module, so +// every target that builds the NitroModules module fails to compile. Same class of +// breakage as mrousavy/nitro#1520, which fixed only the `cxxreact` half of it in +// 0.37.0. Nothing in React Native `@import`s glog, so drop its modulemap and let +// every target include it textually. Remove once Nitro keeps React's renderer +// headers out of its public modulemap. +const HOOK = ` + Dir.glob(File.join(__dir__, 'Pods', 'Target Support Files', '*', '*.xcconfig')).each do |xcconfig| + contents = File.read(xcconfig) + patched = contents.gsub( + /\\s*(-Xcc\\s+)?-fmodule-map-file="\\$\\{PODS_ROOT\\}\\/Headers\\/Public\\/glog\\/glog\\.modulemap"/, '' + ) + File.write(xcconfig, patched) if patched != contents + end +`; + +module.exports = function withTextualGlog(config) { + return withDangerousMod(config, [ + 'ios', + (cfg) => { + const podfile = path.join(cfg.modRequest.platformProjectRoot, 'Podfile'); + const contents = fs.readFileSync(podfile, 'utf8'); + if (contents.includes('glog.modulemap')) return cfg; + + const anchor = 'post_install do |installer|'; + if (!contents.includes(anchor)) { + throw new Error( + 'with-textual-glog: no post_install hook in the Podfile' + ); + } + fs.writeFileSync(podfile, contents.replace(anchor, anchor + '\n' + HOOK)); + return cfg; + }, + ]); +}; diff --git a/ios/EventPropertiesOutputExtensions.swift b/ios/EventPropertiesOutputExtensions.swift index d8250e09..a08df09c 100644 --- a/ios/EventPropertiesOutputExtensions.swift +++ b/ios/EventPropertiesOutputExtensions.swift @@ -6,10 +6,10 @@ extension EventPropertiesOutput { } static func string(_ value: String) -> EventPropertiesOutput { - return .second(value) + return .third(value) } static func number(_ value: Double) -> EventPropertiesOutput { - return .third(value) + return .second(value) } } diff --git a/nitrogen/generated/android/c++/JAlignment.hpp b/nitrogen/generated/android/c++/JAlignment.hpp index b2202d90..05706fd1 100644 --- a/nitrogen/generated/android/c++/JAlignment.hpp +++ b/nitrogen/generated/android/c++/JAlignment.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "Alignment" and the the Kotlin enum "Alignment". + * The C++ JNI bridge between the C++ enum "Alignment" and the Kotlin enum "Alignment". */ struct JAlignment final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Alignment;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Alignment;"; public: /** diff --git a/nitrogen/generated/android/c++/JAndroidRenderBackend.hpp b/nitrogen/generated/android/c++/JAndroidRenderBackend.hpp index 762c6190..c2412b60 100644 --- a/nitrogen/generated/android/c++/JAndroidRenderBackend.hpp +++ b/nitrogen/generated/android/c++/JAndroidRenderBackend.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "AndroidRenderBackend" and the the Kotlin enum "AndroidRenderBackend". + * The C++ JNI bridge between the C++ enum "AndroidRenderBackend" and the Kotlin enum "AndroidRenderBackend". */ struct JAndroidRenderBackend final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/AndroidRenderBackend;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/AndroidRenderBackend;"; public: /** diff --git a/nitrogen/generated/android/c++/JArtboardBy.hpp b/nitrogen/generated/android/c++/JArtboardBy.hpp index 3b8eab87..23e2a74e 100644 --- a/nitrogen/generated/android/c++/JArtboardBy.hpp +++ b/nitrogen/generated/android/c++/JArtboardBy.hpp @@ -20,11 +20,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "ArtboardBy" and the the Kotlin data class "ArtboardBy". + * The C++ JNI bridge between the C++ struct "ArtboardBy" and the Kotlin data class "ArtboardBy". */ struct JArtboardBy final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ArtboardBy;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/ArtboardBy;"; public: /** diff --git a/nitrogen/generated/android/c++/JArtboardByTypes.hpp b/nitrogen/generated/android/c++/JArtboardByTypes.hpp index 1332b18d..ec913dfc 100644 --- a/nitrogen/generated/android/c++/JArtboardByTypes.hpp +++ b/nitrogen/generated/android/c++/JArtboardByTypes.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "ArtboardByTypes" and the the Kotlin enum "ArtboardByTypes". + * The C++ JNI bridge between the C++ enum "ArtboardByTypes" and the Kotlin enum "ArtboardByTypes". */ struct JArtboardByTypes final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ArtboardByTypes;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/ArtboardByTypes;"; public: /** diff --git a/nitrogen/generated/android/c++/JDataBindByName.hpp b/nitrogen/generated/android/c++/JDataBindByName.hpp index 11c85e79..0c31262c 100644 --- a/nitrogen/generated/android/c++/JDataBindByName.hpp +++ b/nitrogen/generated/android/c++/JDataBindByName.hpp @@ -17,11 +17,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "DataBindByName" and the the Kotlin data class "DataBindByName". + * The C++ JNI bridge between the C++ struct "DataBindByName" and the Kotlin data class "DataBindByName". */ struct JDataBindByName final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/DataBindByName;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/DataBindByName;"; public: /** diff --git a/nitrogen/generated/android/c++/JDataBindMode.hpp b/nitrogen/generated/android/c++/JDataBindMode.hpp index 3c1480e7..347c9efa 100644 --- a/nitrogen/generated/android/c++/JDataBindMode.hpp +++ b/nitrogen/generated/android/c++/JDataBindMode.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "DataBindMode" and the the Kotlin enum "DataBindMode". + * The C++ JNI bridge between the C++ enum "DataBindMode" and the Kotlin enum "DataBindMode". */ struct JDataBindMode final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/DataBindMode;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/DataBindMode;"; public: /** diff --git a/nitrogen/generated/android/c++/JEventPropertiesOutput.cpp b/nitrogen/generated/android/c++/JEventPropertiesOutput.cpp index b628e155..b06c20b5 100644 --- a/nitrogen/generated/android/c++/JEventPropertiesOutput.cpp +++ b/nitrogen/generated/android/c++/JEventPropertiesOutput.cpp @@ -9,21 +9,21 @@ namespace margelo::nitro::rive { /** - * Converts JEventPropertiesOutput to std::variant + * Converts JEventPropertiesOutput to std::variant */ - std::variant JEventPropertiesOutput::toCpp() const { + std::variant JEventPropertiesOutput::toCpp() const { if (isInstanceOf(JEventPropertiesOutput_impl::First::javaClassStatic())) { // It's a `bool` auto jniValue = static_cast(this)->getValue(); return static_cast(jniValue); } else if (isInstanceOf(JEventPropertiesOutput_impl::Second::javaClassStatic())) { - // It's a `std::string` + // It's a `double` auto jniValue = static_cast(this)->getValue(); - return jniValue->toStdString(); + return jniValue; } else if (isInstanceOf(JEventPropertiesOutput_impl::Third::javaClassStatic())) { - // It's a `double` + // It's a `std::string` auto jniValue = static_cast(this)->getValue(); - return jniValue; + return jniValue->toStdString(); } throw std::invalid_argument("Variant is unknown Kotlin instance!"); } diff --git a/nitrogen/generated/android/c++/JEventPropertiesOutput.hpp b/nitrogen/generated/android/c++/JEventPropertiesOutput.hpp index 707ff32d..5f1a7916 100644 --- a/nitrogen/generated/android/c++/JEventPropertiesOutput.hpp +++ b/nitrogen/generated/android/c++/JEventPropertiesOutput.hpp @@ -22,37 +22,37 @@ namespace margelo::nitro::rive { */ class JEventPropertiesOutput: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput;"; static jni::local_ref create_0(jboolean value) { static const auto method = javaClassStatic()->getStaticMethod("create"); return method(javaClassStatic(), value); } - static jni::local_ref create_1(jni::alias_ref value) { - static const auto method = javaClassStatic()->getStaticMethod)>("create"); + static jni::local_ref create_1(double value) { + static const auto method = javaClassStatic()->getStaticMethod("create"); return method(javaClassStatic(), value); } - static jni::local_ref create_2(double value) { - static const auto method = javaClassStatic()->getStaticMethod("create"); + static jni::local_ref create_2(jni::alias_ref value) { + static const auto method = javaClassStatic()->getStaticMethod)>("create"); return method(javaClassStatic(), value); } - static jni::local_ref fromCpp(const std::variant& variant) { + static jni::local_ref fromCpp(const std::variant& variant) { switch (variant.index()) { case 0: return create_0(std::get<0>(variant)); - case 1: return create_1(jni::make_jstring(std::get<1>(variant))); - case 2: return create_2(std::get<2>(variant)); + case 1: return create_1(std::get<1>(variant)); + case 2: return create_2(jni::make_jstring(std::get<2>(variant))); default: throw std::invalid_argument("Variant holds unknown index! (" + std::to_string(variant.index()) + ")"); } } - [[nodiscard]] std::variant toCpp() const; + [[nodiscard]] std::variant toCpp() const; }; namespace JEventPropertiesOutput_impl { class First final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput$First;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput$First;"; [[nodiscard]] jboolean getValue() const { static const auto field = javaClassStatic()->getField("value"); @@ -62,20 +62,20 @@ namespace margelo::nitro::rive { class Second final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput$Second;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput$Second;"; - [[nodiscard]] jni::local_ref getValue() const { - static const auto field = javaClassStatic()->getField("value"); + [[nodiscard]] double getValue() const { + static const auto field = javaClassStatic()->getField("value"); return getFieldValue(field); } }; class Third final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput$Third;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/EventPropertiesOutput$Third;"; - [[nodiscard]] double getValue() const { - static const auto field = javaClassStatic()->getField("value"); + [[nodiscard]] jni::local_ref getValue() const { + static const auto field = javaClassStatic()->getField("value"); return getFieldValue(field); } }; diff --git a/nitrogen/generated/android/c++/JFit.hpp b/nitrogen/generated/android/c++/JFit.hpp index 4e936801..46f7273a 100644 --- a/nitrogen/generated/android/c++/JFit.hpp +++ b/nitrogen/generated/android/c++/JFit.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "Fit" and the the Kotlin enum "Fit". + * The C++ JNI bridge between the C++ enum "Fit" and the Kotlin enum "Fit". */ struct JFit final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Fit;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Fit;"; public: /** diff --git a/nitrogen/generated/android/c++/JFrameRateRange.hpp b/nitrogen/generated/android/c++/JFrameRateRange.hpp index ca5ecaf4..9faee858 100644 --- a/nitrogen/generated/android/c++/JFrameRateRange.hpp +++ b/nitrogen/generated/android/c++/JFrameRateRange.hpp @@ -17,11 +17,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "FrameRateRange" and the the Kotlin data class "FrameRateRange". + * The C++ JNI bridge between the C++ struct "FrameRateRange" and the Kotlin data class "FrameRateRange". */ struct JFrameRateRange final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/FrameRateRange;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/FrameRateRange;"; public: /** diff --git a/nitrogen/generated/android/c++/JFunc_void.hpp b/nitrogen/generated/android/c++/JFunc_void.hpp index 083013ff..3ab0d266 100644 --- a/nitrogen/generated/android/c++/JFunc_void.hpp +++ b/nitrogen/generated/android/c++/JFunc_void.hpp @@ -23,7 +23,7 @@ namespace margelo::nitro::rive { */ struct JFunc_void: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void;"; public: /** @@ -59,7 +59,7 @@ namespace margelo::nitro::rive { } public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_cxx;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_cxx;"; static void registerNatives() { registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_cxx::invoke_cxx)}); } diff --git a/nitrogen/generated/android/c++/JFunc_void_RiveError.hpp b/nitrogen/generated/android/c++/JFunc_void_RiveError.hpp index 7a850bdf..c4b1c2f9 100644 --- a/nitrogen/generated/android/c++/JFunc_void_RiveError.hpp +++ b/nitrogen/generated/android/c++/JFunc_void_RiveError.hpp @@ -28,7 +28,7 @@ namespace margelo::nitro::rive { */ struct JFunc_void_RiveError: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_RiveError;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_RiveError;"; public: /** @@ -64,7 +64,7 @@ namespace margelo::nitro::rive { } public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_RiveError_cxx;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_RiveError_cxx;"; static void registerNatives() { registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_RiveError_cxx::invoke_cxx)}); } diff --git a/nitrogen/generated/android/c++/JFunc_void_UnifiedRiveEvent.hpp b/nitrogen/generated/android/c++/JFunc_void_UnifiedRiveEvent.hpp index 5649b9c0..e02c99fc 100644 --- a/nitrogen/generated/android/c++/JFunc_void_UnifiedRiveEvent.hpp +++ b/nitrogen/generated/android/c++/JFunc_void_UnifiedRiveEvent.hpp @@ -32,7 +32,7 @@ namespace margelo::nitro::rive { */ struct JFunc_void_UnifiedRiveEvent: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_UnifiedRiveEvent;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_UnifiedRiveEvent;"; public: /** @@ -68,7 +68,7 @@ namespace margelo::nitro::rive { } public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_UnifiedRiveEvent_cxx;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_UnifiedRiveEvent_cxx;"; static void registerNatives() { registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_UnifiedRiveEvent_cxx::invoke_cxx)}); } diff --git a/nitrogen/generated/android/c++/JFunc_void_bool.hpp b/nitrogen/generated/android/c++/JFunc_void_bool.hpp index bf659485..0ee32eb5 100644 --- a/nitrogen/generated/android/c++/JFunc_void_bool.hpp +++ b/nitrogen/generated/android/c++/JFunc_void_bool.hpp @@ -23,7 +23,7 @@ namespace margelo::nitro::rive { */ struct JFunc_void_bool: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_bool;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_bool;"; public: /** @@ -59,7 +59,7 @@ namespace margelo::nitro::rive { } public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_bool_cxx;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_bool_cxx;"; static void registerNatives() { registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_bool_cxx::invoke_cxx)}); } diff --git a/nitrogen/generated/android/c++/JFunc_void_double.hpp b/nitrogen/generated/android/c++/JFunc_void_double.hpp index 28cacc93..4f5de2d2 100644 --- a/nitrogen/generated/android/c++/JFunc_void_double.hpp +++ b/nitrogen/generated/android/c++/JFunc_void_double.hpp @@ -23,7 +23,7 @@ namespace margelo::nitro::rive { */ struct JFunc_void_double: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_double;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_double;"; public: /** @@ -59,7 +59,7 @@ namespace margelo::nitro::rive { } public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_double_cxx;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_double_cxx;"; static void registerNatives() { registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_double_cxx::invoke_cxx)}); } diff --git a/nitrogen/generated/android/c++/JFunc_void_std__string.hpp b/nitrogen/generated/android/c++/JFunc_void_std__string.hpp index 7374b41a..e81695f7 100644 --- a/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +++ b/nitrogen/generated/android/c++/JFunc_void_std__string.hpp @@ -24,7 +24,7 @@ namespace margelo::nitro::rive { */ struct JFunc_void_std__string: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string;"; public: /** @@ -60,7 +60,7 @@ namespace margelo::nitro::rive { } public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string_cxx;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string_cxx;"; static void registerNatives() { registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_std__string_cxx::invoke_cxx)}); } diff --git a/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_std__string.hpp b/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_std__string.hpp index deb2cab1..34fc7549 100644 --- a/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_std__string.hpp +++ b/nitrogen/generated/android/c++/JFunc_void_std__string_std__string_std__string.hpp @@ -24,7 +24,7 @@ namespace margelo::nitro::rive { */ struct JFunc_void_std__string_std__string_std__string: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string_std__string_std__string;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string_std__string_std__string;"; public: /** @@ -60,7 +60,7 @@ namespace margelo::nitro::rive { } public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string_std__string_std__string_cxx;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Func_void_std__string_std__string_std__string_cxx;"; static void registerNatives() { registerHybrid({makeNativeMethod("invoke_cxx", JFunc_void_std__string_std__string_std__string_cxx::invoke_cxx)}); } diff --git a/nitrogen/generated/android/c++/JHybridBindableArtboardSpec.hpp b/nitrogen/generated/android/c++/JHybridBindableArtboardSpec.hpp index 4364ad82..7773edee 100644 --- a/nitrogen/generated/android/c++/JHybridBindableArtboardSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridBindableArtboardSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridBindableArtboardSpec: public virtual HybridBindableArtboardSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridBindableArtboardSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridBindableArtboardSpec;"; std::shared_ptr getJHybridBindableArtboardSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridBindableArtboardSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridBindableArtboardSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridFallbackFontSpec.hpp b/nitrogen/generated/android/c++/JHybridFallbackFontSpec.hpp index ecf7219f..96c71c76 100644 --- a/nitrogen/generated/android/c++/JHybridFallbackFontSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridFallbackFontSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridFallbackFontSpec: public virtual HybridFallbackFontSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridFallbackFontSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridFallbackFontSpec;"; std::shared_ptr getJHybridFallbackFontSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridFallbackFontSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridFallbackFontSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp b/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp index 31784a9c..38f1a779 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveFileFactorySpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveFileFactorySpec: public virtual HybridRiveFileFactorySpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileFactorySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileFactorySpec;"; std::shared_ptr getJHybridRiveFileFactorySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileFactorySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileFactorySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp b/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp index 70ec6ebb..6d73d9c4 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp @@ -95,16 +95,16 @@ namespace margelo::nitro::rive { std::vector JHybridRiveFileSpec::getArtboardNames() { static const auto method = _javaPart->javaClassStatic()->getMethod>()>("getArtboardNames"); auto __result = method(_javaPart); - return [&]() { - size_t __size = __result->size(); + return [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toStdString()); } return __vector; - }(); + }(__result); } // Methods @@ -134,16 +134,16 @@ namespace margelo::nitro::rive { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toStdString()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); @@ -207,16 +207,16 @@ namespace margelo::nitro::rive { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toStdString()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); @@ -237,16 +237,16 @@ namespace margelo::nitro::rive { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); diff --git a/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp index 7d3106d1..a4a379c7 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveFileSpec: public virtual HybridRiveFileSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileSpec;"; std::shared_ptr getJHybridRiveFileSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.cpp b/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.cpp index 0f641031..e0da616a 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.cpp @@ -92,16 +92,16 @@ namespace margelo::nitro::rive { } void JHybridRiveFontConfigSpec::setFontsForWeight(double weight, const std::vector>& fonts) { static const auto method = _javaPart->javaClassStatic()->getMethod> /* fonts */)>("setFontsForWeight"); - method(_javaPart, weight, [&]() { - size_t __size = fonts.size(); + method(_javaPart, weight, [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = fonts[__i]; + const auto& __element = __input[__i]; auto __elementJni = std::dynamic_pointer_cast(__element)->getJavaPart(); __array->setElement(__i, *__elementJni); } return __array; - }()); + }(fonts)); } std::shared_ptr> JHybridRiveFontConfigSpec::applyFallbackFonts() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("applyFallbackFonts"); diff --git a/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.hpp index d314d5c1..275490d0 100644 --- a/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveFontConfigSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveFontConfigSpec: public virtual HybridRiveFontConfigSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFontConfigSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFontConfigSpec;"; std::shared_ptr getJHybridRiveFontConfigSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFontConfigSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFontConfigSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveImageFactorySpec.hpp b/nitrogen/generated/android/c++/JHybridRiveImageFactorySpec.hpp index 80d33403..da88c3dd 100644 --- a/nitrogen/generated/android/c++/JHybridRiveImageFactorySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveImageFactorySpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveImageFactorySpec: public virtual HybridRiveImageFactorySpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageFactorySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageFactorySpec;"; std::shared_ptr getJHybridRiveImageFactorySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageFactorySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageFactorySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveImageSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveImageSpec.hpp index 4b544088..93c1899a 100644 --- a/nitrogen/generated/android/c++/JHybridRiveImageSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveImageSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveImageSpec: public virtual HybridRiveImageSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageSpec;"; std::shared_ptr getJHybridRiveImageSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveLoggerSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveLoggerSpec.hpp index 98890e0e..9ffe008a 100644 --- a/nitrogen/generated/android/c++/JHybridRiveLoggerSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveLoggerSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveLoggerSpec: public virtual HybridRiveLoggerSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveLoggerSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveLoggerSpec;"; std::shared_ptr getJHybridRiveLoggerSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveLoggerSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveLoggerSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveRuntimeSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveRuntimeSpec.hpp index 5e5694cf..e4e96379 100644 --- a/nitrogen/generated/android/c++/JHybridRiveRuntimeSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveRuntimeSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveRuntimeSpec: public virtual HybridRiveRuntimeSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveRuntimeSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveRuntimeSpec;"; std::shared_ptr getJHybridRiveRuntimeSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveRuntimeSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveRuntimeSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp b/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp index 91ea8d5c..9bbc3c34 100644 --- a/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridRiveViewSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridRiveViewSpec: public virtual HybridRiveViewSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveViewSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveViewSpec;"; std::shared_ptr getJHybridRiveViewSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveViewSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveViewSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelArtboardPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelArtboardPropertySpec.hpp index 7ce38ff4..127c79a9 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelArtboardPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelArtboardPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelArtboardPropertySpec: public virtual HybridViewModelArtboardPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelArtboardPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelArtboardPropertySpec;"; std::shared_ptr getJHybridViewModelArtboardPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelArtboardPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelArtboardPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelBooleanPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelBooleanPropertySpec.hpp index 2feeacf0..3d8efc88 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelBooleanPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelBooleanPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelBooleanPropertySpec: public virtual HybridViewModelBooleanPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelBooleanPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelBooleanPropertySpec;"; std::shared_ptr getJHybridViewModelBooleanPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelBooleanPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelBooleanPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelColorPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelColorPropertySpec.hpp index 1af876b9..f0393320 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelColorPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelColorPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelColorPropertySpec: public virtual HybridViewModelColorPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelColorPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelColorPropertySpec;"; std::shared_ptr getJHybridViewModelColorPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelColorPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelColorPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelEnumPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelEnumPropertySpec.hpp index 5522625f..4f0e2da6 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelEnumPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelEnumPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelEnumPropertySpec: public virtual HybridViewModelEnumPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelEnumPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelEnumPropertySpec;"; std::shared_ptr getJHybridViewModelEnumPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelEnumPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelEnumPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelImagePropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelImagePropertySpec.hpp index e5f8df1e..3056fa73 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelImagePropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelImagePropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelImagePropertySpec: public virtual HybridViewModelImagePropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelImagePropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelImagePropertySpec;"; std::shared_ptr getJHybridViewModelImagePropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelImagePropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelImagePropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp index 29dbc83c..98b960b6 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp @@ -107,16 +107,16 @@ namespace margelo::nitro::rive { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); diff --git a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp index 1fc897f3..78ce3e76 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridViewModelInstanceSpec: public virtual HybridViewModelInstanceSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelInstanceSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelInstanceSpec;"; std::shared_ptr getJHybridViewModelInstanceSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelInstanceSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelInstanceSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelListPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelListPropertySpec.hpp index be099179..3b8caac0 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelListPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelListPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelListPropertySpec: public virtual HybridViewModelListPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelListPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelListPropertySpec;"; std::shared_ptr getJHybridViewModelListPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelListPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelListPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelNumberPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelNumberPropertySpec.hpp index 96b0117e..0ebed682 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelNumberPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelNumberPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelNumberPropertySpec: public virtual HybridViewModelNumberPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelNumberPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelNumberPropertySpec;"; std::shared_ptr getJHybridViewModelNumberPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelNumberPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelNumberPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelPropertySpec.hpp index f7d7ffd0..65a5a167 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelPropertySpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridViewModelPropertySpec: public virtual HybridViewModelPropertySpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelPropertySpec;"; std::shared_ptr getJHybridViewModelPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp b/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp index 0946422b..ce723156 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp @@ -81,16 +81,16 @@ namespace margelo::nitro::rive { auto __promise = Promise>::create(); __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { auto __result = jni::static_ref_cast>(__boxedResult); - __promise->resolve([&]() { - size_t __size = __result->size(); + __promise->resolve([&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = __result->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toCpp()); } return __vector; - }()); + }(__result)); }); __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { jni::JniException __jniError(__throwable); diff --git a/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp index 340ebcc2..1bb04b72 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::rive { class JHybridViewModelSpec: public virtual HybridViewModelSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelSpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelSpec;"; std::shared_ptr getJHybridViewModelSpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelSpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelStringPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelStringPropertySpec.hpp index a6c5546d..13dd6c24 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelStringPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelStringPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelStringPropertySpec: public virtual HybridViewModelStringPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelStringPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelStringPropertySpec;"; std::shared_ptr getJHybridViewModelStringPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelStringPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelStringPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JHybridViewModelTriggerPropertySpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelTriggerPropertySpec.hpp index f5ca2492..3a8fc95c 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelTriggerPropertySpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelTriggerPropertySpec.hpp @@ -22,11 +22,11 @@ namespace margelo::nitro::rive { class JHybridViewModelTriggerPropertySpec: public virtual HybridViewModelTriggerPropertySpec, public virtual JHybridViewModelPropertySpec { public: struct JavaPart: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelTriggerPropertySpec;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelTriggerPropertySpec;"; std::shared_ptr getJHybridViewModelTriggerPropertySpec(); }; struct CxxPart: public jni::HybridClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelTriggerPropertySpec$CxxPart;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridViewModelTriggerPropertySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/nitrogen/generated/android/c++/JReferencedAssetsType.hpp b/nitrogen/generated/android/c++/JReferencedAssetsType.hpp index ec149ec7..b29d8f5c 100644 --- a/nitrogen/generated/android/c++/JReferencedAssetsType.hpp +++ b/nitrogen/generated/android/c++/JReferencedAssetsType.hpp @@ -26,11 +26,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "ReferencedAssetsType" and the the Kotlin data class "ReferencedAssetsType". + * The C++ JNI bridge between the C++ struct "ReferencedAssetsType" and the Kotlin data class "ReferencedAssetsType". */ struct JReferencedAssetsType final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ReferencedAssetsType;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/ReferencedAssetsType;"; public: /** diff --git a/nitrogen/generated/android/c++/JResolvedReferencedAsset.hpp b/nitrogen/generated/android/c++/JResolvedReferencedAsset.hpp index c9050602..591a356f 100644 --- a/nitrogen/generated/android/c++/JResolvedReferencedAsset.hpp +++ b/nitrogen/generated/android/c++/JResolvedReferencedAsset.hpp @@ -23,11 +23,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "ResolvedReferencedAsset" and the the Kotlin data class "ResolvedReferencedAsset". + * The C++ JNI bridge between the C++ struct "ResolvedReferencedAsset" and the Kotlin data class "ResolvedReferencedAsset". */ struct JResolvedReferencedAsset final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ResolvedReferencedAsset;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/ResolvedReferencedAsset;"; public: /** diff --git a/nitrogen/generated/android/c++/JRiveAssetType.hpp b/nitrogen/generated/android/c++/JRiveAssetType.hpp index eaa18e84..9cca618c 100644 --- a/nitrogen/generated/android/c++/JRiveAssetType.hpp +++ b/nitrogen/generated/android/c++/JRiveAssetType.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "RiveAssetType" and the the Kotlin enum "RiveAssetType". + * The C++ JNI bridge between the C++ enum "RiveAssetType" and the Kotlin enum "RiveAssetType". */ struct JRiveAssetType final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveAssetType;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveAssetType;"; public: /** diff --git a/nitrogen/generated/android/c++/JRiveEnumDefinition.hpp b/nitrogen/generated/android/c++/JRiveEnumDefinition.hpp index 1c772dc6..da89fd49 100644 --- a/nitrogen/generated/android/c++/JRiveEnumDefinition.hpp +++ b/nitrogen/generated/android/c++/JRiveEnumDefinition.hpp @@ -18,11 +18,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "RiveEnumDefinition" and the the Kotlin data class "RiveEnumDefinition". + * The C++ JNI bridge between the C++ struct "RiveEnumDefinition" and the Kotlin data class "RiveEnumDefinition". */ struct JRiveEnumDefinition final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveEnumDefinition;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveEnumDefinition;"; public: /** @@ -38,16 +38,16 @@ namespace margelo::nitro::rive { jni::local_ref> values = this->getFieldValue(fieldValues); return RiveEnumDefinition( name->toStdString(), - [&]() { - size_t __size = values->size(); + [&](auto&& __input) { + size_t __size = __input->size(); std::vector __vector; __vector.reserve(__size); for (size_t __i = 0; __i < __size; __i++) { - auto __element = values->getElement(__i); + auto __element = __input->getElement(__i); __vector.push_back(__element->toStdString()); } return __vector; - }() + }(values) ); } @@ -63,16 +63,16 @@ namespace margelo::nitro::rive { return create( clazz, jni::make_jstring(value.name), - [&]() { - size_t __size = value.values.size(); + [&](auto&& __input) { + size_t __size = __input.size(); jni::local_ref> __array = jni::JArrayClass::newArray(__size); for (size_t __i = 0; __i < __size; __i++) { - const auto& __element = value.values[__i]; + const auto& __element = __input[__i]; auto __elementJni = jni::make_jstring(__element); __array->setElement(__i, *__elementJni); } return __array; - }() + }(value.values) ); } }; diff --git a/nitrogen/generated/android/c++/JRiveError.hpp b/nitrogen/generated/android/c++/JRiveError.hpp index 6d52d3e8..9e1642e1 100644 --- a/nitrogen/generated/android/c++/JRiveError.hpp +++ b/nitrogen/generated/android/c++/JRiveError.hpp @@ -19,11 +19,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "RiveError" and the the Kotlin data class "RiveError". + * The C++ JNI bridge between the C++ struct "RiveError" and the Kotlin data class "RiveError". */ struct JRiveError final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveError;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveError;"; public: /** diff --git a/nitrogen/generated/android/c++/JRiveErrorType.hpp b/nitrogen/generated/android/c++/JRiveErrorType.hpp index a41e8e7b..28e39a3f 100644 --- a/nitrogen/generated/android/c++/JRiveErrorType.hpp +++ b/nitrogen/generated/android/c++/JRiveErrorType.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "RiveErrorType" and the the Kotlin enum "RiveErrorType". + * The C++ JNI bridge between the C++ enum "RiveErrorType" and the Kotlin enum "RiveErrorType". */ struct JRiveErrorType final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveErrorType;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveErrorType;"; public: /** diff --git a/nitrogen/generated/android/c++/JRiveEventType.hpp b/nitrogen/generated/android/c++/JRiveEventType.hpp index 98a4ff4d..59ab4648 100644 --- a/nitrogen/generated/android/c++/JRiveEventType.hpp +++ b/nitrogen/generated/android/c++/JRiveEventType.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "RiveEventType" and the the Kotlin enum "RiveEventType". + * The C++ JNI bridge between the C++ enum "RiveEventType" and the Kotlin enum "RiveEventType". */ struct JRiveEventType final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveEventType;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/RiveEventType;"; public: /** diff --git a/nitrogen/generated/android/c++/JSemantics.hpp b/nitrogen/generated/android/c++/JSemantics.hpp index 6ea66093..f0ae1366 100644 --- a/nitrogen/generated/android/c++/JSemantics.hpp +++ b/nitrogen/generated/android/c++/JSemantics.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "Semantics" and the the Kotlin enum "Semantics". + * The C++ JNI bridge between the C++ enum "Semantics" and the Kotlin enum "Semantics". */ struct JSemantics final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Semantics;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Semantics;"; public: /** diff --git a/nitrogen/generated/android/c++/JUnifiedRiveEvent.hpp b/nitrogen/generated/android/c++/JUnifiedRiveEvent.hpp index 7e77fedf..79226bd1 100644 --- a/nitrogen/generated/android/c++/JUnifiedRiveEvent.hpp +++ b/nitrogen/generated/android/c++/JUnifiedRiveEvent.hpp @@ -23,11 +23,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "UnifiedRiveEvent" and the the Kotlin data class "UnifiedRiveEvent". + * The C++ JNI bridge between the C++ struct "UnifiedRiveEvent" and the Kotlin data class "UnifiedRiveEvent". */ struct JUnifiedRiveEvent final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/UnifiedRiveEvent;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/UnifiedRiveEvent;"; public: /** @@ -54,7 +54,7 @@ namespace margelo::nitro::rive { type->toCpp(), delay != nullptr ? std::make_optional(delay->value()) : std::nullopt, properties != nullptr ? std::make_optional([&]() { - std::unordered_map> __map; + std::unordered_map> __map; __map.reserve(properties->size()); for (const auto& __entry : *properties) { __map.emplace(__entry.first->toStdString(), __entry.second->toCpp()); diff --git a/nitrogen/generated/android/c++/JVariant_Double_FrameRateRange.hpp b/nitrogen/generated/android/c++/JVariant_Double_FrameRateRange.hpp index df82fbd9..66c293f4 100644 --- a/nitrogen/generated/android/c++/JVariant_Double_FrameRateRange.hpp +++ b/nitrogen/generated/android/c++/JVariant_Double_FrameRateRange.hpp @@ -24,7 +24,7 @@ namespace margelo::nitro::rive { */ class JVariant_Double_FrameRateRange: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_Double_FrameRateRange;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_Double_FrameRateRange;"; static jni::local_ref create_0(double value) { static const auto method = javaClassStatic()->getStaticMethod("create"); @@ -49,7 +49,7 @@ namespace margelo::nitro::rive { namespace JVariant_Double_FrameRateRange_impl { class First final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_Double_FrameRateRange$First;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_Double_FrameRateRange$First;"; [[nodiscard]] double getValue() const { static const auto field = javaClassStatic()->getField("value"); @@ -59,7 +59,7 @@ namespace margelo::nitro::rive { class Second final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_Double_FrameRateRange$Second;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_Double_FrameRateRange$Second;"; [[nodiscard]] jni::local_ref getValue() const { static const auto field = javaClassStatic()->getField("value"); diff --git a/nitrogen/generated/android/c++/JVariant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.hpp b/nitrogen/generated/android/c++/JVariant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.hpp index d2370928..ff8eb98d 100644 --- a/nitrogen/generated/android/c++/JVariant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.hpp +++ b/nitrogen/generated/android/c++/JVariant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.hpp @@ -29,7 +29,7 @@ namespace margelo::nitro::rive { */ class JVariant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName;"; static jni::local_ref create_0(jni::alias_ref value) { static const auto method = javaClassStatic()->getStaticMethod)>("create"); @@ -59,7 +59,7 @@ namespace margelo::nitro::rive { namespace JVariant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName_impl { class First final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName$First;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName$First;"; [[nodiscard]] jni::local_ref getValue() const { static const auto field = javaClassStatic()->getField("value"); @@ -69,7 +69,7 @@ namespace margelo::nitro::rive { class Second final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName$Second;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName$Second;"; [[nodiscard]] jni::local_ref getValue() const { static const auto field = javaClassStatic()->getField("value"); @@ -79,7 +79,7 @@ namespace margelo::nitro::rive { class Third final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName$Third;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName$Third;"; [[nodiscard]] jni::local_ref getValue() const { static const auto field = javaClassStatic()->getField("value"); diff --git a/nitrogen/generated/android/c++/JViewModelPropertyInfo.hpp b/nitrogen/generated/android/c++/JViewModelPropertyInfo.hpp index f791ae80..dffaa4ed 100644 --- a/nitrogen/generated/android/c++/JViewModelPropertyInfo.hpp +++ b/nitrogen/generated/android/c++/JViewModelPropertyInfo.hpp @@ -19,11 +19,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ struct "ViewModelPropertyInfo" and the the Kotlin data class "ViewModelPropertyInfo". + * The C++ JNI bridge between the C++ struct "ViewModelPropertyInfo" and the Kotlin data class "ViewModelPropertyInfo". */ struct JViewModelPropertyInfo final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ViewModelPropertyInfo;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/ViewModelPropertyInfo;"; public: /** diff --git a/nitrogen/generated/android/c++/JViewModelPropertyType.hpp b/nitrogen/generated/android/c++/JViewModelPropertyType.hpp index 9ef32283..2530ada3 100644 --- a/nitrogen/generated/android/c++/JViewModelPropertyType.hpp +++ b/nitrogen/generated/android/c++/JViewModelPropertyType.hpp @@ -15,11 +15,11 @@ namespace margelo::nitro::rive { using namespace facebook; /** - * The C++ JNI bridge between the C++ enum "ViewModelPropertyType" and the the Kotlin enum "ViewModelPropertyType". + * The C++ JNI bridge between the C++ enum "ViewModelPropertyType" and the Kotlin enum "ViewModelPropertyType". */ struct JViewModelPropertyType final: public jni::JavaClass { public: - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ViewModelPropertyType;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/ViewModelPropertyType;"; public: /** diff --git a/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.cpp b/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.cpp index ecfe8860..5d6af4f8 100644 --- a/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.cpp +++ b/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.cpp @@ -15,85 +15,114 @@ namespace margelo::nitro::rive::views { using namespace facebook; using ConcreteStateData = react::ConcreteState; -void JHybridRiveViewStateUpdater::updateViewProps(jni::alias_ref /* class */, - jni::alias_ref javaView, - jni::alias_ref stateWrapperInterface) { - std::shared_ptr hybridView = javaView->getJHybridRiveViewSpec(); - +std::shared_ptr JHybridRiveViewStateUpdater::getPropsFromStateWrapper( + jni::alias_ref stateWrapper) { + if (stateWrapper.get() == nullptr) { + return nullptr; + } // Get concrete StateWrapperImpl from passed StateWrapper interface object - jobject rawStateWrapper = stateWrapperInterface.get(); - if (!stateWrapperInterface->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] { - throw std::runtime_error("StateWrapper is not a StateWrapperImpl"); + jobject rawStateWrapper = stateWrapper.get(); + if (!stateWrapper->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] { + throw std::runtime_error("StateWrapper is not a StateWrapperImpl"); + } + auto stateWrapperImpl = jni::alias_ref{ + static_cast(rawStateWrapper) + }; + std::shared_ptr state = stateWrapperImpl->cthis()->getState(); + if (state == nullptr) { + return nullptr; } - auto stateWrapper = jni::alias_ref{ - static_cast(rawStateWrapper)}; - std::shared_ptr state = stateWrapper->cthis()->getState(); auto concreteState = std::static_pointer_cast(state); const HybridRiveViewState& data = concreteState->getData(); - const std::shared_ptr& props = data.getProps(); + const std::shared_ptr& props = data.getProps(); if (props == nullptr) [[unlikely]] { - // Props aren't set yet! throw std::runtime_error("HybridRiveViewState's data doesn't contain any props!"); } + return props; +} + +void JHybridRiveViewStateUpdater::updateViewProps(jni::alias_ref /* class */, + jni::alias_ref javaView, + jni::alias_ref newState, + jni::alias_ref oldState) { + std::shared_ptr hybridView = javaView->getJHybridRiveViewSpec(); + std::shared_ptr newProps = getPropsFromStateWrapper(newState); + std::shared_ptr oldProps = getPropsFromStateWrapper(oldState); + if (newProps == nullptr) [[unlikely]] { + throw std::runtime_error("Current StateWrapper doesn't contain any props!"); + } - // Update all props if they are dirty - if (props->artboardName.isDirty) { - hybridView->setArtboardName(props->artboardName.value); - props->artboardName.isDirty = false; + // Update only props that differ from the previous State snapshot. + if (oldProps == nullptr + ? newProps->artboardName.isProvided() + : !newProps->artboardName.hasSameValue(oldProps->artboardName)) { + hybridView->setArtboardName(newProps->artboardName.get()); } - if (props->stateMachineName.isDirty) { - hybridView->setStateMachineName(props->stateMachineName.value); - props->stateMachineName.isDirty = false; + if (oldProps == nullptr + ? newProps->stateMachineName.isProvided() + : !newProps->stateMachineName.hasSameValue(oldProps->stateMachineName)) { + hybridView->setStateMachineName(newProps->stateMachineName.get()); } - if (props->autoPlay.isDirty) { - hybridView->setAutoPlay(props->autoPlay.value); - props->autoPlay.isDirty = false; + if (oldProps == nullptr + ? newProps->autoPlay.isProvided() + : !newProps->autoPlay.hasSameValue(oldProps->autoPlay)) { + hybridView->setAutoPlay(newProps->autoPlay.get()); } - if (props->file.isDirty) { - hybridView->setFile(props->file.value); - props->file.isDirty = false; + if (oldProps == nullptr + ? newProps->file.isProvided() + : !newProps->file.hasSameValue(oldProps->file)) { + hybridView->setFile(newProps->file.get()); } - if (props->alignment.isDirty) { - hybridView->setAlignment(props->alignment.value); - props->alignment.isDirty = false; + if (oldProps == nullptr + ? newProps->alignment.isProvided() + : !newProps->alignment.hasSameValue(oldProps->alignment)) { + hybridView->setAlignment(newProps->alignment.get()); } - if (props->fit.isDirty) { - hybridView->setFit(props->fit.value); - props->fit.isDirty = false; + if (oldProps == nullptr + ? newProps->fit.isProvided() + : !newProps->fit.hasSameValue(oldProps->fit)) { + hybridView->setFit(newProps->fit.get()); } - if (props->layoutScaleFactor.isDirty) { - hybridView->setLayoutScaleFactor(props->layoutScaleFactor.value); - props->layoutScaleFactor.isDirty = false; + if (oldProps == nullptr + ? newProps->layoutScaleFactor.isProvided() + : !newProps->layoutScaleFactor.hasSameValue(oldProps->layoutScaleFactor)) { + hybridView->setLayoutScaleFactor(newProps->layoutScaleFactor.get()); } - if (props->frameRate.isDirty) { - hybridView->setFrameRate(props->frameRate.value); - props->frameRate.isDirty = false; + if (oldProps == nullptr + ? newProps->frameRate.isProvided() + : !newProps->frameRate.hasSameValue(oldProps->frameRate)) { + hybridView->setFrameRate(newProps->frameRate.get()); } - if (props->semantics.isDirty) { - hybridView->setSemantics(props->semantics.value); - props->semantics.isDirty = false; + if (oldProps == nullptr + ? newProps->semantics.isProvided() + : !newProps->semantics.hasSameValue(oldProps->semantics)) { + hybridView->setSemantics(newProps->semantics.get()); } - if (props->dataBind.isDirty) { - hybridView->setDataBind(props->dataBind.value); - props->dataBind.isDirty = false; + if (oldProps == nullptr + ? newProps->dataBind.isProvided() + : !newProps->dataBind.hasSameValue(oldProps->dataBind)) { + hybridView->setDataBind(newProps->dataBind.get()); } - if (props->onError.isDirty) { - hybridView->setOnError(props->onError.value); - props->onError.isDirty = false; + if (oldProps == nullptr + ? newProps->onError.isProvided() + : !newProps->onError.hasSameValue(oldProps->onError)) { + hybridView->setOnError(newProps->onError.get()); } - if (props->onStop.isDirty) { - hybridView->setOnStop(props->onStop.value); - props->onStop.isDirty = false; + if (oldProps == nullptr + ? newProps->onStop.isProvided() + : !newProps->onStop.hasSameValue(oldProps->onStop)) { + hybridView->setOnStop(newProps->onStop.get()); } // Update hybridRef if it changed - if (props->hybridRef.isDirty) { + if (oldProps == nullptr + ? newProps->hybridRef.isProvided() + : !newProps->hybridRef.hasSameValue(oldProps->hybridRef)) { // hybridRef changed - call it with new this - const auto& maybeFunc = props->hybridRef.value; + const auto& maybeFunc = newProps->hybridRef.get(); if (maybeFunc.has_value()) { maybeFunc.value()(hybridView); } - props->hybridRef.isDirty = false; } } diff --git a/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.hpp b/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.hpp index 03b58dac..7c978528 100644 --- a/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.hpp +++ b/nitrogen/generated/android/c++/views/JHybridRiveViewStateUpdater.hpp @@ -31,7 +31,12 @@ class JHybridRiveViewStateUpdater final: public jni::JavaClass /* class */, jni::alias_ref view, - jni::alias_ref stateWrapperInterface); + jni::alias_ref newState, + jni::alias_ref oldState); + +private: + static std::shared_ptr getPropsFromStateWrapper( + jni::alias_ref stateWrapper); public: static void registerNatives() { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ArtboardBy.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ArtboardBy.kt index 94f2b65f..a8e32fea 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ArtboardBy.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ArtboardBy.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -29,6 +30,22 @@ data class ArtboardBy( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is ArtboardBy) return false + return Objects.deepEquals(this.type, other.type) + && Objects.deepEquals(this.index, other.index) + && Objects.deepEquals(this.name, other.name) + } + + override fun hashCode(): Int { + return arrayOf( + type, + index, + name + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/DataBindByName.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/DataBindByName.kt index 0c86521b..32450fd2 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/DataBindByName.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/DataBindByName.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -23,6 +24,18 @@ data class DataBindByName( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is DataBindByName) return false + return Objects.deepEquals(this.byName, other.byName) + } + + override fun hashCode(): Int { + return arrayOf( + byName + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/EventPropertiesOutput.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/EventPropertiesOutput.kt index 11b8e926..9928b33d 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/EventPropertiesOutput.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/EventPropertiesOutput.kt @@ -11,7 +11,7 @@ import com.facebook.proguard.annotations.DoNotStrip /** - * Represents the TypeScript variant "Boolean | String | Double". + * Represents the TypeScript variant "Boolean | Double | String". */ @Suppress("ClassName") @DoNotStrip @@ -19,9 +19,27 @@ sealed class EventPropertiesOutput { @DoNotStrip data class First(@DoNotStrip val value: Boolean): EventPropertiesOutput() @DoNotStrip - data class Second(@DoNotStrip val value: String): EventPropertiesOutput() + data class Second(@DoNotStrip val value: Double): EventPropertiesOutput() @DoNotStrip - data class Third(@DoNotStrip val value: Double): EventPropertiesOutput() + data class Third(@DoNotStrip val value: String): EventPropertiesOutput() + + inline fun asType(): T? { + return when (this) { + is First -> (value) as? T + is Second -> (value) as? T + is Third -> (value) as? T + } + } + inline fun isType(): Boolean { + return asType() != null + } + inline fun match(first: (Boolean) -> R, second: (Double) -> R, third: (String) -> R): R { + return when (this) { + is First -> first(value) + is Second -> second(value) + is Third -> third(value) + } + } val isFirst: Boolean get() = this is First @@ -34,32 +52,24 @@ sealed class EventPropertiesOutput { val value = (this as? First)?.value ?: return null return value } - fun asSecondOrNull(): String? { + fun asSecondOrNull(): Double? { val value = (this as? Second)?.value ?: return null return value } - fun asThirdOrNull(): Double? { + fun asThirdOrNull(): String? { val value = (this as? Third)?.value ?: return null return value } - inline fun match(first: (Boolean) -> R, second: (String) -> R, third: (Double) -> R): R { - return when (this) { - is First -> first(value) - is Second -> second(value) - is Third -> third(value) - } - } - companion object { @JvmStatic @DoNotStrip fun create(value: Boolean): EventPropertiesOutput = First(value) @JvmStatic @DoNotStrip - fun create(value: String): EventPropertiesOutput = Second(value) + fun create(value: Double): EventPropertiesOutput = Second(value) @JvmStatic @DoNotStrip - fun create(value: Double): EventPropertiesOutput = Third(value) + fun create(value: String): EventPropertiesOutput = Third(value) } } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/FrameRateRange.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/FrameRateRange.kt index 2c821807..3add72fb 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/FrameRateRange.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/FrameRateRange.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -29,6 +30,22 @@ data class FrameRateRange( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is FrameRateRange) return false + return Objects.deepEquals(this.minimum, other.minimum) + && Objects.deepEquals(this.maximum, other.maximum) + && Objects.deepEquals(this.preferred, other.preferred) + } + + override fun hashCode(): Int { + return arrayOf( + minimum, + maximum, + preferred + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void.kt index d59786dc..7a57fe63 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip -import dalvik.annotation.optimization.FastNative /** @@ -59,7 +58,6 @@ class Func_void_cxx: Func_void { override fun invoke(): Unit = invoke_cxx() - @FastNative private external fun invoke_cxx(): Unit } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_RiveError.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_RiveError.kt index 4e24e28a..7f79e402 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_RiveError.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_RiveError.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip -import dalvik.annotation.optimization.FastNative /** @@ -59,7 +58,6 @@ class Func_void_RiveError_cxx: Func_void_RiveError { override fun invoke(error: RiveError): Unit = invoke_cxx(error) - @FastNative private external fun invoke_cxx(error: RiveError): Unit } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_UnifiedRiveEvent.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_UnifiedRiveEvent.kt index a401713d..4e7077c6 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_UnifiedRiveEvent.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_UnifiedRiveEvent.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip -import dalvik.annotation.optimization.FastNative /** @@ -59,7 +58,6 @@ class Func_void_UnifiedRiveEvent_cxx: Func_void_UnifiedRiveEvent { override fun invoke(event: UnifiedRiveEvent): Unit = invoke_cxx(event) - @FastNative private external fun invoke_cxx(event: UnifiedRiveEvent): Unit } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_bool.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_bool.kt index 27925484..03f2d7f6 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_bool.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_bool.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip -import dalvik.annotation.optimization.FastNative /** @@ -59,7 +58,6 @@ class Func_void_bool_cxx: Func_void_bool { override fun invoke(value: Boolean): Unit = invoke_cxx(value) - @FastNative private external fun invoke_cxx(value: Boolean): Unit } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_double.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_double.kt index 5f885183..7e1e5824 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_double.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_double.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip -import dalvik.annotation.optimization.FastNative /** @@ -59,7 +58,6 @@ class Func_void_double_cxx: Func_void_double { override fun invoke(value: Double): Unit = invoke_cxx(value) - @FastNative private external fun invoke_cxx(value: Double): Unit } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string.kt index 65e2b6ef..1e5b5a16 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip -import dalvik.annotation.optimization.FastNative /** @@ -59,7 +58,6 @@ class Func_void_std__string_cxx: Func_void_std__string { override fun invoke(value: String): Unit = invoke_cxx(value) - @FastNative private external fun invoke_cxx(value: String): Unit } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string_std__string_std__string.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string_std__string_std__string.kt index 20a3dd14..47cd3add 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string_std__string_std__string.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Func_void_std__string_std__string_std__string.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip -import dalvik.annotation.optimization.FastNative /** @@ -59,7 +58,6 @@ class Func_void_std__string_std__string_std__string_cxx: Func_void_std__string_s override fun invoke(level: String, tag: String, message: String): Unit = invoke_cxx(level,tag,message) - @FastNative private external fun invoke_cxx(level: String, tag: String, message: String): Unit } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridBindableArtboardSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridBindableArtboardSpec.kt index e0fea0c5..58ca9303 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridBindableArtboardSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridBindableArtboardSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -42,6 +43,7 @@ abstract class HybridBindableArtboardSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridBindableArtboardSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridBindableArtboardSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridFallbackFontSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridFallbackFontSpec.kt index d4326609..21f46f21 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridFallbackFontSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridFallbackFontSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -40,6 +41,7 @@ abstract class HybridFallbackFontSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridFallbackFontSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridFallbackFontSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt index 21fe7625..1278baf1 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileFactorySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.ArrayBuffer import com.margelo.nitro.core.HybridObject @@ -58,6 +59,7 @@ abstract class HybridRiveFileFactorySpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridRiveFileFactorySpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveFileFactorySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt index ebdd4e7d..5dc583a2 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -93,6 +94,7 @@ abstract class HybridRiveFileSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridRiveFileSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveFileSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFontConfigSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFontConfigSpec.kt index 63e660a2..8b48bfb4 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFontConfigSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFontConfigSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.ArrayBuffer import com.margelo.nitro.core.HybridObject @@ -72,6 +73,7 @@ abstract class HybridRiveFontConfigSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridRiveFontConfigSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveFontConfigSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageFactorySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageFactorySpec.kt index d1cc5005..085683d9 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageFactorySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageFactorySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.ArrayBuffer import com.margelo.nitro.core.HybridObject @@ -52,6 +53,7 @@ abstract class HybridRiveImageFactorySpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridRiveImageFactorySpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveImageFactorySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageSpec.kt index 3c5152a6..fc395e53 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveImageSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -42,6 +43,7 @@ abstract class HybridRiveImageSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridRiveImageSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveImageSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveLoggerSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveLoggerSpec.kt index ec4aee5b..28badf99 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveLoggerSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveLoggerSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -55,6 +56,7 @@ abstract class HybridRiveLoggerSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridRiveLoggerSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveLoggerSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveRuntimeSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveRuntimeSpec.kt index b3c4ab56..84e0a254 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveRuntimeSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveRuntimeSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -53,6 +54,7 @@ abstract class HybridRiveRuntimeSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridRiveRuntimeSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveRuntimeSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { 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 a3e782de..020fb97b 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveViewSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveViewSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject import com.margelo.nitro.views.HybridView @@ -195,6 +196,7 @@ abstract class HybridRiveViewSpec: HybridView() { @Keep protected open class CxxPart(javaPart: HybridRiveViewSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridRiveViewSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelArtboardPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelArtboardPropertySpec.kt index f5e94172..57be7f93 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelArtboardPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelArtboardPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -42,6 +43,7 @@ abstract class HybridViewModelArtboardPropertySpec: HybridViewModelPropertySpec( @Keep protected open class CxxPart(javaPart: HybridViewModelArtboardPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelArtboardPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelBooleanPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelBooleanPropertySpec.kt index 67f06504..b8f94833 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelBooleanPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelBooleanPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -68,6 +69,7 @@ abstract class HybridViewModelBooleanPropertySpec: HybridViewModelPropertySpec() @Keep protected open class CxxPart(javaPart: HybridViewModelBooleanPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelBooleanPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelColorPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelColorPropertySpec.kt index 52bc7aa5..dc4f5cbf 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelColorPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelColorPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -68,6 +69,7 @@ abstract class HybridViewModelColorPropertySpec: HybridViewModelPropertySpec() { @Keep protected open class CxxPart(javaPart: HybridViewModelColorPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelColorPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelEnumPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelEnumPropertySpec.kt index baf26935..1289efaa 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelEnumPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelEnumPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -68,6 +69,7 @@ abstract class HybridViewModelEnumPropertySpec: HybridViewModelPropertySpec() { @Keep protected open class CxxPart(javaPart: HybridViewModelEnumPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelEnumPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelImagePropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelImagePropertySpec.kt index de423447..7bf67057 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelImagePropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelImagePropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -55,6 +56,7 @@ abstract class HybridViewModelImagePropertySpec: HybridViewModelPropertySpec() { @Keep protected open class CxxPart(javaPart: HybridViewModelImagePropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelImagePropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt index 3907b537..370dc566 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -93,6 +94,7 @@ abstract class HybridViewModelInstanceSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridViewModelInstanceSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridViewModelInstanceSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelListPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelListPropertySpec.kt index 0247468c..d0b9e7ea 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelListPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelListPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -106,6 +107,7 @@ abstract class HybridViewModelListPropertySpec: HybridViewModelPropertySpec() { @Keep protected open class CxxPart(javaPart: HybridViewModelListPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelListPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelNumberPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelNumberPropertySpec.kt index c52be64a..3c1efcf0 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelNumberPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelNumberPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -68,6 +69,7 @@ abstract class HybridViewModelNumberPropertySpec: HybridViewModelPropertySpec() @Keep protected open class CxxPart(javaPart: HybridViewModelNumberPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelNumberPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelPropertySpec.kt index 22a65748..ca61e770 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -40,6 +41,7 @@ abstract class HybridViewModelPropertySpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridViewModelPropertySpec): HybridObject.CxxPart(javaPart) { // C++ JHybridViewModelPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt index 1e8f63ac..c68434fe 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -89,6 +90,7 @@ abstract class HybridViewModelSpec: HybridObject() { @Keep protected open class CxxPart(javaPart: HybridViewModelSpec): HybridObject.CxxPart(javaPart) { // C++ JHybridViewModelSpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelStringPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelStringPropertySpec.kt index 9dc21f6d..9c537a6e 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelStringPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelStringPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.Promise import com.margelo.nitro.core.HybridObject @@ -68,6 +69,7 @@ abstract class HybridViewModelStringPropertySpec: HybridViewModelPropertySpec() @Keep protected open class CxxPart(javaPart: HybridViewModelStringPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelStringPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelTriggerPropertySpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelTriggerPropertySpec.kt index 8b8fe192..8debcb01 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelTriggerPropertySpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelTriggerPropertySpec.kt @@ -10,6 +10,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip +import dalvik.annotation.optimization.FastNative import com.margelo.nitro.core.HybridObject /** @@ -55,6 +56,7 @@ abstract class HybridViewModelTriggerPropertySpec: HybridViewModelPropertySpec() @Keep protected open class CxxPart(javaPart: HybridViewModelTriggerPropertySpec): HybridViewModelPropertySpec.CxxPart(javaPart) { // C++ JHybridViewModelTriggerPropertySpec::CxxPart::initHybrid(...) + @FastNative external override fun initHybrid(): HybridData } override fun createCxxPart(): CxxPart { diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ReferencedAssetsType.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ReferencedAssetsType.kt index 3742280b..11928bb0 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ReferencedAssetsType.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ReferencedAssetsType.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -23,6 +24,18 @@ data class ReferencedAssetsType( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is ReferencedAssetsType) return false + return Objects.deepEquals(this.data, other.data) + } + + override fun hashCode(): Int { + return arrayOf( + data + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ResolvedReferencedAsset.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ResolvedReferencedAsset.kt index a996359c..b38b5164 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ResolvedReferencedAsset.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ResolvedReferencedAsset.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -38,6 +39,28 @@ data class ResolvedReferencedAsset( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is ResolvedReferencedAsset) return false + return Objects.deepEquals(this.sourceUrl, other.sourceUrl) + && Objects.deepEquals(this.sourceAsset, other.sourceAsset) + && Objects.deepEquals(this.sourceAssetId, other.sourceAssetId) + && Objects.deepEquals(this.path, other.path) + && Objects.deepEquals(this.image, other.image) + && Objects.deepEquals(this.type, other.type) + } + + override fun hashCode(): Int { + return arrayOf( + sourceUrl, + sourceAsset, + sourceAssetId, + path, + image, + type + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveEnumDefinition.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveEnumDefinition.kt index a463258a..542621ba 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveEnumDefinition.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveEnumDefinition.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -26,6 +27,20 @@ data class RiveEnumDefinition( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is RiveEnumDefinition) return false + return Objects.deepEquals(this.name, other.name) + && Objects.deepEquals(this.values, other.values) + } + + override fun hashCode(): Int { + return arrayOf( + name, + values + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveError.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveError.kt index d24ce4ff..3e42e535 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveError.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/RiveError.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -26,6 +27,20 @@ data class RiveError( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is RiveError) return false + return Objects.deepEquals(this.message, other.message) + && Objects.deepEquals(this.type, other.type) + } + + override fun hashCode(): Int { + return arrayOf( + message, + type + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/UnifiedRiveEvent.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/UnifiedRiveEvent.kt index 3a6aa89d..efcac38a 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/UnifiedRiveEvent.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/UnifiedRiveEvent.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -38,6 +39,28 @@ data class UnifiedRiveEvent( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is UnifiedRiveEvent) return false + return Objects.deepEquals(this.name, other.name) + && Objects.deepEquals(this.type, other.type) + && Objects.deepEquals(this.delay, other.delay) + && Objects.deepEquals(this.properties, other.properties) + && Objects.deepEquals(this.url, other.url) + && Objects.deepEquals(this.target, other.target) + } + + override fun hashCode(): Int { + return arrayOf( + name, + type, + delay, + properties, + url, + target + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_Double_FrameRateRange.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_Double_FrameRateRange.kt index 3884b6f6..7e70c150 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_Double_FrameRateRange.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_Double_FrameRateRange.kt @@ -21,6 +21,22 @@ sealed class Variant_Double_FrameRateRange { @DoNotStrip data class Second(@DoNotStrip val value: FrameRateRange): Variant_Double_FrameRateRange() + inline fun asType(): T? { + return when (this) { + is First -> (value) as? T + is Second -> (value) as? T + } + } + inline fun isType(): Boolean { + return asType() != null + } + inline fun match(first: (Double) -> R, second: (FrameRateRange) -> R): R { + return when (this) { + is First -> first(value) + is Second -> second(value) + } + } + val isFirst: Boolean get() = this is First val isSecond: Boolean @@ -35,13 +51,6 @@ sealed class Variant_Double_FrameRateRange { return value } - inline fun match(first: (Double) -> R, second: (FrameRateRange) -> R): R { - return when (this) { - is First -> first(value) - is Second -> second(value) - } - } - companion object { @JvmStatic @DoNotStrip diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.kt index 3aa5fb15..6f0857f0 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName.kt @@ -23,6 +23,24 @@ sealed class Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName { @DoNotStrip data class Third(@DoNotStrip val value: DataBindByName): Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName() + inline fun asType(): T? { + return when (this) { + is First -> (value) as? T + is Second -> (value) as? T + is Third -> (value) as? T + } + } + inline fun isType(): Boolean { + return asType() != null + } + inline fun match(first: (HybridViewModelInstanceSpec) -> R, second: (DataBindMode) -> R, third: (DataBindByName) -> R): R { + return when (this) { + is First -> first(value) + is Second -> second(value) + is Third -> third(value) + } + } + val isFirst: Boolean get() = this is First val isSecond: Boolean @@ -43,14 +61,6 @@ sealed class Variant_HybridViewModelInstanceSpec_DataBindMode_DataBindByName { return value } - inline fun match(first: (HybridViewModelInstanceSpec) -> R, second: (DataBindMode) -> R, third: (DataBindByName) -> R): R { - return when (this) { - is First -> first(value) - is Second -> second(value) - is Third -> third(value) - } - } - companion object { @JvmStatic @DoNotStrip diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyInfo.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyInfo.kt index 506a8e2f..8e40285c 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyInfo.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyInfo.kt @@ -9,6 +9,7 @@ package com.margelo.nitro.rive import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip +import java.util.Objects /** @@ -26,6 +27,20 @@ data class ViewModelPropertyInfo( ) { /* primary constructor */ + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is ViewModelPropertyInfo) return false + return Objects.deepEquals(this.name, other.name) + && Objects.deepEquals(this.type, other.type) + } + + override fun hashCode(): Int { + return arrayOf( + name, + type + ).contentDeepHashCode() + } + companion object { /** * Constructor called from C++ diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewManager.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewManager.kt index 46fc7230..585f192c 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewManager.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewManager.kt @@ -20,6 +20,14 @@ import com.margelo.nitro.rive.* * Represents the React Native `ViewManager` for the "RiveView" Nitro HybridView. */ public open class HybridRiveViewManager: SimpleViewManager() { + /** + * Represents the View and its last state snapshot (mutable) + */ + private class HybridViewHolder( + val hybridView: HybridRiveView, + var lastState: StateWrapper? = null, + ) + init { if (RecyclableView::class.java.isAssignableFrom(HybridRiveView::class.java)) { // Enable view recycling @@ -34,27 +42,41 @@ public open class HybridRiveViewManager: SimpleViewManager() { override fun createViewInstance(reactContext: ThemedReactContext): View { val hybridView = HybridRiveView(reactContext) val view = hybridView.view - view.setTag(associated_hybrid_view_tag, hybridView) + view.setTag(associated_hybrid_view_tag, HybridViewHolder(hybridView)) return view } override fun updateState(view: View, props: ReactStylesDiffMap, stateWrapper: StateWrapper): Any? { - val hybridView = view.getTag(associated_hybrid_view_tag) as? HybridRiveView + val holder = getHybridViewHolder(view) ?: throw Error("Couldn't find view $view in local views table!") + val hybridView = holder.hybridView + val oldState = holder.lastState + val newState = stateWrapper // 1. Update each prop individually hybridView.beforeUpdate() - HybridRiveViewStateUpdater.updateViewProps(hybridView, stateWrapper) + HybridRiveViewStateUpdater.updateViewProps(hybridView, newState, oldState) hybridView.afterUpdate() + holder.lastState = newState // 2. Continue in base View props - return super.updateState(view, props, stateWrapper) + return super.updateState(view, props, newState) + } + + override fun onDropViewInstance(view: View) { + val holder = getHybridViewHolder(view) + holder?.lastState = null + holder?.hybridView?.onDropView() + return super.onDropViewInstance(view) } protected override fun prepareToRecycleView(reactContext: ThemedReactContext, view: View): View? { - super.prepareToRecycleView(reactContext, view) - val hybridView = view.getTag(associated_hybrid_view_tag) as? HybridRiveView + val preparedView = super.prepareToRecycleView(reactContext, view) ?: return null + val holder = getHybridViewHolder(preparedView) + ?: return null + val hybridView = holder.hybridView + holder.lastState = null @Suppress("USELESS_IS_CHECK") if (hybridView is RecyclableView) { @@ -67,4 +89,8 @@ public open class HybridRiveViewManager: SimpleViewManager() { return null } } + + private fun getHybridViewHolder(view: View): HybridViewHolder? { + return view.getTag(associated_hybrid_view_tag) as? HybridViewHolder + } } diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewStateUpdater.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewStateUpdater.kt index 0caac58a..b9a15e2f 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewStateUpdater.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/views/HybridRiveViewStateUpdater.kt @@ -14,10 +14,10 @@ internal class HybridRiveViewStateUpdater { companion object { /** * Updates the props for [view] through C++. - * The [state] prop is expected to contain [view]'s props as wrapped Fabric state. + * The [newState] prop is expected to contain [view]'s props as wrapped Fabric state. */ @Suppress("KotlinJniMissingFunction") @JvmStatic - external fun updateViewProps(view: HybridRiveViewSpec, state: StateWrapper) + external fun updateViewProps(view: HybridRiveViewSpec, newState: StateWrapper, oldState: StateWrapper?) } } diff --git a/nitrogen/generated/android/riveOnLoad.cpp b/nitrogen/generated/android/riveOnLoad.cpp index f8166a32..22948026 100644 --- a/nitrogen/generated/android/riveOnLoad.cpp +++ b/nitrogen/generated/android/riveOnLoad.cpp @@ -56,57 +56,57 @@ int initialize(JavaVM* vm) { } struct JHybridRiveFontConfigSpecImpl: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFontConfig;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFontConfig;"; static std::shared_ptr create() { - static auto constructorFn = javaClassStatic()->getConstructor(); + static const auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridRiveFontConfigSpec(); } }; struct JHybridRiveFileFactorySpecImpl: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileFactory;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFileFactory;"; static std::shared_ptr create() { - static auto constructorFn = javaClassStatic()->getConstructor(); + static const auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridRiveFileFactorySpec(); } }; struct JHybridRiveFileSpecImpl: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFile;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveFile;"; static std::shared_ptr create() { - static auto constructorFn = javaClassStatic()->getConstructor(); + static const auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridRiveFileSpec(); } }; struct JHybridRiveViewSpecImpl: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveView;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveView;"; static std::shared_ptr create() { - static auto constructorFn = javaClassStatic()->getConstructor(); + static const auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridRiveViewSpec(); } }; struct JHybridRiveImageFactorySpecImpl: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageFactory;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveImageFactory;"; static std::shared_ptr create() { - static auto constructorFn = javaClassStatic()->getConstructor(); + static const auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridRiveImageFactorySpec(); } }; struct JHybridRiveRuntimeSpecImpl: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveRuntime;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveRuntime;"; static std::shared_ptr create() { - static auto constructorFn = javaClassStatic()->getConstructor(); + static const auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridRiveRuntimeSpec(); } }; struct JHybridRiveLoggerSpecImpl: public jni::JavaClass { - static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveLogger;"; + static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rive/HybridRiveLogger;"; static std::shared_ptr create() { - static auto constructorFn = javaClassStatic()->getConstructor(); + static const auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridRiveLoggerSpec(); } diff --git a/nitrogen/generated/ios/RNRive+autolinking.rb b/nitrogen/generated/ios/RNRive+autolinking.rb index cb5dd7dc..7df76fc6 100644 --- a/nitrogen/generated/ios/RNRive+autolinking.rb +++ b/nitrogen/generated/ios/RNRive+autolinking.rb @@ -56,5 +56,7 @@ def add_nitrogen_files(spec) "SWIFT_OBJC_INTEROP_MODE" => "objcxx", # Enables stricter modular headers "DEFINES_MODULE" => "YES", + # Disable auto-generated ObjC header for Swift (Static linkage on Xcode 26.4 breaks here) + "SWIFT_INSTALL_OBJC_HEADER" => "NO", }) end diff --git a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp index f44c2c59..c54dd18b 100644 --- a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp @@ -1153,16 +1153,16 @@ namespace margelo::nitro::rive::bridge::swift { return optional.value(); } - // pragma MARK: std::variant + // pragma MARK: std::variant /** - * Wrapper struct for `std::variant`. + * Wrapper struct for `std::variant`. * std::variant cannot be used in Swift because of a Swift bug. * Not even specializing it works. So we create a wrapper struct. */ - struct std__variant_bool__std__string__double_ final { - std::variant variant; - std__variant_bool__std__string__double_(std::variant variant): variant(variant) { } - operator std::variant() const noexcept { + struct std__variant_bool__double__std__string_ final { + std::variant variant; + std__variant_bool__double__std__string_(std::variant variant): variant(variant) { } + operator std::variant() const noexcept { return variant; } inline size_t index() const noexcept { @@ -1171,34 +1171,34 @@ namespace margelo::nitro::rive::bridge::swift { inline bool get_0() const noexcept { return std::get<0>(variant); } - inline std::string get_1() const noexcept { + inline double get_1() const noexcept { return std::get<1>(variant); } - inline double get_2() const noexcept { + inline std::string get_2() const noexcept { return std::get<2>(variant); } }; - inline std__variant_bool__std__string__double_ create_std__variant_bool__std__string__double_(bool value) noexcept { - return std__variant_bool__std__string__double_(value); + inline std__variant_bool__double__std__string_ create_std__variant_bool__double__std__string_(bool value) noexcept { + return std__variant_bool__double__std__string_(value); } - inline std__variant_bool__std__string__double_ create_std__variant_bool__std__string__double_(const std::string& value) noexcept { - return std__variant_bool__std__string__double_(value); + inline std__variant_bool__double__std__string_ create_std__variant_bool__double__std__string_(double value) noexcept { + return std__variant_bool__double__std__string_(value); } - inline std__variant_bool__std__string__double_ create_std__variant_bool__std__string__double_(double value) noexcept { - return std__variant_bool__std__string__double_(value); + inline std__variant_bool__double__std__string_ create_std__variant_bool__double__std__string_(const std::string& value) noexcept { + return std__variant_bool__double__std__string_(value); } - // pragma MARK: std::unordered_map> + // pragma MARK: std::unordered_map> /** - * Specialized version of `std::unordered_map>`. + * Specialized version of `std::unordered_map>`. */ - using std__unordered_map_std__string__std__variant_bool__std__string__double__ = std::unordered_map>; - inline std::unordered_map> create_std__unordered_map_std__string__std__variant_bool__std__string__double__(size_t size) noexcept { - std::unordered_map> map; + using std__unordered_map_std__string__std__variant_bool__double__std__string__ = std::unordered_map>; + inline std::unordered_map> create_std__unordered_map_std__string__std__variant_bool__double__std__string__(size_t size) noexcept { + std::unordered_map> map; map.reserve(size); return map; } - inline std::vector get_std__unordered_map_std__string__std__variant_bool__std__string__double___keys(const std__unordered_map_std__string__std__variant_bool__std__string__double__& map) noexcept { + inline std::vector get_std__unordered_map_std__string__std__variant_bool__double__std__string___keys(const std__unordered_map_std__string__std__variant_bool__double__std__string__& map) noexcept { std::vector keys; keys.reserve(map.size()); for (const auto& entry : map) { @@ -1206,25 +1206,25 @@ namespace margelo::nitro::rive::bridge::swift { } return keys; } - inline std::variant get_std__unordered_map_std__string__std__variant_bool__std__string__double___value(const std__unordered_map_std__string__std__variant_bool__std__string__double__& map, const std::string& key) noexcept { + inline std::variant get_std__unordered_map_std__string__std__variant_bool__double__std__string___value(const std__unordered_map_std__string__std__variant_bool__double__std__string__& map, const std::string& key) noexcept { return map.find(key)->second; } - inline void emplace_std__unordered_map_std__string__std__variant_bool__std__string__double__(std__unordered_map_std__string__std__variant_bool__std__string__double__& map, const std::string& key, const std::variant& value) noexcept { + inline void emplace_std__unordered_map_std__string__std__variant_bool__double__std__string__(std__unordered_map_std__string__std__variant_bool__double__std__string__& map, const std::string& key, const std::variant& value) noexcept { map.emplace(key, value); } - // pragma MARK: std::optional>> + // pragma MARK: std::optional>> /** - * Specialized version of `std::optional>>`. + * Specialized version of `std::optional>>`. */ - using std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___ = std::optional>>; - inline std::optional>> create_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___(const std::unordered_map>& value) noexcept { - return std::optional>>(value); + using std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___ = std::optional>>; + inline std::optional>> create_std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___(const std::unordered_map>& value) noexcept { + return std::optional>>(value); } - inline bool has_value_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___(const std::optional>>& optional) noexcept { + inline bool has_value_std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___(const std::optional>>& optional) noexcept { return optional.has_value(); } - inline std::unordered_map> get_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___(const std::optional>>& optional) noexcept { + inline std::unordered_map> get_std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___(const std::optional>>& optional) noexcept { return optional.value(); } diff --git a/nitrogen/generated/ios/c++/views/HybridRiveViewComponent.mm b/nitrogen/generated/ios/c++/views/HybridRiveViewComponent.mm index 03fdc83e..430c4626 100644 --- a/nitrogen/generated/ios/c++/views/HybridRiveViewComponent.mm +++ b/nitrogen/generated/ios/c++/views/HybridRiveViewComponent.mm @@ -17,6 +17,13 @@ #import "HybridRiveViewSpecSwift.hpp" #import "RNRive-Swift-Cxx-Umbrella.hpp" +#if __has_include() +#include +#if REACT_NATIVE_VERSION_MINOR >= 82 +#define ENABLE_RCT_COMPONENT_VIEW_INVALIDATE +#endif +#endif + using namespace facebook; using namespace margelo::nitro::rive; using namespace margelo::nitro::rive::views; @@ -30,6 +37,7 @@ + (BOOL)shouldBeRecycled; @implementation HybridRiveViewComponent { std::shared_ptr _hybridView; + BOOL _didDropView; } + (void) load { @@ -43,6 +51,7 @@ + (void) load { - (instancetype) init { if (self = [super init]) { + _props = HybridRiveViewShadowNode::defaultSharedProps(); std::shared_ptr hybridView = RNRive::RNRiveAutolinking::createRiveView(); _hybridView = std::dynamic_pointer_cast(hybridView); [self updateView]; @@ -62,90 +71,121 @@ - (void) updateView { [self setContentView:view]; } +- (void) notifyOnDropView { + // A recycled component can later be invalidated. Notify only once per mount. + if (_didDropView) { + return; + } + RNRive::HybridRiveViewSpec_cxx& swiftPart = _hybridView->getSwiftPart(); + swiftPart.onDropView(); + _didDropView = YES; +} + - (void) updateProps:(const std::shared_ptr&)props oldProps:(const std::shared_ptr&)oldProps { + // A props update marks a newly mounted or still-active component. + _didDropView = NO; + // 1. Downcast props - const auto& newViewPropsConst = *std::static_pointer_cast(props); - auto& newViewProps = const_cast(newViewPropsConst); + const auto& newViewProps = *std::static_pointer_cast(props); + const auto* oldViewProps = static_cast(oldProps.get()); RNRive::HybridRiveViewSpec_cxx& swiftPart = _hybridView->getSwiftPart(); - // 2. Update each prop individually - swiftPart.beforeUpdate(); - - // artboardName: optional - if (newViewProps.artboardName.isDirty) { - swiftPart.setArtboardName(newViewProps.artboardName.value); - newViewProps.artboardName.isDirty = false; - } - // stateMachineName: optional - if (newViewProps.stateMachineName.isDirty) { - swiftPart.setStateMachineName(newViewProps.stateMachineName.value); - newViewProps.stateMachineName.isDirty = false; - } - // autoPlay: optional - if (newViewProps.autoPlay.isDirty) { - swiftPart.setAutoPlay(newViewProps.autoPlay.value); - newViewProps.autoPlay.isDirty = false; - } - // file: hybrid-object - if (newViewProps.file.isDirty) { - swiftPart.setFile(newViewProps.file.value); - newViewProps.file.isDirty = false; - } - // alignment: optional - if (newViewProps.alignment.isDirty) { - swiftPart.setAlignment(newViewProps.alignment.value); - newViewProps.alignment.isDirty = false; - } - // fit: optional - if (newViewProps.fit.isDirty) { - swiftPart.setFit(newViewProps.fit.value); - newViewProps.fit.isDirty = false; - } - // layoutScaleFactor: optional - if (newViewProps.layoutScaleFactor.isDirty) { - swiftPart.setLayoutScaleFactor(newViewProps.layoutScaleFactor.value); - newViewProps.layoutScaleFactor.isDirty = false; - } - // frameRate: optional - if (newViewProps.frameRate.isDirty) { - swiftPart.setFrameRate(newViewProps.frameRate.value); - newViewProps.frameRate.isDirty = false; - } - // semantics: optional - if (newViewProps.semantics.isDirty) { - swiftPart.setSemantics(newViewProps.semantics.value); - newViewProps.semantics.isDirty = false; - } - // dataBind: optional - if (newViewProps.dataBind.isDirty) { - swiftPart.setDataBind(newViewProps.dataBind.value); - newViewProps.dataBind.isDirty = false; - } - // onError: function - if (newViewProps.onError.isDirty) { - swiftPart.setOnError(newViewProps.onError.value); - newViewProps.onError.isDirty = false; - } - // onStop: function - if (newViewProps.onStop.isDirty) { - swiftPart.setOnStop(newViewProps.onStop.value); - newViewProps.onStop.isDirty = false; - } - - swiftPart.afterUpdate(); + // 2. Update only props that differ from the previous Props snapshot. + const bool hasTransactionPropChanges = oldViewProps == nullptr + ? newViewProps.hasAnyProvidedProps() + : !newViewProps.hasSameProps(*oldViewProps); + if (hasTransactionPropChanges) { + swiftPart.beforeUpdate(); + + // artboardName: optional + if (oldViewProps == nullptr + ? newViewProps.artboardName.isProvided() + : !newViewProps.artboardName.hasSameValue(oldViewProps->artboardName)) { + swiftPart.setArtboardName(newViewProps.artboardName.get()); + } + // stateMachineName: optional + if (oldViewProps == nullptr + ? newViewProps.stateMachineName.isProvided() + : !newViewProps.stateMachineName.hasSameValue(oldViewProps->stateMachineName)) { + swiftPart.setStateMachineName(newViewProps.stateMachineName.get()); + } + // autoPlay: optional + if (oldViewProps == nullptr + ? newViewProps.autoPlay.isProvided() + : !newViewProps.autoPlay.hasSameValue(oldViewProps->autoPlay)) { + swiftPart.setAutoPlay(newViewProps.autoPlay.get()); + } + // file: hybrid-object + if (oldViewProps == nullptr + ? newViewProps.file.isProvided() + : !newViewProps.file.hasSameValue(oldViewProps->file)) { + swiftPart.setFile(newViewProps.file.get()); + } + // alignment: optional + if (oldViewProps == nullptr + ? newViewProps.alignment.isProvided() + : !newViewProps.alignment.hasSameValue(oldViewProps->alignment)) { + swiftPart.setAlignment(newViewProps.alignment.get()); + } + // fit: optional + if (oldViewProps == nullptr + ? newViewProps.fit.isProvided() + : !newViewProps.fit.hasSameValue(oldViewProps->fit)) { + swiftPart.setFit(newViewProps.fit.get()); + } + // layoutScaleFactor: optional + if (oldViewProps == nullptr + ? newViewProps.layoutScaleFactor.isProvided() + : !newViewProps.layoutScaleFactor.hasSameValue(oldViewProps->layoutScaleFactor)) { + swiftPart.setLayoutScaleFactor(newViewProps.layoutScaleFactor.get()); + } + // frameRate: optional + if (oldViewProps == nullptr + ? newViewProps.frameRate.isProvided() + : !newViewProps.frameRate.hasSameValue(oldViewProps->frameRate)) { + swiftPart.setFrameRate(newViewProps.frameRate.get()); + } + // semantics: optional + if (oldViewProps == nullptr + ? newViewProps.semantics.isProvided() + : !newViewProps.semantics.hasSameValue(oldViewProps->semantics)) { + swiftPart.setSemantics(newViewProps.semantics.get()); + } + // dataBind: optional + if (oldViewProps == nullptr + ? newViewProps.dataBind.isProvided() + : !newViewProps.dataBind.hasSameValue(oldViewProps->dataBind)) { + swiftPart.setDataBind(newViewProps.dataBind.get()); + } + // onError: function + if (oldViewProps == nullptr + ? newViewProps.onError.isProvided() + : !newViewProps.onError.hasSameValue(oldViewProps->onError)) { + swiftPart.setOnError(newViewProps.onError.get()); + } + // onStop: function + if (oldViewProps == nullptr + ? newViewProps.onStop.isProvided() + : !newViewProps.onStop.hasSameValue(oldViewProps->onStop)) { + swiftPart.setOnStop(newViewProps.onStop.get()); + } - // 3. Update hybridRef if it changed - if (newViewProps.hybridRef.isDirty) { - // hybridRef changed - call it with new this - const auto& maybeFunc = newViewProps.hybridRef.value; - if (maybeFunc.has_value()) { - maybeFunc.value()(_hybridView); + // Update hybridRef if it changed + if (oldViewProps == nullptr + ? newViewProps.hybridRef.isProvided() + : !newViewProps.hybridRef.hasSameValue(oldViewProps->hybridRef)) { + // hybridRef changed - call it with new this + const auto& maybeFunc = newViewProps.hybridRef.get(); + if (maybeFunc.has_value()) { + maybeFunc.value()(_hybridView); + } } - newViewProps.hybridRef.isDirty = false; + + swiftPart.afterUpdate(); } - // 4. Continue in base class + // 3. Continue in base class [super updateProps:props oldProps:oldProps]; } @@ -154,9 +194,17 @@ + (BOOL)shouldBeRecycled { } - (void)prepareForRecycle { + [self notifyOnDropView]; [super prepareForRecycle]; RNRive::HybridRiveViewSpec_cxx& swiftPart = _hybridView->getSwiftPart(); swiftPart.maybePrepareForRecycle(); } +#ifdef ENABLE_RCT_COMPONENT_VIEW_INVALIDATE +- (void)invalidate { + [self notifyOnDropView]; + [super invalidate]; +} +#endif + @end diff --git a/nitrogen/generated/ios/swift/EventPropertiesOutput.swift b/nitrogen/generated/ios/swift/EventPropertiesOutput.swift index 7f6a3b8a..332daa64 100644 --- a/nitrogen/generated/ios/swift/EventPropertiesOutput.swift +++ b/nitrogen/generated/ios/swift/EventPropertiesOutput.swift @@ -9,11 +9,24 @@ /** * An Swift enum with associated values representing a Variant/Union type. - * JS type: `boolean | string | number` + * JS type: `boolean | number | string` */ @frozen public enum EventPropertiesOutput { case first(Bool) - case second(String) - case third(Double) + case second(Double) + case third(String) +} + +public extension EventPropertiesOutput { + func asType(_ type: T.Type = T.self) -> T? { + switch self { + case .first(let value): return value as? T + case .second(let value): return value as? T + case .third(let value): return value as? T + } + } + func isType(_ type: T.Type = T.self) -> Bool { + return self.asType(type) != nil + } } diff --git a/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift index bba3dd02..f7df07b2 100644 --- a/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift +++ b/nitrogen/generated/ios/swift/HybridRiveViewSpec_cxx.swift @@ -718,4 +718,8 @@ open class HybridRiveViewSpec_cxx { guard let recyclable = __implementation as? any RecyclableView else { return } recyclable.prepareForRecycle() } + + public final func onDropView() { + __implementation.onDropView() + } } diff --git a/nitrogen/generated/ios/swift/UnifiedRiveEvent.swift b/nitrogen/generated/ios/swift/UnifiedRiveEvent.swift index 31afcf9d..6383eabb 100644 --- a/nitrogen/generated/ios/swift/UnifiedRiveEvent.swift +++ b/nitrogen/generated/ios/swift/UnifiedRiveEvent.swift @@ -25,19 +25,19 @@ public extension UnifiedRiveEvent { } else { return .init() } - }(), { () -> bridge.std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___ in + }(), { () -> bridge.std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___ in if let __unwrappedValue = properties { - return bridge.create_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___({ () -> bridge.std__unordered_map_std__string__std__variant_bool__std__string__double__ in - var __map = bridge.create_std__unordered_map_std__string__std__variant_bool__std__string__double__(__unwrappedValue.count) + return bridge.create_std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___({ () -> bridge.std__unordered_map_std__string__std__variant_bool__double__std__string__ in + var __map = bridge.create_std__unordered_map_std__string__std__variant_bool__double__std__string__(__unwrappedValue.count) for (__k, __v) in __unwrappedValue { - bridge.emplace_std__unordered_map_std__string__std__variant_bool__std__string__double__(&__map, std.string(__k), { () -> bridge.std__variant_bool__std__string__double_ in + bridge.emplace_std__unordered_map_std__string__std__variant_bool__double__std__string__(&__map, std.string(__k), { () -> bridge.std__variant_bool__double__std__string_ in switch __v { case .first(let __value): - return bridge.create_std__variant_bool__std__string__double_(__value) + return bridge.create_std__variant_bool__double__std__string_(__value) case .second(let __value): - return bridge.create_std__variant_bool__std__string__double_(std.string(__value)) + return bridge.create_std__variant_bool__double__std__string_(__value) case .third(let __value): - return bridge.create_std__variant_bool__std__string__double_(__value) + return bridge.create_std__variant_bool__double__std__string_(std.string(__value)) } }().variant) } @@ -86,25 +86,25 @@ public extension UnifiedRiveEvent { @inline(__always) var properties: Dictionary? { return { () -> Dictionary? in - if bridge.has_value_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___(self.__properties) { - let __unwrapped = bridge.get_std__optional_std__unordered_map_std__string__std__variant_bool__std__string__double___(self.__properties) + if bridge.has_value_std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___(self.__properties) { + let __unwrapped = bridge.get_std__optional_std__unordered_map_std__string__std__variant_bool__double__std__string___(self.__properties) return { () -> Dictionary in var __dictionary = Dictionary(minimumCapacity: __unwrapped.size()) - let __keys = bridge.get_std__unordered_map_std__string__std__variant_bool__std__string__double___keys(__unwrapped) + let __keys = bridge.get_std__unordered_map_std__string__std__variant_bool__double__std__string___keys(__unwrapped) for __key in __keys { - let __value = bridge.get_std__unordered_map_std__string__std__variant_bool__std__string__double___value(__unwrapped, __key) + let __value = bridge.get_std__unordered_map_std__string__std__variant_bool__double__std__string___value(__unwrapped, __key) __dictionary[String(__key)] = { () -> EventPropertiesOutput in - let __variant = bridge.std__variant_bool__std__string__double_(__value) + let __variant = bridge.std__variant_bool__double__std__string_(__value) switch __variant.index() { case 0: let __actual = __variant.get_0() return .first(__actual) case 1: let __actual = __variant.get_1() - return .second(String(__actual)) + return .second(__actual) case 2: let __actual = __variant.get_2() - return .third(__actual) + return .third(String(__actual)) default: fatalError("Variant can never have index \(__variant.index())!") } diff --git a/nitrogen/generated/ios/swift/Variant_Double_FrameRateRange.swift b/nitrogen/generated/ios/swift/Variant_Double_FrameRateRange.swift index 0af12d68..d2db85c3 100644 --- a/nitrogen/generated/ios/swift/Variant_Double_FrameRateRange.swift +++ b/nitrogen/generated/ios/swift/Variant_Double_FrameRateRange.swift @@ -16,3 +16,15 @@ public indirect enum Variant_Double_FrameRateRange { case first(Double) case second(FrameRateRange) } + +public extension Variant_Double_FrameRateRange { + func asType(_ type: T.Type = T.self) -> T? { + switch self { + case .first(let value): return value as? T + case .second(let value): return value as? T + } + } + func isType(_ type: T.Type = T.self) -> Bool { + return self.asType(type) != nil + } +} diff --git a/nitrogen/generated/ios/swift/Variant__any_HybridViewModelInstanceSpec__DataBindMode_DataBindByName.swift b/nitrogen/generated/ios/swift/Variant__any_HybridViewModelInstanceSpec__DataBindMode_DataBindByName.swift index 94fdf1a6..0509e1d0 100644 --- a/nitrogen/generated/ios/swift/Variant__any_HybridViewModelInstanceSpec__DataBindMode_DataBindByName.swift +++ b/nitrogen/generated/ios/swift/Variant__any_HybridViewModelInstanceSpec__DataBindMode_DataBindByName.swift @@ -17,3 +17,16 @@ public indirect enum Variant__any_HybridViewModelInstanceSpec__DataBindMode_Data case second(DataBindMode) case third(DataBindByName) } + +public extension Variant__any_HybridViewModelInstanceSpec__DataBindMode_DataBindByName { + func asType(_ type: T.Type = T.self) -> T? { + switch self { + case .first(let value): return value as? T + case .second(let value): return value as? T + case .third(let value): return value as? T + } + } + func isType(_ type: T.Type = T.self) -> Bool { + return self.asType(type) != nil + } +} diff --git a/nitrogen/generated/shared/c++/UnifiedRiveEvent.hpp b/nitrogen/generated/shared/c++/UnifiedRiveEvent.hpp index ded81452..7bedb3db 100644 --- a/nitrogen/generated/shared/c++/UnifiedRiveEvent.hpp +++ b/nitrogen/generated/shared/c++/UnifiedRiveEvent.hpp @@ -47,13 +47,13 @@ namespace margelo::nitro::rive { std::string name SWIFT_PRIVATE; RiveEventType type SWIFT_PRIVATE; std::optional delay SWIFT_PRIVATE; - std::optional>> properties SWIFT_PRIVATE; + std::optional>> properties SWIFT_PRIVATE; std::optional url SWIFT_PRIVATE; std::optional target SWIFT_PRIVATE; public: UnifiedRiveEvent() = default; - explicit UnifiedRiveEvent(std::string name, RiveEventType type, std::optional delay, std::optional>> properties, std::optional url, std::optional target): name(name), type(type), delay(delay), properties(properties), url(url), target(target) {} + explicit UnifiedRiveEvent(std::string name, RiveEventType type, std::optional delay, std::optional>> properties, std::optional url, std::optional target): name(name), type(type), delay(delay), properties(properties), url(url), target(target) {} public: friend bool operator==(const UnifiedRiveEvent& lhs, const UnifiedRiveEvent& rhs) = default; @@ -72,7 +72,7 @@ namespace margelo::nitro { JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "name"))), JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "type"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "delay"))), - JSIConverter>>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "properties"))), + JSIConverter>>>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "properties"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "url"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "target"))) ); @@ -82,7 +82,7 @@ namespace margelo::nitro { obj.setProperty(runtime, PropNameIDCache::get(runtime, "name"), JSIConverter::toJSI(runtime, arg.name)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "type"), JSIConverter::toJSI(runtime, arg.type)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "delay"), JSIConverter>::toJSI(runtime, arg.delay)); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "properties"), JSIConverter>>>::toJSI(runtime, arg.properties)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "properties"), JSIConverter>>>::toJSI(runtime, arg.properties)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "url"), JSIConverter>::toJSI(runtime, arg.url)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "target"), JSIConverter>::toJSI(runtime, arg.target)); return obj; @@ -98,7 +98,7 @@ namespace margelo::nitro { if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "name")))) return false; if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "type")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "delay")))) return false; - if (!JSIConverter>>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "properties")))) return false; + if (!JSIConverter>>>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "properties")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "url")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "target")))) return false; return true; diff --git a/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.cpp b/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.cpp index 82757d46..43a9392a 100644 --- a/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.cpp +++ b/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.cpp @@ -7,164 +7,55 @@ #include "HybridRiveViewComponent.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include namespace margelo::nitro::rive::views { + using namespace facebook; + + template struct RiveIsOptional final : std::false_type {}; + template struct RiveIsOptional> final : std::true_type {}; + + // Fabric sends `null` (not `undefined`) when a prop is removed, but Nitro's + // JSIConverter> only maps `undefined` to nullopt, so parsing + // a cleared optional prop throws. Parse a null-valued optional prop as a + // cleared prop instead. https://github.com/mrousavy/nitro/issues/1184 + template + nitro::ReactProp parseNullAsCleared(const char* viewName, const char* propName, + const react::RawProps& rawProps, + const nitro::ReactProp& sourceProp) { + if constexpr (RiveIsOptional::value) { + const react::RawValue* rawValue = nitro::RawPropsCompat::at(rawProps, propName); + if (rawValue != nullptr) { + auto [runtime, value] = static_cast>(*rawValue); + if (value.isNull() && !nitro::JSIConverter::canConvert(*runtime, value)) { + return nitro::ReactProp(); + } + } + } + return nitro::ReactProp::fromRawValue(viewName, propName, rawProps, sourceProp); + } + extern const char HybridRiveViewComponentName[] = "RiveView"; HybridRiveViewProps::HybridRiveViewProps(const react::PropsParserContext& context, const HybridRiveViewProps& sourceProps, const react::RawProps& rawProps): react::ViewProps(context, sourceProps, rawProps, filterObjectKeys), - artboardName([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("artboardName", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.artboardName; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.artboardName); - return CachedProp>::fromRawValue(*runtime, value, sourceProps.artboardName); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.artboardName: ") + exc.what()); - } - }()), - stateMachineName([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("stateMachineName", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.stateMachineName; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.stateMachineName); - return CachedProp>::fromRawValue(*runtime, value, sourceProps.stateMachineName); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.stateMachineName: ") + exc.what()); - } - }()), - autoPlay([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("autoPlay", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.autoPlay; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.autoPlay); - return CachedProp>::fromRawValue(*runtime, value, sourceProps.autoPlay); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.autoPlay: ") + exc.what()); - } - }()), - file([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("file", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.file; - const auto& [runtime, value] = (std::pair)*rawValue; - return CachedProp>::fromRawValue(*runtime, value, sourceProps.file); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.file: ") + exc.what()); - } - }()), - alignment([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("alignment", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.alignment; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.alignment); - return CachedProp>::fromRawValue(*runtime, value, sourceProps.alignment); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.alignment: ") + exc.what()); - } - }()), - fit([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("fit", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.fit; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.fit); - return CachedProp>::fromRawValue(*runtime, value, sourceProps.fit); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.fit: ") + exc.what()); - } - }()), - layoutScaleFactor([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("layoutScaleFactor", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.layoutScaleFactor; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.layoutScaleFactor); - return CachedProp>::fromRawValue(*runtime, value, sourceProps.layoutScaleFactor); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.layoutScaleFactor: ") + exc.what()); - } - }()), - frameRate([&]() -> CachedProp>> { - try { - const react::RawValue* rawValue = rawProps.at("frameRate", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.frameRate; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.frameRate); - return CachedProp>>::fromRawValue(*runtime, value, sourceProps.frameRate); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.frameRate: ") + exc.what()); - } - }()), - semantics([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("semantics", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.semantics; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.semantics); - return CachedProp>::fromRawValue(*runtime, value, sourceProps.semantics); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.semantics: ") + exc.what()); - } - }()), - dataBind([&]() -> CachedProp, DataBindMode, DataBindByName>>> { - try { - const react::RawValue* rawValue = rawProps.at("dataBind", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.dataBind; - const auto& [runtime, value] = (std::pair)*rawValue; - if (value.isNull()) return CachedProp, DataBindMode, DataBindByName>>>::fromRawValue(*runtime, jsi::Value::undefined(), sourceProps.dataBind); - return CachedProp, DataBindMode, DataBindByName>>>::fromRawValue(*runtime, value, sourceProps.dataBind); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.dataBind: ") + exc.what()); - } - }()), - onError([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("onError", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.onError; - const auto& [runtime, value] = (std::pair)*rawValue; - return CachedProp>::fromRawValue(*runtime, value.asObject(*runtime).getProperty(*runtime, PropNameIDCache::get(*runtime, "f")), sourceProps.onError); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.onError: ") + exc.what()); - } - }()), - onStop([&]() -> CachedProp> { - try { - const react::RawValue* rawValue = rawProps.at("onStop", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.onStop; - const auto& [runtime, value] = (std::pair)*rawValue; - return CachedProp>::fromRawValue(*runtime, value.asObject(*runtime).getProperty(*runtime, PropNameIDCache::get(*runtime, "f")), sourceProps.onStop); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.onStop: ") + exc.what()); - } - }()), - hybridRef([&]() -> CachedProp& /* ref */)>>> { - try { - const react::RawValue* rawValue = rawProps.at("hybridRef", nullptr, nullptr); - if (rawValue == nullptr) return sourceProps.hybridRef; - const auto& [runtime, value] = (std::pair)*rawValue; - return CachedProp& /* ref */)>>>::fromRawValue(*runtime, value.asObject(*runtime).getProperty(*runtime, PropNameIDCache::get(*runtime, "f")), sourceProps.hybridRef); - } catch (const std::exception& exc) { - throw std::runtime_error(std::string("RiveView.hybridRef: ") + exc.what()); - } - }()) { } + artboardName(parseNullAsCleared>("RiveView", "artboardName", rawProps, sourceProps.artboardName)), + stateMachineName(parseNullAsCleared>("RiveView", "stateMachineName", rawProps, sourceProps.stateMachineName)), + autoPlay(parseNullAsCleared>("RiveView", "autoPlay", rawProps, sourceProps.autoPlay)), + file(nitro::ReactProp>::fromRawValue("RiveView", "file", rawProps, sourceProps.file)), + alignment(parseNullAsCleared>("RiveView", "alignment", rawProps, sourceProps.alignment)), + fit(parseNullAsCleared>("RiveView", "fit", rawProps, sourceProps.fit)), + layoutScaleFactor(parseNullAsCleared>("RiveView", "layoutScaleFactor", rawProps, sourceProps.layoutScaleFactor)), + frameRate(parseNullAsCleared>>("RiveView", "frameRate", rawProps, sourceProps.frameRate)), + semantics(parseNullAsCleared>("RiveView", "semantics", rawProps, sourceProps.semantics)), + dataBind(parseNullAsCleared, DataBindMode, DataBindByName>>>("RiveView", "dataBind", rawProps, sourceProps.dataBind)), + onError(nitro::ReactProp>::fromRawValue("RiveView", "onError", rawProps, sourceProps.onError)), + onStop(nitro::ReactProp>::fromRawValue("RiveView", "onStop", rawProps, sourceProps.onStop)), + hybridRef(parseNullAsCleared& /* ref */)>>>("RiveView", "hybridRef", rawProps, sourceProps.hybridRef)) { } bool HybridRiveViewProps::filterObjectKeys(const std::string& propName) { switch (hashString(propName)) { @@ -185,29 +76,4 @@ namespace margelo::nitro::rive::views { } } - HybridRiveViewComponentDescriptor::HybridRiveViewComponentDescriptor(const react::ComponentDescriptorParameters& parameters) - : ConcreteComponentDescriptor(parameters, - react::RawPropsParser(/* enableJsiParser */ true)) {} - - std::shared_ptr HybridRiveViewComponentDescriptor::cloneProps(const react::PropsParserContext& context, - const std::shared_ptr& props, - react::RawProps rawProps) const { - // 1. Prepare raw props parser - rawProps.parse(rawPropsParser_); - // 2. Copy props with Nitro's cached copy constructor - return HybridRiveViewShadowNode::Props(context, /* & */ rawProps, props); - } - -#ifdef ANDROID - void HybridRiveViewComponentDescriptor::adopt(react::ShadowNode& shadowNode) const { - // This is called immediately after `ShadowNode` is created, cloned or in progress. - // On Android, we need to wrap props in our state, which gets routed through Java and later unwrapped in JNI/C++. - auto& concreteShadowNode = static_cast(shadowNode); - const std::shared_ptr& constProps = concreteShadowNode.getConcreteSharedProps(); - const std::shared_ptr& props = std::const_pointer_cast(constProps); - HybridRiveViewState state{props}; - concreteShadowNode.setStateData(std::move(state)); - } -#endif - } // namespace margelo::nitro::rive::views diff --git a/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.hpp b/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.hpp index 27d708de..8c862fd8 100644 --- a/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.hpp +++ b/nitrogen/generated/shared/c++/views/HybridRiveViewComponent.hpp @@ -7,14 +7,15 @@ #pragma once -#include -#include -#include -#include -#include -#include +#include +#include +#include #include #include +#include +#include + +#include #include #include @@ -52,19 +53,53 @@ namespace margelo::nitro::rive::views { const react::RawProps& rawProps); public: - CachedProp> artboardName; - CachedProp> stateMachineName; - CachedProp> autoPlay; - CachedProp> file; - CachedProp> alignment; - CachedProp> fit; - CachedProp> layoutScaleFactor; - CachedProp>> frameRate; - CachedProp> semantics; - CachedProp, DataBindMode, DataBindByName>>> dataBind; - CachedProp> onError; - CachedProp> onStop; - CachedProp& /* ref */)>>> hybridRef; + nitro::ReactProp> artboardName; + nitro::ReactProp> stateMachineName; + nitro::ReactProp> autoPlay; + nitro::ReactProp> file; + nitro::ReactProp> alignment; + nitro::ReactProp> fit; + nitro::ReactProp> layoutScaleFactor; + nitro::ReactProp>> frameRate; + nitro::ReactProp> semantics; + nitro::ReactProp, DataBindMode, DataBindByName>>> dataBind; + nitro::ReactProp> onError; + nitro::ReactProp> onStop; + nitro::ReactProp& /* ref */)>>> hybridRef; + + [[nodiscard]] + bool hasSameProps(const HybridRiveViewProps& other) const noexcept { + return artboardName.hasSameValue(other.artboardName) && + stateMachineName.hasSameValue(other.stateMachineName) && + autoPlay.hasSameValue(other.autoPlay) && + file.hasSameValue(other.file) && + alignment.hasSameValue(other.alignment) && + fit.hasSameValue(other.fit) && + layoutScaleFactor.hasSameValue(other.layoutScaleFactor) && + frameRate.hasSameValue(other.frameRate) && + semantics.hasSameValue(other.semantics) && + dataBind.hasSameValue(other.dataBind) && + onError.hasSameValue(other.onError) && + onStop.hasSameValue(other.onStop) && + hybridRef.hasSameValue(other.hybridRef); + } + + [[nodiscard]] + bool hasAnyProvidedProps() const noexcept { + return artboardName.isProvided() || + stateMachineName.isProvided() || + autoPlay.isProvided() || + file.isProvided() || + alignment.isProvided() || + fit.isProvided() || + layoutScaleFactor.isProvided() || + frameRate.isProvided() || + semantics.isProvided() || + dataBind.isProvided() || + onError.isProvided() || + onStop.isProvided() || + hybridRef.isProvided(); + } private: static bool filterObjectKeys(const std::string& propName); @@ -73,32 +108,7 @@ namespace margelo::nitro::rive::views { /** * State for the "RiveView" View. */ - class HybridRiveViewState final { - public: - HybridRiveViewState() = default; - explicit HybridRiveViewState(const std::shared_ptr& props): - _props(props) {} - - public: - [[nodiscard]] - const std::shared_ptr& getProps() const { - return _props; - } - - public: -#ifdef ANDROID - HybridRiveViewState(const HybridRiveViewState& /* previousState */, folly::dynamic /* data */) {} - folly::dynamic getDynamic() const { - throw std::runtime_error("HybridRiveViewState does not support folly!"); - } - react::MapBuffer getMapBuffer() const { - throw std::runtime_error("HybridRiveViewState does not support MapBuffer!"); - }; -#endif - - private: - std::shared_ptr _props; - }; + using HybridRiveViewState = nitro::ViewPropsHolderState; /** * The Shadow Node for the "RiveView" View. @@ -111,21 +121,7 @@ namespace margelo::nitro::rive::views { /** * The Component Descriptor for the "RiveView" View. */ - class HybridRiveViewComponentDescriptor final: public react::ConcreteComponentDescriptor { - public: - explicit HybridRiveViewComponentDescriptor(const react::ComponentDescriptorParameters& parameters); - - public: - /** - * A faster path for cloning props - reuses the caching logic from `HybridRiveViewProps`. - */ - std::shared_ptr cloneProps(const react::PropsParserContext& context, - const std::shared_ptr& props, - react::RawProps rawProps) const override; -#ifdef ANDROID - void adopt(react::ShadowNode& shadowNode) const override; -#endif - }; + using HybridRiveViewComponentDescriptor = nitro::ViewComponentDescriptor; /* The actual view for "RiveView" needs to be implemented in platform-specific code. */ diff --git a/package.json b/package.json index 3fb3a346..1ada32cb 100644 --- a/package.json +++ b/package.json @@ -101,12 +101,12 @@ "eslint-plugin-prettier": "^5.2.3", "expect": "29.7.0", "jest": "^29.7.0", - "nitrogen": "0.35.0", + "nitrogen": "0.37.0", "prettier": "^3.0.3", "react": "19.0.0", "react-native": "0.79.2", "react-native-builder-bob": "^0.40.10", - "react-native-nitro-modules": "0.35.10", + "react-native-nitro-modules": "0.37.0", "react-test-renderer": "19.0.0", "release-it": "^17.10.0", "tsd": "^0.33.0", @@ -117,7 +117,7 @@ "@rive-app/canvas": "^2.39.0", "react": "*", "react-native": "*", - "react-native-nitro-modules": ">=0.35.10 <0.36" + "react-native-nitro-modules": ">=0.37.0 <0.38" }, "workspaces": [ "example", diff --git a/scripts/nitrogen-postprocess.ts b/scripts/nitrogen-postprocess.ts index 0cec6394..ef14528b 100644 --- a/scripts/nitrogen-postprocess.ts +++ b/scripts/nitrogen-postprocess.ts @@ -10,7 +10,6 @@ const COMPONENT_FILE = join( ROOT, 'nitrogen/generated/shared/c++/views/HybridRiveViewComponent.cpp' ); - function makeHybridRiveViewManagerOpen() { if (!existsSync(MANAGER_FILE)) { console.warn('HybridRiveViewManager.kt not found, skipping'); @@ -35,8 +34,37 @@ function makeHybridRiveViewManagerOpen() { // Fabric's prop diff sends `null` (not `undefined`) when a prop is removed, // but Nitro's JSIConverter> only maps `undefined` to nullopt, // so clearing an optional prop throws e.g. "RiveView.artboardName: Value is -// null, expected a String". Treat null like undefined for optional props. +// null, expected a String". Since nitro 0.37 the conversion happens inside +// ReactProp::fromRawValue (a library header, not generated code), so instead +// of editing the parse site we inject a wrapper that peeks at the raw value +// first (via the public RawPropsCompat::at) and parses a null-valued optional +// prop as a cleared one, never handing the null to nitro. // Remove once fixed upstream: https://github.com/mrousavy/nitro/issues/1184 +const NULL_AS_CLEARED_HELPER = ` + template struct RiveIsOptional final : std::false_type {}; + template struct RiveIsOptional> final : std::true_type {}; + + // Fabric sends \`null\` (not \`undefined\`) when a prop is removed, but Nitro's + // JSIConverter> only maps \`undefined\` to nullopt, so parsing + // a cleared optional prop throws. Parse a null-valued optional prop as a + // cleared prop instead. https://github.com/mrousavy/nitro/issues/1184 + template + nitro::ReactProp parseNullAsCleared(const char* viewName, const char* propName, + const react::RawProps& rawProps, + const nitro::ReactProp& sourceProp) { + if constexpr (RiveIsOptional::value) { + const react::RawValue* rawValue = nitro::RawPropsCompat::at(rawProps, propName); + if (rawValue != nullptr) { + auto [runtime, value] = static_cast>(*rawValue); + if (value.isNull() && !nitro::JSIConverter::canConvert(*runtime, value)) { + return nitro::ReactProp(); + } + } + } + return nitro::ReactProp::fromRawValue(viewName, propName, rawProps, sourceProp); + } +`; + function acceptNullForOptionalProps() { if (!existsSync(COMPONENT_FILE)) { console.warn('HybridRiveViewComponent.cpp not found, skipping'); @@ -44,24 +72,24 @@ function acceptNullForOptionalProps() { } const content = readFileSync(COMPONENT_FILE, 'utf-8'); - const pattern = - /^( *)return (CachedProp>)::fromRawValue\(\*runtime, value, (sourceProps\.\w+)\);$/gm; - const updated = content.replace( - pattern, - (match, indent, cachedProp, sourceProp) => - `${indent}if (value.isNull()) return ${cachedProp}::fromRawValue(*runtime, jsi::Value::undefined(), ${sourceProp});\n${match}` - ); + if (content.includes('parseNullAsCleared')) { + console.log('HybridRiveViewComponent.cpp already accepts null props'); + return; + } - if (content === updated) { - if (content.includes('value.isNull()')) { - console.log('HybridRiveViewComponent.cpp already accepts null props'); - } else { - console.warn( - 'No optional CachedProp parse sites found in HybridRiveViewComponent.cpp — nitrogen output may have changed shape' - ); - } + const anchor = ' using namespace facebook;\n'; + const callSite = /nitro::ReactProp<(std::optional<.+>)>::fromRawValue\(/g; + if (!content.includes(anchor) || !callSite.test(content)) { + console.warn( + 'No optional ReactProp parse sites found in HybridRiveViewComponent.cpp — nitrogen output may have changed shape' + ); return; } + callSite.lastIndex = 0; + + const updated = content + .replace(anchor, anchor + NULL_AS_CLEARED_HELPER) + .replace(callSite, (_match, type) => `parseNullAsCleared<${type}>(`); writeFileSync(COMPONENT_FILE, updated); console.log( diff --git a/yarn.lock b/yarn.lock index 52a8ca58..3ac18591 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7039,12 +7039,12 @@ __metadata: eslint-plugin-prettier: ^5.2.3 expect: 29.7.0 jest: ^29.7.0 - nitrogen: 0.35.0 + nitrogen: 0.37.0 prettier: ^3.0.3 react: 19.0.0 react-native: 0.79.2 react-native-builder-bob: ^0.40.10 - react-native-nitro-modules: 0.35.10 + react-native-nitro-modules: 0.37.0 react-test-renderer: 19.0.0 release-it: ^17.10.0 tsd: ^0.33.0 @@ -7054,7 +7054,7 @@ __metadata: "@rive-app/canvas": ^2.39.0 react: "*" react-native: "*" - react-native-nitro-modules: ">=0.35.10 <0.36" + react-native-nitro-modules: ">=0.37.0 <0.38" peerDependenciesMeta: "@rive-app/canvas": optional: true @@ -7386,14 +7386,14 @@ __metadata: languageName: node linkType: hard -"@ts-morph/common@npm:~0.28.1": - version: 0.28.1 - resolution: "@ts-morph/common@npm:0.28.1" +"@ts-morph/common@npm:~0.29.0": + version: 0.29.0 + resolution: "@ts-morph/common@npm:0.29.0" dependencies: minimatch: ^10.0.1 path-browserify: ^1.0.1 tinyglobby: ^0.2.14 - checksum: bc3e879ff55fe8fe460d49124d10f74aba4ec92c261b7f65d48153a107e1b733676bb89e1c55fa4e5c045fe055c6c5247f7d340aaf1db1a44ffaf32ca2a00ec5 + checksum: 00bdc26260272482a914dbf44a80d0f411c68cf2553e1616cdfd5997e353ac1026fa255e2e8fecec21458380ca1aff998f49d985d9c726bf92f22058b178a6a5 languageName: node linkType: hard @@ -12043,7 +12043,7 @@ __metadata: react-dom: 19.1.0 react-native: 0.81.5 react-native-gesture-handler: 2.29.1 - react-native-nitro-modules: 0.35.10 + react-native-nitro-modules: 0.37.0 react-native-reanimated: 4.1.5 react-native-safe-area-context: ~5.6.0 react-native-screens: ~4.16.0 @@ -12858,7 +12858,7 @@ __metadata: react-dom: 19.2.0 react-native: 0.83.4 react-native-gesture-handler: ~2.29.0 - react-native-nitro-modules: 0.35.10 + react-native-nitro-modules: 0.37.0 react-native-reanimated: 4.2.1 react-native-safe-area-context: ~5.6.2 react-native-screens: ~4.23.0 @@ -12902,7 +12902,7 @@ __metadata: react-native: 0.86.0 react-native-gesture-handler: ~2.32.0 react-native-harness: 1.4.0-rc.1 - react-native-nitro-modules: 0.35.10 + react-native-nitro-modules: 0.37.0 react-native-reanimated: 4.5.0 react-native-safe-area-context: ~5.7.0 react-native-screens: 4.25.2 @@ -17875,18 +17875,18 @@ __metadata: languageName: node linkType: hard -"nitrogen@npm:0.35.0": - version: 0.35.0 - resolution: "nitrogen@npm:0.35.0" +"nitrogen@npm:0.37.0": + version: 0.37.0 + resolution: "nitrogen@npm:0.37.0" dependencies: chalk: ^5.3.0 - react-native-nitro-modules: ^0.35.0 - ts-morph: ^27.0.0 + react-native-nitro-modules: ^0.37.0 + ts-morph: ^28.0.0 yargs: ^18.0.0 - zod: ^4.0.5 + zod: ^4.4.3 bin: nitrogen: lib/index.js - checksum: d99d27ff6c5cacf1acaf11aa21ee58b401b1d185086b103a6cc26e92433505e4aef93b8a8281b21f872f219d8ad7a96412ac28c36894542a709eebb86e523fc3 + checksum: 50dc6af393a9450bf01a76477d3543e97457fe15fc6eb04eb64a3c5e2821bc0de47f047e939a15de73fc331aa17a7dee3b58501379ab6397003c68c2f9f68938 languageName: node linkType: hard @@ -19374,23 +19374,13 @@ __metadata: languageName: node linkType: hard -"react-native-nitro-modules@npm:0.35.10": - version: 0.35.10 - resolution: "react-native-nitro-modules@npm:0.35.10" - peerDependencies: - react: "*" - react-native: "*" - checksum: 9a657b0503fa549d3d35e275f14872950c5f798367e8a983e5386760460d2bdbac4bd107ea78e67aec08eb03a8244e60f684faf7d252703bd4b1931bfac1890f - languageName: node - linkType: hard - -"react-native-nitro-modules@npm:^0.35.0": - version: 0.35.0 - resolution: "react-native-nitro-modules@npm:0.35.0" +"react-native-nitro-modules@npm:0.37.0, react-native-nitro-modules@npm:^0.37.0": + version: 0.37.0 + resolution: "react-native-nitro-modules@npm:0.37.0" peerDependencies: react: "*" react-native: "*" - checksum: f006daa1aa58f1a0165a4d6fc087c8d190f2857a7acfd6b47080e5979f05beb20455ed3c66831d489df4eb57d2f430d1610094ed4d6ae3946e17d83362161aa6 + checksum: b11bee4cceb34cb6bd9e3e0d48b90065738a638610711868e2fabd315e4f8a0d1a5a9b58775383ae0b6703abda2063e5ce3a40ab8c5a734b73715650328d16f1 languageName: node linkType: hard @@ -19465,7 +19455,7 @@ __metadata: react-native-builder-bob: ^0.40.10 react-native-gesture-handler: 2.29.1 react-native-harness: 1.4.0-rc.1 - react-native-nitro-modules: 0.35.10 + react-native-nitro-modules: 0.37.0 react-native-reanimated: 4.1.5 react-native-safe-area-context: ^5.4.0 react-native-screens: ~4.18.0 @@ -21846,13 +21836,13 @@ __metadata: languageName: node linkType: hard -"ts-morph@npm:^27.0.0": - version: 27.0.2 - resolution: "ts-morph@npm:27.0.2" +"ts-morph@npm:^28.0.0": + version: 28.0.0 + resolution: "ts-morph@npm:28.0.0" dependencies: - "@ts-morph/common": ~0.28.1 + "@ts-morph/common": ~0.29.0 code-block-writer: ^13.0.3 - checksum: 1ed2e89257d6f48fdce49bf51e1767787579220197efaa31ac25971c656c9a8a5a6bdd123042d16f83674eec119e4462a06f716187aec0b5e4740888ab5b73b7 + checksum: 0c63f7af39a694a0bc569c4e496dbd5a13e6320926d841aea32979fd53e0847ca90e11660e195bfd7b4e4fd04115659fbe1baf336d195f9185a006d3769d898e languageName: node linkType: hard @@ -23145,7 +23135,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.25.0 || ^4.0.0": +"zod@npm:^3.25.0 || ^4.0.0, zod@npm:^4.4.3": version: 4.4.3 resolution: "zod@npm:4.4.3" checksum: bf236fdee7a5a5ec645eef5bfea3aad34e7df912931c2a23bc17e5b59882482751da42392916529da52ff9bc70f584797a5d496f1fb81f2d1a4c90fdd3922d2a @@ -23159,13 +23149,6 @@ __metadata: languageName: node linkType: hard -"zod@npm:^4.0.5": - version: 4.1.12 - resolution: "zod@npm:4.1.12" - checksum: 91174acc7d2ca5572ad522643474ddd60640cf6877b5d76e5d583eb25e3c4072c6f5eb92ab94f231ec5ce61c6acdfc3e0166de45fb1005b1ea54986b026b765f - languageName: node - linkType: hard - "zustand@npm:^5.0.5": version: 5.0.13 resolution: "zustand@npm:5.0.13"