Skip to content

Commit 1b6afdf

Browse files
committed
feat: migrate getEnums() from sync to async (Promise)
Also fix viewModelByIndex/ByName on Android legacy to catch SDK exceptions instead of letting them propagate as JniExceptions.
1 parent 9d9c4fe commit 1b6afdf

17 files changed

Lines changed: 284 additions & 149 deletions

File tree

android/src/experimental/java/com/margelo/nitro/rive/HybridRiveFile.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import app.rive.ViewModelSource
99
import app.rive.core.CommandQueue
1010
import app.rive.runtime.kotlin.core.ViewModel.PropertyDataType
1111
import com.facebook.proguard.annotations.DoNotStrip
12+
import com.margelo.nitro.core.Promise
1213
import java.lang.ref.WeakReference
1314
import kotlinx.coroutines.flow.first
1415
import kotlinx.coroutines.runBlocking
@@ -113,19 +114,16 @@ class HybridRiveFile(
113114
return HybridBindableArtboard(name, this)
114115
}
115116

116-
override fun getEnums(): Array<RiveEnumDefinition> {
117-
val file = riveFile ?: return emptyArray()
118-
return try {
119-
val enums = runBlocking { file.getEnums() }
117+
override fun getEnums(): Promise<Array<RiveEnumDefinition>> {
118+
val file = riveFile ?: return Promise.resolved(emptyArray())
119+
return Promise.async {
120+
val enums = file.getEnums()
120121
enums.map { enum ->
121122
RiveEnumDefinition(
122123
name = enum.name,
123124
values = enum.values.toTypedArray()
124125
)
125126
}.toTypedArray()
126-
} catch (e: Exception) {
127-
Log.e(TAG, "getEnums failed", e)
128-
emptyArray()
129127
}
130128
}
131129

android/src/legacy/java/com/margelo/nitro/rive/HybridRiveFile.kt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.margelo.nitro.rive
33
import androidx.annotation.Keep
44
import app.rive.runtime.kotlin.core.File
55
import com.facebook.proguard.annotations.DoNotStrip
6+
import com.margelo.nitro.core.Promise
67
import java.lang.ref.WeakReference
78
import kotlinx.coroutines.CoroutineScope
89
import kotlinx.coroutines.Dispatchers
@@ -105,18 +106,20 @@ class HybridRiveFile : HybridRiveFileSpec() {
105106
}
106107
}
107108

108-
override fun getEnums(): Array<RiveEnumDefinition> {
109-
val file = riveFile ?: return emptyArray()
110-
return try {
111-
file.enums
112-
.map { enum ->
113-
RiveEnumDefinition(
114-
name = enum.name,
115-
values = enum.values.toTypedArray()
116-
)
117-
}.toTypedArray()
118-
} catch (e: NoSuchMethodError) {
119-
throw UnsupportedOperationException("getEnums requires rive-android SDK with enums support")
109+
override fun getEnums(): Promise<Array<RiveEnumDefinition>> {
110+
val file = riveFile ?: return Promise.resolved(emptyArray())
111+
return Promise.async {
112+
try {
113+
file.enums
114+
.map { enum ->
115+
RiveEnumDefinition(
116+
name = enum.name,
117+
values = enum.values.toTypedArray()
118+
)
119+
}.toTypedArray()
120+
} catch (e: NoSuchMethodError) {
121+
throw UnsupportedOperationException("getEnums requires rive-android SDK with enums support")
122+
}
120123
}
121124
}
122125

example/__tests__/databinding-advanced.harness.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,30 @@ describe('RiveFile ViewModel Access', () => {
6868
});
6969
});
7070

71+
describe('File Enums', () => {
72+
it('getEnums() returns Pets enum with expected values', async () => {
73+
const file = await loadFile(DATABINDING);
74+
75+
// getEnums throws on the legacy backend
76+
let enums;
77+
try {
78+
enums = await file.getEnums();
79+
} catch {
80+
return;
81+
}
82+
expect(enums.length).toBeGreaterThan(0);
83+
84+
const petsEnum = enums.find((e) => e.name === 'Pets');
85+
expectDefined(petsEnum);
86+
expect(petsEnum.values).toContain('dog');
87+
expect(petsEnum.values).toContain('cat');
88+
expect(petsEnum.values).toContain('frog');
89+
expect(petsEnum.values).toContain('owl');
90+
expect(petsEnum.values).toContain('chipmunk');
91+
expect(petsEnum.values).toContain('rat');
92+
});
93+
});
94+
7195
describe('ViewModel Properties Metadata', () => {
7296
it('Person VM has expected propertyCount and instanceCount', async () => {
7397
const file = await loadFile(DATABINDING);

example/ios/Podfile.lock

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,7 +1754,6 @@ PODS:
17541754
- React-logger (= 0.79.2)
17551755
- React-perflogger (= 0.79.2)
17561756
- React-utils (= 0.79.2)
1757-
- RiveRuntime (6.13.0)
17581757
- RNCAsyncStorage (2.2.0):
17591758
- DoubleConversion
17601759
- glog
@@ -1928,7 +1927,6 @@ PODS:
19281927
- ReactCodegen
19291928
- ReactCommon/turbomodule/bridging
19301929
- ReactCommon/turbomodule/core
1931-
- RiveRuntime (= 6.13.0)
19321930
- Yoga
19331931
- RNWorklets (0.6.1):
19341932
- DoubleConversion
@@ -2091,7 +2089,6 @@ DEPENDENCIES:
20912089

20922090
SPEC REPOS:
20932091
trunk:
2094-
- RiveRuntime
20952092
- SocketRocket
20962093

20972094
EXTERNAL SOURCES:
@@ -2261,77 +2258,76 @@ SPEC CHECKSUMS:
22612258
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
22622259
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
22632260
hermes-engine: 314be5250afa5692b57b4dd1705959e1973a8ebe
2264-
NitroModules: ce8f342b7ec187c3330e317601cdaf5a59c903ba
2261+
NitroModules: ef08d60c5bad74ea59634b422854fab9f74ba561
22652262
RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809
22662263
RCTDeprecation: 83ffb90c23ee5cea353bd32008a7bca100908f8c
22672264
RCTRequired: eb7c0aba998009f47a540bec9e9d69a54f68136e
22682265
RCTTypeSafety: 659ae318c09de0477fd27bbc9e140071c7ea5c93
22692266
React: c2d3aa44c49bb34e4dfd49d3ee92da5ebacc1c1c
22702267
React-callinvoker: 1bdfb7549b5af266d85757193b5069f60659ef9d
2271-
React-Core: 7150cf9b6a5af063b37003062689f1691e79c020
2272-
React-CoreModules: 15a85e6665d61678942da6ae485b351f4c699049
2273-
React-cxxreact: 74f9de59259ac951923f5726aa14f0398f167af9
2268+
React-Core: 10597593fdbae06f0089881e025a172e51d4a769
2269+
React-CoreModules: 6907b255529dd46895cf687daa67b24484a612c2
2270+
React-cxxreact: a9f5b8180d6955bc3f6a3fcd657c4d9b4d95c1f6
22742271
React-debug: e74e76912b91e08d580c481c34881899ccf63da9
2275-
React-defaultsnativemodule: 628285212bbd65417d40ad6a9f8781830fda6c98
2276-
React-domnativemodule: 185d9808198405c176784aaf33403d713bd24fb7
2277-
React-Fabric: c814804affbe1952e16149ddd20256e1bccae67e
2278-
React-FabricComponents: 81ef47d596966121784afec9924f9562a29b1691
2279-
React-FabricImage: f14f371d678aa557101def954ac3ba27e48948ff
2272+
React-defaultsnativemodule: 11f6ee2cf69bf3af9d0f28a6253def33d21b5266
2273+
React-domnativemodule: f940bbc4fa9e134190acbf3a4a9f95621b5a8f51
2274+
React-Fabric: 6f5c357bf3a42ff11f8844ad3fc7a1eb04f4b9de
2275+
React-FabricComponents: 10e0c0209822ac9e69412913a8af1ca33573379b
2276+
React-FabricImage: f582e764072dfa4715ae8c42979a5bace9cbcc12
22802277
React-featureflags: d5facceff8f8f6de430e0acecf4979a9a0839ba9
2281-
React-featureflagsnativemodule: 96f0ab285382d95c90f663e02526a5ceefa95a11
2282-
React-graphics: 1a66ee0a3f093b125b853f6370296fadcaf6f233
2283-
React-hermes: 8b86e5f54a65ecb69cdf22b3a00a11562eda82d2
2284-
React-idlecallbacksnativemodule: 5c25ab145c602264d00cb26a397ab52e0efa031c
2285-
React-ImageManager: 15e34bd5ef1ac4a18e96660817ef70a7f99ee8c2
2286-
React-jserrorhandler: 02cdf2cd45350108be1ffd2b164578936dbbdff7
2287-
React-jsi: 6af1987cfbb1b6621664fdbf6c7b62bd4d38c923
2288-
React-jsiexecutor: 51f372998e0303585cb0317232b938d694663cbd
2289-
React-jsinspector: 3539ad976d073bfaa8a7d2fa9bef35e70e55033e
2290-
React-jsinspectortracing: e8dbacaf67c201f23052ca1c2bae2f7b84dec443
2291-
React-jsitooling: 95a34f41e3c249d42181de13b4f8d854f178ca9f
2292-
React-jsitracing: 25b029cf5cad488252d46da19dd8c4c134fd5fe4
2293-
React-logger: 368570a253f00879a1e4fea24ed4047e72e7bbf3
2294-
React-Mapbuffer: c04fcda1c6281fc0a6824c7dcc1633dd217ac1ec
2295-
React-microtasksnativemodule: ca2804a25fdcefffa0aa942aa23ab53b99614a34
2296-
react-native-safe-area-context: bc59472155ffb889a1ffe16c19a04c0cd451562b
2297-
React-NativeModulesApple: 452b86b29fae99ed0a4015dca3ad9cd222f88abf
2278+
React-featureflagsnativemodule: a7dd141f1ef4b7c1331af0035689fbc742a49ff4
2279+
React-graphics: 36ae3407172c1c77cea29265d2b12b90aaef6aa0
2280+
React-hermes: 9116d4e6d07abeb519a2852672de087f44da8f12
2281+
React-idlecallbacksnativemodule: ae7f5ffc6cf2d2058b007b78248e5b08172ad5c3
2282+
React-ImageManager: 9daee0dc99ad6a001d4b9e691fbf37107e2b7b54
2283+
React-jserrorhandler: 1e6211581071edaf4ecd5303147328120c73f4dc
2284+
React-jsi: 753ba30c902f3a41fa7f956aca8eea3317a44ee6
2285+
React-jsiexecutor: 47520714aa7d9589c51c0f3713dfbfca4895d4f9
2286+
React-jsinspector: cfd27107f6d6f1076a57d88c932401251560fe5f
2287+
React-jsinspectortracing: 76a7d791f3c0c09a0d2bf6f46dfb0e79a4fcc0ac
2288+
React-jsitooling: 995e826570dd58f802251490486ebd3244a037ab
2289+
React-jsitracing: 094ae3d8c123cea67b50211c945b7c0443d3e97b
2290+
React-logger: 8edfcedc100544791cd82692ca5a574240a16219
2291+
React-Mapbuffer: c3f4b608e4a59dd2f6a416ef4d47a14400194468
2292+
React-microtasksnativemodule: 054f34e9b82f02bd40f09cebd4083828b5b2beb6
2293+
react-native-safe-area-context: 0b8555c40461feb7198e999912a3446602e7c601
2294+
React-NativeModulesApple: 2c4377e139522c3d73f5df582e4f051a838ff25e
22982295
React-oscompat: ef5df1c734f19b8003e149317d041b8ce1f7d29c
2299-
React-perflogger: 6fd2f6811533e9c19a61e855c3033eecbf4ad2a0
2300-
React-performancetimeline: abf31259d794c9274b3ea19c5016186925eec6c4
2296+
React-perflogger: 9a151e0b4c933c9205fd648c246506a83f31395d
2297+
React-performancetimeline: 5b0dfc0acba29ea0269ddb34cd6dd59d3b8a1c66
23012298
React-RCTActionSheet: a499b0d6d9793886b67ba3e16046a3fef2cdbbc3
2302-
React-RCTAnimation: 2595dcb10a82216a511b54742f8c28d793852ac6
2303-
React-RCTAppDelegate: f03604b70f57c9469a84a159d8abecf793a5bcff
2304-
React-RCTBlob: e00f9b4e2f151938f4d9864cf33ebf24ac03328a
2305-
React-RCTFabric: 3945d116fd271598db262d4e6ed5691d431ed9e8
2306-
React-RCTFBReactNativeSpec: 0f4d4f0da938101f2ca9d5333a8f46e527ad2819
2307-
React-RCTImage: dac5e9f8ec476aefe6e60ee640ebc1dfaf1a4dbe
2308-
React-RCTLinking: 494b785a40d952a1dfbe712f43214376e5f0e408
2309-
React-RCTNetwork: b3d7c30cd21793e268db107dd0980cb61b3c1c44
2310-
React-RCTRuntime: a8ff419d437228e7b8a793b14f9d711e1cbb82af
2311-
React-RCTSettings: a060c7e381a3896104761b8eed7e284d95e37df3
2312-
React-RCTText: 4f272b72dbb61f390d8c8274528f9fdbff983806
2313-
React-RCTVibration: 0e5326220719aca12473d703aa46693e3b4ce67a
2299+
React-RCTAnimation: cc64adc259aabc3354b73065e2231d796dfce576
2300+
React-RCTAppDelegate: 9d523da768f1c9e84c5f3b7e3624d097dfb0e16b
2301+
React-RCTBlob: e727f53eeefded7e6432eb76bd22b57bc880e5d1
2302+
React-RCTFabric: 58590aa4fdb4ad546c06a7449b486cf6844e991f
2303+
React-RCTFBReactNativeSpec: 9064c63d99e467a3893e328ba3612745c3c3a338
2304+
React-RCTImage: 7159cbdbb18a09d97ba1a611416eced75b3ccb29
2305+
React-RCTLinking: 46293afdb859bccc63e1d3dedc6901a3c04ef360
2306+
React-RCTNetwork: 4a6cd18f5bcd0363657789c64043123a896b1170
2307+
React-RCTRuntime: 5ab904fd749aa52f267ef771d265612582a17880
2308+
React-RCTSettings: 61e361dc85136d1cb0e148b7541993d2ee950ea7
2309+
React-RCTText: abd1e196c3167175e6baef18199c6d9d8ac54b4e
2310+
React-RCTVibration: 490e0dcb01a3fe4a0dfb7bc51ad5856d8b84f343
23142311
React-rendererconsistency: 351fdbc5c1fe4da24243d939094a80f0e149c7a1
2315-
React-renderercss: d333f2ada83969591100d91ec6b23ca2e17e1507
2316-
React-rendererdebug: 039e5949b72ba63c703de020701e3fd152434c61
2312+
React-renderercss: 3438814bee838ae7840a633ab085ac81699fd5cf
2313+
React-rendererdebug: 0ac2b9419ad6f88444f066d4b476180af311fb1e
23172314
React-rncore: 57ed480649bb678d8bdc386d20fee8bf2b0c307c
2318-
React-RuntimeApple: 344a5e1105256000afabaa8df12c3e4cab880340
2319-
React-RuntimeCore: 0e48fb5e5160acc0334c7a723a42d42cef4b58b6
2315+
React-RuntimeApple: 8b7a9788f31548298ba1990620fe06b40de65ad7
2316+
React-RuntimeCore: e03d96fbd57ce69fd9bca8c925942194a5126dbc
23202317
React-runtimeexecutor: d60846710facedd1edb70c08b738119b3ee2c6c2
2321-
React-RuntimeHermes: 064286a03871d932c99738e0f8ef854962ab4b99
2322-
React-runtimescheduler: e917ab17ae08c204af1ebf8f669b7e411b0220c8
2318+
React-RuntimeHermes: aab794755d9f6efd249b61f3af4417296904e3ba
2319+
React-runtimescheduler: c3cd124fa5db7c37f601ee49ca0d97019acd8788
23232320
React-timing: a90f4654cbda9c628614f9bee68967f1768bd6a5
2324-
React-utils: 51c4e71608b8133fecc9a15801d244ae7bdf3758
2325-
ReactAppDependencyProvider: d5dcc564f129632276bd3184e60f053fcd574d6b
2326-
ReactCodegen: fda99a79c866370190e162083a35602fdc314e5d
2327-
ReactCommon: 4d0da92a5eb8da86c08e3ec34bd23ab439fb2461
2328-
RiveRuntime: 903690a5ba698b2a7e8d462e8aa7ceeba862614c
2329-
RNCAsyncStorage: 2cf7d05f5b1bc38680b6c83971e535a6ae9c5bc7
2330-
RNCPicker: 83c74db2de8274d8a8f3e18d91dea174a708f8c4
2331-
RNGestureHandler: bff91bb5ab5688265c70f74180ef718b94f33fe3
2332-
RNReanimated: 9a24892f34ea317264883806d2e3de7ce34eab90
2333-
RNRive: 91d7950b6ef0a3f7defd9397762b46fcb15053be
2334-
RNWorklets: ddf16938b1ed7e878563a4fc8a690968ef3d27f1
2321+
React-utils: a612d50555b6f0f90c74b7d79954019ad47f5de6
2322+
ReactAppDependencyProvider: 04d5eb15eb46be6720e17a4a7fa92940a776e584
2323+
ReactCodegen: c63eda03ba1d94353fb97b031fc84f75a0d125ba
2324+
ReactCommon: 76d2dc87136d0a667678668b86f0fca0c16fdeb0
2325+
RNCAsyncStorage: a1c8cc8a99c32de1244a9cf707bf9d83d0de0f71
2326+
RNCPicker: 28c076ae12a1056269ec0305fe35fac3086c477d
2327+
RNGestureHandler: 6b39f4e43e4b3a0fb86de9531d090ff205a011d5
2328+
RNReanimated: 66b68ebe3baf7ec9e716bd059d700726f250d344
2329+
RNRive: 50fa285317d244e1bb5993afdf63c5ba96312eee
2330+
RNWorklets: b1faafefb82d9f29c4018404a0fb33974b494a7b
23352331
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
23362332
Yoga: 9f110fc4b7aa538663cba3c14cbb1c335f43c13f
23372333

ios/legacy/HybridRiveFile.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,14 @@ class HybridRiveFile: HybridRiveFileSpec, RiveViewSource {
119119
}
120120
}
121121

122-
func getEnums() throws -> [RiveEnumDefinition] {
123-
throw NSError(
124-
domain: "RiveError",
125-
code: 1,
126-
userInfo: [NSLocalizedDescriptionKey: "getEnums requires the experimental iOS backend. Use USE_RIVE_SPM=1 with pod install."]
127-
)
122+
func getEnums() throws -> Promise<[RiveEnumDefinition]> {
123+
return Promise.async {
124+
throw NSError(
125+
domain: "RiveError",
126+
code: 1,
127+
userInfo: [NSLocalizedDescriptionKey: "getEnums requires the experimental iOS backend. Use USE_RIVE_SPM=1 with pod install."]
128+
)
129+
}
128130
}
129131

130132
func dispose() {

ios/new/HybridRiveFile.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ class HybridRiveFile: HybridRiveFileSpec {
106106
}
107107
}
108108

109-
func getEnums() throws -> [RiveEnumDefinition] {
110-
guard let file = file else { return [] }
111-
return try blockingAsync {
109+
func getEnums() throws -> Promise<[RiveEnumDefinition]> {
110+
guard let file = file else { return Promise.resolved([]) }
111+
return Promise.async {
112112
let viewModelEnums = try await file.getViewModelEnums()
113113
return viewModelEnums.map { vmEnum in
114114
RiveEnumDefinition(name: vmEnum.name, values: vmEnum.values)

nitrogen/generated/android/c++/JHybridRiveFileSpec.cpp

Lines changed: 23 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nitrogen/generated/android/c++/JHybridRiveFileSpec.hpp

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridRiveFileSpec.kt

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)