Skip to content

Commit c26985a

Browse files
committed
feat(ios): referencedAssetLoader - update on native side
1 parent 628a6a4 commit c26985a

File tree

6 files changed

+61
-20
lines changed

6 files changed

+61
-20
lines changed

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ 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.NitroModules
67

78
@Keep
89
@DoNotStrip
910
class HybridRiveFile : HybridRiveFileSpec() {
1011
var riveFile: File? = null
1112
var referencedAssetCache: ReferencedAssetCache? = null
13+
var assetLoader: ReferencedAssetLoader? = null
1214

1315
override val viewModelCount: Double?
1416
get() = riveFile?.viewModelCount?.toDouble()
@@ -39,10 +41,20 @@ class HybridRiveFile : HybridRiveFileSpec() {
3941
}
4042

4143
override fun updateReferencedAssets(referencedAssets: ReferencedAssetsType) {
42-
// TODO: Implement dynamic asset updates
44+
val assetsData = referencedAssets.data ?: return
45+
val cache = referencedAssetCache ?: return
46+
val loader = assetLoader ?: return
47+
val context = NitroModules.applicationContext ?: return
48+
49+
for ((key, assetData) in assetsData) {
50+
val asset = cache[key] ?: continue
51+
loader.updateAsset(assetData, asset, context)
52+
}
4353
}
4454

4555
override fun release() {
56+
assetLoader?.dispose()
57+
assetLoader = null
4658
riveFile?.release()
4759
riveFile = null
4860
referencedAssetCache?.clear()

android/src/main/java/com/margelo/nitro/rive/HybridRiveFileFactory.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,20 @@ import java.net.URL
1616

1717
data class FileAndCache(
1818
val file: File,
19-
val cache: ReferencedAssetCache
19+
val cache: ReferencedAssetCache,
20+
val loader: ReferencedAssetLoader?
2021
)
2122

2223
@Keep
2324
@DoNotStrip
2425
class HybridRiveFileFactory : HybridRiveFileFactorySpec() {
25-
private val assetLoader = ReferencedAssetLoader()
26-
2726
private fun buildRiveFile(
2827
data: ByteArray,
2928
referencedAssets: ReferencedAssetsType?
3029
): FileAndCache {
3130
val cache = mutableMapOf<String, app.rive.runtime.kotlin.core.FileAsset>()
32-
val customLoader = assetLoader.createCustomLoader(referencedAssets, cache)
31+
val loader = ReferencedAssetLoader()
32+
val customLoader = loader.createCustomLoader(referencedAssets, cache)
3333

3434
// TODO: The File object in Android does not have the concept of loading CDN assets
3535
val riveFile = if (customLoader != null) {
@@ -38,7 +38,7 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() {
3838
File(data)
3939
}
4040

41-
return FileAndCache(riveFile, cache)
41+
return FileAndCache(riveFile, cache, if (customLoader != null) loader else null)
4242
}
4343

4444
override fun fromURL(url: String, loadCdn: Boolean, referencedAssets: ReferencedAssetsType?): Promise<HybridRiveFileSpec> {
@@ -53,6 +53,7 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() {
5353
val hybridRiveFile = HybridRiveFile()
5454
hybridRiveFile.riveFile = fileAndCache.file
5555
hybridRiveFile.referencedAssetCache = fileAndCache.cache
56+
hybridRiveFile.assetLoader = fileAndCache.loader
5657
hybridRiveFile
5758
} catch (e: Exception) {
5859
throw Error("Failed to download Rive file: ${e.message}")
@@ -79,6 +80,7 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() {
7980
val hybridRiveFile = HybridRiveFile()
8081
hybridRiveFile.riveFile = fileAndCache.file
8182
hybridRiveFile.referencedAssetCache = fileAndCache.cache
83+
hybridRiveFile.assetLoader = fileAndCache.loader
8284
hybridRiveFile
8385
} catch (e: Exception) {
8486
throw Error("Failed to load Rive file: ${e.message}")
@@ -105,6 +107,7 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() {
105107
val hybridRiveFile = HybridRiveFile()
106108
hybridRiveFile.riveFile = fileAndCache.file
107109
hybridRiveFile.referencedAssetCache = fileAndCache.cache
110+
hybridRiveFile.assetLoader = fileAndCache.loader
108111
hybridRiveFile
109112
} catch (e: Exception) {
110113
throw Error("Failed to load Rive file: ${e.message}")
@@ -122,6 +125,7 @@ class HybridRiveFileFactory : HybridRiveFileFactorySpec() {
122125
val hybridRiveFile = HybridRiveFile()
123126
hybridRiveFile.riveFile = fileAndCache.file
124127
hybridRiveFile.referencedAssetCache = fileAndCache.cache
128+
hybridRiveFile.assetLoader = fileAndCache.loader
125129
hybridRiveFile
126130
} catch (e: Exception) {
127131
throw Error("Failed to load Rive file from bytes: ${e.message}")

android/src/main/java/com/margelo/nitro/rive/ReferencedAssetLoader.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ class ReferencedAssetLoader {
183183
}
184184
}
185185

186+
fun updateAsset(assetData: ResolvedReferencedAsset, asset: FileAsset, context: Context) {
187+
loadAsset(assetData, asset, context)
188+
}
189+
186190
fun createCustomLoader(
187191
referencedAssets: ReferencedAssetsType?,
188192
cache: ReferencedAssetCache

ios/HybridRiveFile.swift

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ typealias ReferencedAssetCache = [String: RiveFileAsset]
55
class HybridRiveFile: HybridRiveFileSpec {
66
var riveFile: RiveFile?
77
var referencedAssetCache: ReferencedAssetCache?
8-
8+
var assetLoader: ReferencedAssetLoader?
9+
910
public func setRiveFile(_ riveFile: RiveFile) {
1011
self.riveFile = riveFile
1112
}
@@ -49,7 +50,19 @@ class HybridRiveFile: HybridRiveFileSpec {
4950
}
5051

5152
func updateReferencedAssets(referencedAssets: ReferencedAssetsType) {
52-
53+
guard let assetsData = referencedAssets.data,
54+
let cache = referencedAssetCache,
55+
let loader = assetLoader,
56+
let riveFile = riveFile else {
57+
return
58+
}
59+
60+
let factory = RiveFactory()
61+
62+
for (key, assetData) in assetsData {
63+
guard let asset = cache[key] else { continue }
64+
loader.loadAsset(source: assetData, asset: asset, factory: factory)
65+
}
5366
}
5467

5568
func release() throws {

ios/HybridRiveFileFactory.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ import NitroModules
22
import RiveRuntime
33

44
final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
5-
private let assetLoader = ReferencedAssetLoader()
6-
7-
private func buildRiveFile(data: Data, loadCdn: Bool,referencedAssets: ReferencedAssetsType?) throws -> FileAndCache {
5+
private func buildRiveFile(data: Data, loadCdn: Bool, referencedAssets: ReferencedAssetsType?) throws -> (file: RiveFile, cache: ReferencedAssetCache, loader: ReferencedAssetLoader?) {
86
var referencedAssetCache = Ref(ReferencedAssetCache())
9-
let riveFile =
10-
if let customLoader = assetLoader.createCustomLoader(referencedAssets: referencedAssets, cache: referencedAssetCache) {
11-
try RiveFile(data: data, loadCdn: loadCdn, customAssetLoader: customLoader)
12-
} else {
13-
try RiveFile(data: data, loadCdn: loadCdn)
14-
}
15-
return FileAndCache(file: riveFile, cache: referencedAssetCache.value)
7+
let assetLoader = ReferencedAssetLoader()
8+
let customLoader = assetLoader.createCustomLoader(referencedAssets: referencedAssets, cache: referencedAssetCache)
9+
10+
let riveFile = if let customLoader = customLoader {
11+
try RiveFile(data: data, loadCdn: loadCdn, customAssetLoader: customLoader)
12+
} else {
13+
try RiveFile(data: data, loadCdn: loadCdn)
14+
}
15+
16+
return (file: riveFile, cache: referencedAssetCache.value, loader: customLoader != nil ? assetLoader : nil)
1617
}
1718

1819
// MARK: Public Methods
@@ -71,6 +72,7 @@ final class HybridRiveFileFactory: HybridRiveFileFactorySpec {
7172
let hybridRiveFile = HybridRiveFile()
7273
hybridRiveFile.riveFile = riveFile.file
7374
hybridRiveFile.referencedAssetCache = riveFile.cache
75+
hybridRiveFile.assetLoader = riveFile.loader
7476
return hybridRiveFile
7577
} catch let error as NSError {
7678
throw RuntimeError.error(withMessage: "Failed to load Rive file: \(error.localizedDescription)")

ios/ReferencedAssetLoader.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ final class ReferencedAssetLoader {
172172
}
173173
}
174174

175-
private func loadAsset(
175+
private func loadAssetInternal(
176176
source: ResolvedReferencedAsset, asset: RiveFileAsset, factory: RiveFactory
177177
) {
178178
let sourceAssetId = source.sourceAssetId
@@ -188,6 +188,12 @@ final class ReferencedAssetLoader {
188188
}
189189
}
190190

191+
func loadAsset(
192+
source: ResolvedReferencedAsset, asset: RiveFileAsset, factory: RiveFactory
193+
) {
194+
loadAssetInternal(source: source, asset: asset, factory: factory)
195+
}
196+
191197
func createCustomLoader(referencedAssets: ReferencedAssetsType?, cache: Ref<ReferencedAssetCache>)
192198
-> LoadAsset?
193199
{
@@ -204,7 +210,7 @@ final class ReferencedAssetLoader {
204210

205211
cache.value[asset.uniqueName()] = asset
206212

207-
self.loadAsset(source: assetData, asset: asset, factory: factory)
213+
self.loadAssetInternal(source: assetData, asset: asset, factory: factory)
208214

209215
return false
210216
}

0 commit comments

Comments
 (0)