diff --git a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt index e282f35b..1681cfa2 100644 --- a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt +++ b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt @@ -18,6 +18,12 @@ class HybridWebImageFactory: HybridWebImageFactorySpec() { get() = NitroModules.applicationContext ?: throw Error("No context - NitroModules.applicationContext was null!") private val imageLoader = ImageLoader(context) + override var maxMemoryBytes: Double + get() = (imageLoader.memoryCache?.maxSize ?: 0L).toDouble() + set(value) { + imageLoader.memoryCache?.maxSize = value.toLong() + } + override fun createWebImageLoader( url: String, options: AsyncImageLoadOptions? diff --git a/packages/react-native-nitro-web-image/ios/HybridWebImageFactory.swift b/packages/react-native-nitro-web-image/ios/HybridWebImageFactory.swift index cca50b66..343b7e63 100644 --- a/packages/react-native-nitro-web-image/ios/HybridWebImageFactory.swift +++ b/packages/react-native-nitro-web-image/ios/HybridWebImageFactory.swift @@ -11,6 +11,11 @@ import SDWebImage import NitroImage class HybridWebImageFactory: HybridWebImageFactorySpec { + var maxMemoryBytes: Double { + get { Double(SDImageCacheConfig.default.maxMemoryCost) } + set { SDImageCacheConfig.default.maxMemoryCost = UInt(max(0, newValue)) } + } + func loadFromURLAsync(url urlString: String, options: AsyncImageLoadOptions?) throws -> Promise { guard let url = URL(string: urlString) else { throw RuntimeError.error(withMessage: "URL string \"\(urlString)\" is not a valid URL!") diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp index 891f71ab..193c36c7 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp @@ -60,7 +60,15 @@ namespace margelo::nitro::web::image { } // Properties - + double JHybridWebImageFactorySpec::getMaxMemoryBytes() { + static const auto method = _javaPart->javaClassStatic()->getMethod("getMaxMemoryBytes"); + auto __result = method(_javaPart); + return __result; + } + void JHybridWebImageFactorySpec::setMaxMemoryBytes(double maxMemoryBytes) { + static const auto method = _javaPart->javaClassStatic()->getMethod("setMaxMemoryBytes"); + method(_javaPart, maxMemoryBytes); + } // Methods std::shared_ptr JHybridWebImageFactorySpec::createWebImageLoader(const std::string& url, const std::optional& options) { diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp index 2b72b176..5843a47b 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp @@ -50,7 +50,8 @@ namespace margelo::nitro::web::image { public: // Properties - + double getMaxMemoryBytes() override; + void setMaxMemoryBytes(double maxMemoryBytes) override; public: // Methods diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/HybridWebImageFactorySpec.kt b/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/HybridWebImageFactorySpec.kt index 929c9d8f..8ea7f592 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/HybridWebImageFactorySpec.kt +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/HybridWebImageFactorySpec.kt @@ -28,7 +28,11 @@ import com.margelo.nitro.core.HybridObject ) abstract class HybridWebImageFactorySpec: HybridObject() { // Properties - + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var maxMemoryBytes: Double // Methods @DoNotStrip diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp index dccacced..10cc64c0 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp @@ -76,7 +76,12 @@ namespace margelo::nitro::web::image { public: // Properties - + inline double getMaxMemoryBytes() noexcept override { + return _swiftPart.getMaxMemoryBytes(); + } + inline void setMaxMemoryBytes(double maxMemoryBytes) noexcept override { + _swiftPart.setMaxMemoryBytes(std::forward(maxMemoryBytes)); + } public: // Methods diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec.swift b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec.swift index e79ff116..0eace650 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec.swift +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec.swift @@ -11,7 +11,7 @@ import NitroModules /// See ``HybridWebImageFactorySpec`` public protocol HybridWebImageFactorySpec_protocol: HybridObject { // Properties - + var maxMemoryBytes: Double { get set } // Methods func createWebImageLoader(url: String, options: AsyncImageLoadOptions?) throws -> (any HybridImageLoaderSpec) diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec_cxx.swift b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec_cxx.swift index 1b075797..6368095a 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec_cxx.swift +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/HybridWebImageFactorySpec_cxx.swift @@ -122,7 +122,16 @@ open class HybridWebImageFactorySpec_cxx { } // Properties - + public final var maxMemoryBytes: Double { + @inline(__always) + get { + return self.__implementation.maxMemoryBytes + } + @inline(__always) + set { + self.__implementation.maxMemoryBytes = newValue + } + } // Methods @inline(__always) diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.cpp b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.cpp index 7bb6801b..4e357a8b 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.cpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.cpp @@ -14,6 +14,8 @@ namespace margelo::nitro::web::image { HybridObject::loadHybridMethods(); // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridGetter("maxMemoryBytes", &HybridWebImageFactorySpec::getMaxMemoryBytes); + prototype.registerHybridSetter("maxMemoryBytes", &HybridWebImageFactorySpec::setMaxMemoryBytes); prototype.registerHybridMethod("createWebImageLoader", &HybridWebImageFactorySpec::createWebImageLoader); prototype.registerHybridMethod("loadFromURLAsync", &HybridWebImageFactorySpec::loadFromURLAsync); prototype.registerHybridMethod("preload", &HybridWebImageFactorySpec::preload); diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.hpp index 6440db1f..fd4b9f37 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/HybridWebImageFactorySpec.hpp @@ -55,7 +55,8 @@ namespace margelo::nitro::web::image { public: // Properties - + virtual double getMaxMemoryBytes() = 0; + virtual void setMaxMemoryBytes(double maxMemoryBytes) = 0; public: // Methods diff --git a/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts b/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts index 7f3bd8dd..f8c68c3c 100644 --- a/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts +++ b/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts @@ -86,6 +86,17 @@ export interface AsyncImageLoadOptions { export interface WebImageFactory extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { + /** + * The maximum size, in bytes, of the in-memory image cache used by + * {@linkcode WebImages}. + * + * On both platforms this defaults to the underlying library's own + * suggested size (Coil's `maxSizePercent` on Android, SDWebImage's + * default on iOS). Assigning a new value takes effect immediately and + * trims the cache down if it currently exceeds the new budget. + */ + maxMemoryBytes: number + /** * Create a deferred {@linkcode ImageLoader} that loads the {@linkcode Image} * from the given {@linkcode url}.