-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathHybridRiveFile.kt
More file actions
98 lines (82 loc) · 2.91 KB
/
HybridRiveFile.kt
File metadata and controls
98 lines (82 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.margelo.nitro.rive
import androidx.annotation.Keep
import app.rive.runtime.kotlin.core.File
import com.facebook.proguard.annotations.DoNotStrip
import com.margelo.nitro.NitroModules
import java.lang.ref.WeakReference
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
@Keep
@DoNotStrip
class HybridRiveFile : HybridRiveFileSpec() {
var riveFile: File? = null
var referencedAssetCache: ReferencedAssetCache? = null
var assetLoader: ReferencedAssetLoader? = null
private val weakViews = mutableListOf<WeakReference<HybridRiveView>>()
private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())
override val viewModelCount: Double?
get() = riveFile?.viewModelCount?.toDouble()
override fun viewModelByIndex(index: Double): HybridViewModelSpec? {
val vm = riveFile?.getViewModelByIndex(index.toInt()) ?: return null;
return HybridViewModel(vm)
}
override fun viewModelByName(name: String): HybridViewModelSpec? {
val vm = riveFile?.getViewModelByName(name) ?: return null;
return HybridViewModel(vm)
}
override fun defaultArtboardViewModel(artboardBy: ArtboardBy?): HybridViewModelSpec? {
try {
val artboard = when (artboardBy?.type) {
ArtboardByTypes.INDEX -> riveFile?.artboard(artboardBy.index!!.toInt())
ArtboardByTypes.NAME -> riveFile?.artboard(artboardBy.name!!)
null -> riveFile?.firstArtboard
} ?: return null
val vm = riveFile?.defaultViewModelForArtboard(artboard) ?: return null
return HybridViewModel(vm)
} catch (e: Exception) {
return null
}
}
fun registerView(view: HybridRiveView) {
weakViews.add(WeakReference(view))
}
fun unregisterView(view: HybridRiveView) {
weakViews.removeAll { it.get() == view }
}
private fun refreshAfterAssetChange() {
weakViews.removeAll { it.get() == null }
for (weakView in weakViews) {
weakView.get()?.refreshAfterAssetChange()
}
}
override fun updateReferencedAssets(referencedAssets: ReferencedAssetsType) {
val assetsData = referencedAssets.data ?: return
val cache = referencedAssetCache ?: return
val loader = assetLoader ?: return
val context = NitroModules.applicationContext ?: return
val loadJobs = mutableListOf<kotlinx.coroutines.Deferred<Unit>>()
for ((key, assetData) in assetsData) {
val asset = cache[key] ?: continue
loadJobs.add(loader.updateAsset(assetData, asset, context))
}
if (loadJobs.isNotEmpty()) {
scope.launch {
loadJobs.awaitAll()
refreshAfterAssetChange()
}
}
}
override fun release() {
scope.cancel()
assetLoader?.dispose()
assetLoader = null
riveFile?.release()
riveFile = null
referencedAssetCache?.clear()
referencedAssetCache = null
}
}