Skip to content

Commit 3ddd1aa

Browse files
mfazekasclaude
andcommitted
refactor: API cleanup — validate option, createBlankInstanceAsync rename, set() method
- Add `validate?: boolean` (default true) to `viewModelByNameAsync` on all 4 backends; experimental backends skip the getViewModelNames() round-trip when false, legacy backends ignore it (native call already returns nil/null for unknown names) - Rename `createInstanceAsync()` → `createBlankInstanceAsync()` across spec and all 4 backends to make the semantics (blank/empty instance) explicit - Add `set(value)` fire-and-forget method to all 5 property types (Number, String, Boolean, Color, Enum) as the recommended write path; fully deprecate `value` getter and setter - Deprecate `viewModelCount`, `viewModelByIndex`, `viewModelByName` in favour of `getViewModelNamesAsync()` + `viewModelByNameAsync()`; remove removed `getViewModelCountAsync` / `viewModelByIndexAsync` variants - Regenerate nitrogen/ outputs and apply ktlint auto-format Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 4a1efa1 commit 3ddd1aa

90 files changed

Lines changed: 580 additions & 541 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class HybridRiveFile(
2626

2727
private val weakViews = mutableListOf<WeakReference<HybridRiveView>>()
2828

29-
// Deprecated: Use getViewModelCountAsync instead
29+
// Deprecated: Use getViewModelNamesAsync instead
3030
override val viewModelCount: Double?
3131
get() {
3232
val file = riveFile ?: return null
@@ -38,54 +38,49 @@ class HybridRiveFile(
3838
}
3939
}
4040

41-
override fun getViewModelCountAsync(): Promise<Double?> {
42-
val file = riveFile ?: return Promise.resolved(null)
41+
override fun getViewModelNamesAsync(): Promise<Array<String>> {
42+
val file = riveFile ?: return Promise.resolved(emptyArray())
4343
return Promise.async {
44-
file.getViewModelNames().size.toDouble()
44+
file.getViewModelNames().toTypedArray()
4545
}
4646
}
4747

48-
private suspend fun viewModelByIndexImpl(index: Double): HybridViewModelSpec? {
49-
val file = riveFile ?: return null
50-
val names = file.getViewModelNames()
51-
val idx = index.toInt()
52-
if (idx < 0 || idx >= names.size) return null
53-
return HybridViewModel(file, riveWorker, names[idx], this)
54-
}
55-
56-
// Deprecated: Use viewModelByIndexAsync instead
48+
// Deprecated: Use getViewModelNamesAsync + viewModelByNameAsync instead
5749
override fun viewModelByIndex(index: Double): HybridViewModelSpec? {
50+
val file = riveFile ?: return null
5851
return try {
59-
runBlocking { viewModelByIndexImpl(index) }
52+
val names = runBlocking { file.getViewModelNames() }
53+
val idx = index.toInt()
54+
if (idx < 0 || idx >= names.size) return null
55+
HybridViewModel(file, riveWorker, names[idx], this)
6056
} catch (e: Exception) {
6157
Log.e(TAG, "viewModelByIndex($index) failed", e)
6258
null
6359
}
6460
}
6561

66-
override fun viewModelByIndexAsync(index: Double): Promise<HybridViewModelSpec?> {
67-
return Promise.async { viewModelByIndexImpl(index) }
68-
}
69-
70-
private suspend fun viewModelByNameImpl(name: String): HybridViewModelSpec? {
62+
private suspend fun viewModelByNameImpl(name: String, validate: Boolean): HybridViewModelSpec? {
7163
val file = riveFile ?: return null
72-
val names = file.getViewModelNames()
73-
if (!names.contains(name)) return null
64+
if (validate) {
65+
val names = file.getViewModelNames()
66+
if (!names.contains(name)) return null
67+
}
7468
return HybridViewModel(file, riveWorker, name, this)
7569
}
7670

7771
// Deprecated: Use viewModelByNameAsync instead
7872
override fun viewModelByName(name: String): HybridViewModelSpec? {
7973
return try {
80-
runBlocking { viewModelByNameImpl(name) }
74+
runBlocking { viewModelByNameImpl(name, validate = true) }
8175
} catch (e: Exception) {
8276
Log.e(TAG, "viewModelByName('$name') failed", e)
8377
null
8478
}
8579
}
8680

87-
override fun viewModelByNameAsync(name: String): Promise<HybridViewModelSpec?> {
88-
return Promise.async { viewModelByNameImpl(name) }
81+
override fun viewModelByNameAsync(name: String, validate: Boolean?): Promise<HybridViewModelSpec?> {
82+
val shouldValidate = validate ?: true
83+
return Promise.async { viewModelByNameImpl(name, validate = shouldValidate) }
8984
}
9085

9186
private suspend fun defaultArtboardViewModelImpl(artboardBy: ArtboardBy?): HybridViewModelSpec? {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class HybridViewModel(
9797
}
9898
}
9999

100-
// Deprecated: Use createInstanceAsync instead
100+
// Deprecated: Use createBlankInstanceAsync instead
101101
override fun createInstance(): HybridViewModelInstanceSpec? {
102102
return try {
103103
val source = vmSource.blankInstance()
@@ -109,7 +109,7 @@ class HybridViewModel(
109109
}
110110
}
111111

112-
override fun createInstanceAsync(): Promise<HybridViewModelInstanceSpec?> {
112+
override fun createBlankInstanceAsync(): Promise<HybridViewModelInstanceSpec?> {
113113
return Promise.async {
114114
val source = vmSource.blankInstance()
115115
val vmi = ViewModelInstance.fromFile(riveFile, source)

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class HybridViewModelBooleanProperty(
1919
private const val TAG = "HybridViewModelBooleanProperty"
2020
}
2121

22-
// Deprecated: Use getValueAsync instead (for reading)
22+
// Deprecated: Use getValueAsync (read) or set(value) (write) instead
2323
override var value: Boolean
2424
get() {
2525
return try {
@@ -30,9 +30,13 @@ class HybridViewModelBooleanProperty(
3030
}
3131
}
3232
set(value) {
33-
instance.setBoolean(path, value)
33+
set(value)
3434
}
3535

36+
override fun set(value: Boolean) {
37+
instance.setBoolean(path, value)
38+
}
39+
3640
override fun getValueAsync(): Promise<Boolean> {
3741
return Promise.async { instance.getBooleanFlow(path).first() }
3842
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class HybridViewModelColorProperty(
1919
private const val TAG = "HybridViewModelColorProperty"
2020
}
2121

22-
// Deprecated: Use getValueAsync instead (for reading)
22+
// Deprecated: Use getValueAsync (read) or set(value) (write) instead
2323
override var value: Double
2424
get() {
2525
return try {
@@ -30,9 +30,13 @@ class HybridViewModelColorProperty(
3030
}
3131
}
3232
set(value) {
33-
instance.setColor(path, value.toLong().toInt())
33+
set(value)
3434
}
3535

36+
override fun set(value: Double) {
37+
instance.setColor(path, value.toLong().toInt())
38+
}
39+
3640
override fun getValueAsync(): Promise<Double> {
3741
return Promise.async { instance.getColorFlow(path).first().toDouble() }
3842
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class HybridViewModelEnumProperty(
1919
private const val TAG = "HybridViewModelEnumProperty"
2020
}
2121

22-
// Deprecated: Use getValueAsync instead (for reading)
22+
// Deprecated: Use getValueAsync (read) or set(value) (write) instead
2323
override var value: String
2424
get() {
2525
return try {
@@ -30,9 +30,13 @@ class HybridViewModelEnumProperty(
3030
}
3131
}
3232
set(value) {
33-
instance.setEnum(path, value)
33+
set(value)
3434
}
3535

36+
override fun set(value: String) {
37+
instance.setEnum(path, value)
38+
}
39+
3640
override fun getValueAsync(): Promise<String> {
3741
return Promise.async { instance.getEnumFlow(path).first() }
3842
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class HybridViewModelNumberProperty(
1919
private const val TAG = "HybridViewModelNumberProperty"
2020
}
2121

22-
// Deprecated: Use getValueAsync instead (for reading)
22+
// Deprecated: Use getValueAsync (read) or set(value) (write) instead
2323
override var value: Double
2424
get() {
2525
return try {
@@ -30,9 +30,13 @@ class HybridViewModelNumberProperty(
3030
}
3131
}
3232
set(value) {
33-
instance.setNumber(path, value.toFloat())
33+
set(value)
3434
}
3535

36+
override fun set(value: Double) {
37+
instance.setNumber(path, value.toFloat())
38+
}
39+
3640
override fun getValueAsync(): Promise<Double> {
3741
return Promise.async { instance.getNumberFlow(path).first().toDouble() }
3842
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class HybridViewModelStringProperty(
1919
private const val TAG = "HybridViewModelStringProperty"
2020
}
2121

22-
// Deprecated: Use getValueAsync instead (for reading)
22+
// Deprecated: Use getValueAsync (read) or set(value) (write) instead
2323
override var value: String
2424
get() {
2525
return try {
@@ -30,9 +30,13 @@ class HybridViewModelStringProperty(
3030
}
3131
}
3232
set(value) {
33-
instance.setString(path, value)
33+
set(value)
3434
}
3535

36+
override fun set(value: String) {
37+
instance.setString(path, value)
38+
}
39+
3640
override fun getValueAsync(): Promise<String> {
3741
return Promise.async { instance.getStringFlow(path).first() }
3842
}

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

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,18 @@ class HybridRiveFile : HybridRiveFileSpec() {
2121
private val weakViews = mutableListOf<WeakReference<HybridRiveView>>()
2222
private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())
2323

24-
// Deprecated: Use getViewModelCountAsync instead
24+
// Deprecated: Use getViewModelNamesAsync instead
2525
override val viewModelCount: Double?
2626
get() = riveFile?.viewModelCount?.toDouble()
2727

28-
override fun getViewModelCountAsync(): Promise<Double?> {
28+
override fun getViewModelNamesAsync(): Promise<Array<String>> {
2929
return Promise.async {
30-
riveFile?.viewModelCount?.toDouble()
30+
val count = riveFile?.viewModelCount ?: return@async emptyArray()
31+
(0 until count).mapNotNull { riveFile?.getViewModelByIndex(it)?.name }.toTypedArray()
3132
}
3233
}
3334

34-
// Deprecated: Use viewModelByIndexAsync instead
35+
// Deprecated: Use getViewModelNamesAsync + viewModelByNameAsync instead
3536
override fun viewModelByIndex(index: Double): HybridViewModelSpec? {
3637
if (index < 0) return null
3738
return try {
@@ -42,17 +43,6 @@ class HybridRiveFile : HybridRiveFileSpec() {
4243
}
4344
}
4445

45-
override fun viewModelByIndexAsync(index: Double): Promise<HybridViewModelSpec?> {
46-
return Promise.async {
47-
try {
48-
val vm = riveFile?.getViewModelByIndex(index.toInt()) ?: return@async null
49-
HybridViewModel(vm)
50-
} catch (e: Exception) {
51-
null
52-
}
53-
}
54-
}
55-
5646
// Deprecated: Use viewModelByNameAsync instead
5747
override fun viewModelByName(name: String): HybridViewModelSpec? {
5848
return try {
@@ -63,7 +53,8 @@ class HybridRiveFile : HybridRiveFileSpec() {
6353
}
6454
}
6555

66-
override fun viewModelByNameAsync(name: String): Promise<HybridViewModelSpec?> {
56+
// validate is ignored on legacy backend — native getViewModelByName(name) already returns null for unknown names
57+
override fun viewModelByNameAsync(name: String, validate: Boolean?): Promise<HybridViewModelSpec?> {
6758
return Promise.async {
6859
val vm = riveFile?.getViewModelByName(name) ?: return@async null
6960
HybridViewModel(vm)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class HybridViewModel(private val viewModel: ViewModel) : HybridViewModelSpec()
8080
}
8181
}
8282

83-
// Deprecated: Use createInstanceAsync instead
83+
// Deprecated: Use createBlankInstanceAsync instead
8484
override fun createInstance(): HybridViewModelInstanceSpec? {
8585
try {
8686
val vmi = viewModel.createBlankInstance()
@@ -90,7 +90,7 @@ class HybridViewModel(private val viewModel: ViewModel) : HybridViewModelSpec()
9090
}
9191
}
9292

93-
override fun createInstanceAsync(): Promise<HybridViewModelInstanceSpec?> {
93+
override fun createBlankInstanceAsync(): Promise<HybridViewModelInstanceSpec?> {
9494
return Promise.async {
9595
try {
9696
val vmi = viewModel.createBlankInstance()

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ import com.margelo.nitro.core.Promise
1010
class HybridViewModelBooleanProperty(private val viewModelBoolean: ViewModelBooleanProperty) :
1111
HybridViewModelBooleanPropertySpec(),
1212
BaseHybridViewModelProperty<Boolean> by BaseHybridViewModelPropertyImpl() {
13-
// Deprecated: Use getValueAsync instead (for reading)
13+
// Deprecated: Use getValueAsync (read) or set(value) (write) instead
1414
override var value: Boolean
1515
get() = viewModelBoolean.value
1616
set(value) {
17-
viewModelBoolean.value = value
17+
set(value)
1818
}
1919

20+
override fun set(value: Boolean) {
21+
viewModelBoolean.value = value
22+
}
23+
2024
override fun getValueAsync(): Promise<Boolean> {
2125
return Promise.async { viewModelBoolean.value }
2226
}

0 commit comments

Comments
 (0)