From a23d9e85c33c0d8fd609a3a6e2d95c8cc4958076 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Thu, 2 Feb 2023 23:43:04 -0500 Subject: [PATCH] Update dependencies --- build.gradle.kts | 1 + data/build.gradle.kts | 1 + .../ca/gosyer/jui/data/DataComponent.kt | 23 +++---- .../kotlin/ca/gosyer/jui/domain/Ktorfit.kt | 12 ---- gradle/libs.versions.toml | 67 +++++++++++-------- .../base/image/AndroidBitmapDecoderFactory.kt | 2 +- .../base/image/AndroidImageLoaderBuilder.kt | 24 +++---- .../ca/gosyer/jui/ui/util/compose/Image.kt | 5 -- .../ca/gosyer/jui/ui/base/UiComponent.kt | 8 +-- .../jui/ui/base/image/ImageLoaderProvider.kt | 51 +++++++------- .../ui/reader/loader/TachideskPageLoader.kt | 22 +++--- .../ca/gosyer/jui/ui/util/compose/Image.kt | 3 - .../base/image/DesktopImageLoaderBuilder.kt | 24 +++---- .../ca/gosyer/jui/ui/util/compose/Image.kt | 6 -- .../ui/base/image/IosImageLoaderBuilder.kt | 27 ++++---- .../ca/gosyer/jui/ui/util/compose/Image.kt | 6 -- .../jui/uicore/image/ImageLoaderImage.kt | 4 +- 17 files changed, 126 insertions(+), 160 deletions(-) delete mode 100644 domain/src/commonMain/kotlin/ca/gosyer/jui/domain/Ktorfit.kt diff --git a/build.gradle.kts b/build.gradle.kts index 4c6c0f82..1abfea09 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,6 +19,7 @@ plugins { alias(libs.plugins.buildkonfig) apply false alias(libs.plugins.moko.gradle) apply false alias(libs.plugins.kotlinter) apply false + alias(libs.plugins.ktorfit) apply false alias(libs.plugins.aboutLibraries) apply false alias(libs.plugins.versions) } diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 3f689005..58b0fad7 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -6,6 +6,7 @@ plugins { id(libs.plugins.ksp.get().pluginId) id(libs.plugins.buildkonfig.get().pluginId) id(libs.plugins.kotlinter.get().pluginId) + id(libs.plugins.ktorfit.get().pluginId) } kotlin { diff --git a/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt b/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt index cdd1183f..36558ce3 100644 --- a/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt +++ b/data/src/commonMain/kotlin/ca/gosyer/jui/data/DataComponent.kt @@ -10,7 +10,6 @@ import ca.gosyer.jui.core.lang.addSuffix import ca.gosyer.jui.domain.backup.service.BackupRepository import ca.gosyer.jui.domain.category.service.CategoryRepository import ca.gosyer.jui.domain.chapter.service.ChapterRepository -import ca.gosyer.jui.domain.createIt import ca.gosyer.jui.domain.download.service.DownloadRepository import ca.gosyer.jui.domain.extension.service.ExtensionRepository import ca.gosyer.jui.domain.global.service.GlobalRepository @@ -35,35 +34,35 @@ interface DataComponent { .build() @Provides - fun backupRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun backupRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun categoryRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun categoryRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun chapterRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun chapterRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun downloadRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun downloadRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun extensionRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun extensionRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun globalRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun globalRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun libraryRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun libraryRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun mangaRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun mangaRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun settingsRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun settingsRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun sourceRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun sourceRepository(ktorfit: Ktorfit) = ktorfit.create() @Provides - fun updatesRepository(ktorfit: Ktorfit) = ktorfit.createIt() + fun updatesRepository(ktorfit: Ktorfit) = ktorfit.create() } diff --git a/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/Ktorfit.kt b/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/Ktorfit.kt deleted file mode 100644 index a0f9bfd8..00000000 --- a/domain/src/commonMain/kotlin/ca/gosyer/jui/domain/Ktorfit.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - -package ca.gosyer.jui.domain - -import de.jensklingenberg.ktorfit.Ktorfit -import de.jensklingenberg.ktorfit.create - -inline fun Ktorfit.createIt(): T = create() diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cc794269..77b37377 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,51 +1,57 @@ [versions] # Kotlin -kotlin = "1.7.20" +kotlin = "1.8.0" coroutines = "1.6.4" # Serialization json = "1.4.1" # Compose -composeGradle = "1.2.1" -composeCompiler = "1.3.2.1" -composeAndroid = "1.2.1" -voyager = "1.0.0-rc06" +composeGradle = "1.3.0" +composeCompiler = "1.4.0" +composeAndroidRuntime = "1.3.3" +composeAndroidFoundation = "1.3.1" +composeAndroidUI = "1.3.3" +composeAndroidAnimation = "1.3.3" +composeAndroidMaterial = "1.3.1" + +# Compose Libraries +voyager = "1.0.0-rc07" accompanist = "0.25.2" -googleAccompanist = "0.25.1" -imageloader = "1.2.2.1" +googleAccompanist = "0.28.0" +imageloader = "1.2.8" materialDialogs = "0.9.1" # Android -androidGradle = "7.3.1" +androidGradle = "7.4.1" core = "1.9.0" -appCompat = "1.6.0-rc01" +appCompat = "1.7.0-alpha01" activityCompose = "1.6.1" work = "2.7.1" # Android Lifecycle -lifecycle = "2.6.0-alpha03" +lifecycle = "2.6.0-alpha05" # Swing darklaf = "3.0.2" # Ksp -ksp = "1.7.20-1.0.8" +ksp = "1.8.0-1.0.9" # Dependency Injection kotlinInject = "0.5.1" # Network -ktor = "2.1.3" -ktorfit = "1.0.0-beta16" +ktor = "2.2.3" +ktorfit = "1.0.0-beta17" # Logging -slf4j = "2.0.3" +slf4j = "2.0.6" log4j = "2.19.0" -kmlogging = "1.2.0" +kmlogging = "1.2.1" # Storage -okio = "3.2.0" +okio = "3.3.0" appDirs = "1.2.1" # Preferences @@ -53,10 +59,10 @@ multiplatformSettings = "1.0.0-alpha01" # Utility desugarJdkLibs = "1.2.2" -aboutLibraries = "10.5.1" +aboutLibraries = "10.5.2" dateTime = "0.4.0" immutableCollections = "0.3.5" -kds = "3.3.1" +kds = "3.4.0" # Localization moko = "0.20.1" @@ -66,10 +72,10 @@ buildconfig = "3.1.0" buildkonfig = "0.13.3" # Linter -kotlinter = "3.12.0" +kotlinter = "3.13.0" # Version updates -versions = "0.43.0" +versions = "0.45.0" # Optimizer proguard = "7.2.2" @@ -86,15 +92,15 @@ serialization-json-core = { module = "org.jetbrains.kotlinx:kotlinx-serializatio serialization-json-okio = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-okio", version.ref = "json" } # Compose -compose-animation = { module = "androidx.compose.animation:animation", version.ref = "composeAndroid" } -compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "composeAndroid" } -compose-runtime = { module = "androidx.compose.runtime:runtime", version.ref = "composeAndroid" } -compose-ui-core = { module = "androidx.compose.ui:ui", version.ref = "composeAndroid" } -compose-ui-util = { module = "androidx.compose.ui:ui-util", version.ref = "composeAndroid" } -compose-ui-text = { module = "androidx.compose.ui:ui-text", version.ref = "composeAndroid" } -compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "composeAndroid" } -compose-material-core = { module = "androidx.compose.material:material", version.ref = "composeAndroid" } -compose-material-icons = { module = "androidx.compose.material:material-icons-extended", version.ref = "composeAndroid" } +compose-animation = { module = "androidx.compose.animation:animation", version.ref = "composeAndroidAnimation" } +compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "composeAndroidFoundation" } +compose-runtime = { module = "androidx.compose.runtime:runtime", version.ref = "composeAndroidRuntime" } +compose-ui-core = { module = "androidx.compose.ui:ui", version.ref = "composeAndroidUI" } +compose-ui-util = { module = "androidx.compose.ui:ui-util", version.ref = "composeAndroidUI" } +compose-ui-text = { module = "androidx.compose.ui:ui-text", version.ref = "composeAndroidUI" } +compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "composeAndroidUI" } +compose-material-core = { module = "androidx.compose.material:material", version.ref = "composeAndroidMaterial" } +compose-material-icons = { module = "androidx.compose.material:material-icons-extended", version.ref = "composeAndroidMaterial" } # Compose UI voyager-core = { module = "ca.gosyer:voyager-core", version.ref = "voyager" } voyager-navigation = { module = "ca.gosyer:voyager-navigator", version.ref = "voyager" } @@ -186,6 +192,9 @@ compose = { id = "org.jetbrains.compose", version.ref = "composeGradle"} # Ksp ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"} +# Network +ktorfit = { id = "de.jensklingenberg.ktorfit", version = "1.0.0"} + # Localization moko-gradle = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko"} diff --git a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidBitmapDecoderFactory.kt b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidBitmapDecoderFactory.kt index aea8da06..d35c3813 100644 --- a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidBitmapDecoderFactory.kt +++ b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidBitmapDecoderFactory.kt @@ -11,4 +11,4 @@ import com.seiko.imageloader.component.decoder.BitmapFactoryDecoder import com.seiko.imageloader.component.decoder.Decoder actual class BitmapDecoderFactory actual constructor(contextWrapper: ContextWrapper) : - Decoder.Factory by BitmapFactoryDecoder.Factory(contextWrapper) + Decoder.Factory by BitmapFactoryDecoder.Factory(contextWrapper, Int.MAX_VALUE) diff --git a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidImageLoaderBuilder.kt b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidImageLoaderBuilder.kt index 7d2a85bb..f4ebb963 100644 --- a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidImageLoaderBuilder.kt +++ b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/base/image/AndroidImageLoaderBuilder.kt @@ -7,13 +7,13 @@ package ca.gosyer.jui.ui.base.image import android.os.Build +import ca.gosyer.jui.domain.server.Http import ca.gosyer.jui.uicore.vm.ContextWrapper -import com.seiko.imageloader.ImageLoaderBuilder -import com.seiko.imageloader.cache.disk.DiskCache import com.seiko.imageloader.cache.disk.DiskCacheBuilder -import com.seiko.imageloader.cache.memory.MemoryCache import com.seiko.imageloader.cache.memory.MemoryCacheBuilder -import com.seiko.imageloader.request.Options +import com.seiko.imageloader.component.ComponentRegistryBuilder +import com.seiko.imageloader.component.setupDefaultComponents +import com.seiko.imageloader.option.Options import okio.Path.Companion.toOkioPath actual val imageConfig: Options.ImageConfig = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { @@ -22,18 +22,14 @@ actual val imageConfig: Options.ImageConfig = if (Build.VERSION.SDK_INT < Build. Options.ImageConfig.HARDWARE } -actual fun imageLoaderBuilder(contextWrapper: ContextWrapper): ImageLoaderBuilder { - return ImageLoaderBuilder(contextWrapper) +actual fun ComponentRegistryBuilder.register(contextWrapper: ContextWrapper, http: Http) { + setupDefaultComponents(contextWrapper, httpClient = { http }) } -actual fun diskCache(contextWrapper: ContextWrapper, cacheDir: String): DiskCache { - return DiskCacheBuilder() - .directory(contextWrapper.cacheDir.toOkioPath() / cacheDir) - .maxSizeBytes(1024 * 1024 * 150) // 150 MB - .build() +actual fun DiskCacheBuilder.configure(contextWrapper: ContextWrapper, cacheDir: String) { + directory(contextWrapper.cacheDir.toOkioPath() / cacheDir) + maxSizeBytes(1024 * 1024 * 150) // 150 MB } -actual fun memoryCache(contextWrapper: ContextWrapper): MemoryCache { - return MemoryCacheBuilder(contextWrapper) - .build() +actual fun MemoryCacheBuilder.configure(contextWrapper: ContextWrapper) { } diff --git a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt index cfd0c1b7..6b1f2ace 100644 --- a/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt +++ b/presentation/src/androidMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt @@ -9,7 +9,6 @@ package ca.gosyer.jui.ui.util.compose import android.graphics.BitmapFactory import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap -import com.seiko.imageloader.Image import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.bodyAsChannel import io.ktor.utils.io.jvm.javaio.toInputStream @@ -17,7 +16,3 @@ import io.ktor.utils.io.jvm.javaio.toInputStream actual suspend fun HttpResponse.toImageBitmap(): ImageBitmap { return BitmapFactory.decodeStream(bodyAsChannel().toInputStream()).asImageBitmap() } - -actual fun Image.asImageBitmap(): ImageBitmap { - return asImageBitmap() -} diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt index 6186651a..af79e9e3 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/UiComponent.kt @@ -11,7 +11,7 @@ import androidx.compose.runtime.compositionLocalOf import ca.gosyer.jui.core.di.AppScope import ca.gosyer.jui.ui.ViewModelComponent import ca.gosyer.jui.ui.base.image.ImageLoaderProvider -import ca.gosyer.jui.ui.base.image.diskCache +import ca.gosyer.jui.ui.base.image.configure import ca.gosyer.jui.uicore.vm.ContextWrapper import com.seiko.imageloader.ImageLoader import com.seiko.imageloader.LocalImageLoader @@ -27,7 +27,7 @@ interface UiComponent { val contextWrapper: ContextWrapper - val hooks: Array> + val hooks: Array> val imageCache: ImageCache @@ -39,11 +39,11 @@ interface UiComponent { @AppScope @Provides - fun imageCacheFactory(): ImageCache = diskCache(contextWrapper, "image_cache") + fun imageCacheFactory(): ImageCache = DiskCache { configure(contextWrapper, "image_cache") } @AppScope @Provides - fun chapterCacheFactory(): ChapterCache = diskCache(contextWrapper, "chapter_cache") + fun chapterCacheFactory(): ChapterCache = DiskCache { configure(contextWrapper, "chapter_cache") } @Provides fun getHooks(viewModelComponent: ViewModelComponent) = arrayOf( diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/ImageLoaderProvider.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/ImageLoaderProvider.kt index 7a492782..2c7d3bc9 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/ImageLoaderProvider.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/base/image/ImageLoaderProvider.kt @@ -14,12 +14,13 @@ import ca.gosyer.jui.domain.source.model.Source import ca.gosyer.jui.ui.base.ImageCache import ca.gosyer.jui.uicore.vm.ContextWrapper import com.seiko.imageloader.ImageLoader -import com.seiko.imageloader.ImageLoaderBuilder -import com.seiko.imageloader.cache.disk.DiskCache -import com.seiko.imageloader.cache.memory.MemoryCache +import com.seiko.imageloader.cache.disk.DiskCacheBuilder +import com.seiko.imageloader.cache.memory.MemoryCacheBuilder +import com.seiko.imageloader.component.ComponentRegistryBuilder import com.seiko.imageloader.component.keyer.Keyer import com.seiko.imageloader.component.mapper.Mapper -import com.seiko.imageloader.request.Options +import com.seiko.imageloader.option.Options +import io.ktor.http.Url import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import me.tatarka.inject.annotations.Inject @@ -33,9 +34,9 @@ class ImageLoaderProvider @Inject constructor( val serverUrl = serverPreferences.serverUrl().stateIn(GlobalScope) fun get(imageCache: ImageCache): ImageLoader { - return imageLoaderBuilder(context).apply { - httpClient { http } + return ImageLoader { components { + register(context, http) add(MangaCoverMapper()) add(MangaCoverKeyer()) add(ExtensionIconMapper()) @@ -43,23 +44,19 @@ class ImageLoaderProvider @Inject constructor( add(SourceIconMapper()) add(SourceIconKeyer()) } - options( - Options(config = imageConfig) - ) - diskCache { - imageCache + options.config = imageConfig + interceptor { + diskCache { imageCache } + memoryCacheConfig { configure(context) } } - memoryCache { - memoryCache(context) - } - }.build() + } } - inner class MangaCoverMapper : Mapper { - override fun map(data: Any, options: Options): String? { + inner class MangaCoverMapper : Mapper { + override fun map(data: Any, options: Options): Url? { if (data !is Manga) return null if (data.thumbnailUrl.isNullOrBlank()) return null - return serverUrl.value.toString() + data.thumbnailUrl + return Url(serverUrl.value.toString() + data.thumbnailUrl) } } @@ -70,11 +67,11 @@ class ImageLoaderProvider @Inject constructor( } } - inner class ExtensionIconMapper : Mapper { - override fun map(data: Any, options: Options): String? { + inner class ExtensionIconMapper : Mapper { + override fun map(data: Any, options: Options): Url? { if (data !is Extension) return null if (data.iconUrl.isBlank()) return null - return "${serverUrl.value}${data.iconUrl}" + return Url("${serverUrl.value}${data.iconUrl}") } } @@ -85,11 +82,11 @@ class ImageLoaderProvider @Inject constructor( } } - inner class SourceIconMapper : Mapper { - override fun map(data: Any, options: Options): String? { + inner class SourceIconMapper : Mapper { + override fun map(data: Any, options: Options): Url? { if (data !is Source) return null if (data.iconUrl.isBlank()) return null - return serverUrl.value.toString() + data.iconUrl + return Url(serverUrl.value.toString() + data.iconUrl) } } @@ -103,8 +100,8 @@ class ImageLoaderProvider @Inject constructor( expect val imageConfig: Options.ImageConfig -expect fun imageLoaderBuilder(contextWrapper: ContextWrapper): ImageLoaderBuilder +expect fun ComponentRegistryBuilder.register(contextWrapper: ContextWrapper, http: Http) -expect fun diskCache(contextWrapper: ContextWrapper, cacheDir: String): DiskCache +expect fun DiskCacheBuilder.configure(contextWrapper: ContextWrapper, cacheDir: String) -expect fun memoryCache(contextWrapper: ContextWrapper): MemoryCache +expect fun MemoryCacheBuilder.configure(contextWrapper: ContextWrapper) diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt index 2c8410e5..3ea75456 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/reader/loader/TachideskPageLoader.kt @@ -17,14 +17,15 @@ import ca.gosyer.jui.ui.base.image.BitmapDecoderFactory import ca.gosyer.jui.ui.base.model.StableHolder import ca.gosyer.jui.ui.reader.model.ReaderChapter import ca.gosyer.jui.ui.reader.model.ReaderPage -import ca.gosyer.jui.ui.util.compose.asImageBitmap import ca.gosyer.jui.ui.util.lang.toSource import cafe.adriel.voyager.core.concurrent.AtomicInt32 +import com.seiko.imageloader.asImageBitmap import com.seiko.imageloader.cache.disk.DiskCache -import com.seiko.imageloader.component.decoder.DecodeImageResult -import com.seiko.imageloader.request.ImageRequestBuilder -import com.seiko.imageloader.request.Options -import com.seiko.imageloader.request.SourceResult +import com.seiko.imageloader.component.decoder.DecodeResult +import com.seiko.imageloader.model.DataSource +import com.seiko.imageloader.model.ImageRequest +import com.seiko.imageloader.model.ImageResult +import com.seiko.imageloader.option.Options import io.ktor.client.plugins.onDownload import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.bodyAsChannel @@ -149,17 +150,18 @@ class TachideskPageLoader( return chapterCache[page.cacheKey]?.use { it.source().use { source -> val decoder = bitmapDecoderFactory.create( - SourceResult( - ImageRequestBuilder().build(), - source + ImageResult.Source( + ImageRequest(Any()), + source, + DataSource.Engine ), Options() ) if (decoder != null) { - runCatching { decoder.decode() as DecodeImageResult } + runCatching { decoder.decode() as DecodeResult.Bitmap } .mapCatching { ReaderPage.ImageDecodeState.Success( - it.image.asImageBitmap().also { + it.bitmap.asImageBitmap().also { page.bitmapInfo.value = ReaderPage.BitmapInfo( IntSize(it.width, it.height) ) diff --git a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt index 18c2ca6e..b89a1c33 100644 --- a/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt +++ b/presentation/src/commonMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt @@ -7,9 +7,6 @@ package ca.gosyer.jui.ui.util.compose import androidx.compose.ui.graphics.ImageBitmap -import com.seiko.imageloader.Image import io.ktor.client.statement.HttpResponse expect suspend fun HttpResponse.toImageBitmap(): ImageBitmap - -expect fun Image.asImageBitmap(): ImageBitmap diff --git a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/image/DesktopImageLoaderBuilder.kt b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/image/DesktopImageLoaderBuilder.kt index 555a0424..43832625 100644 --- a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/image/DesktopImageLoaderBuilder.kt +++ b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/base/image/DesktopImageLoaderBuilder.kt @@ -7,28 +7,24 @@ package ca.gosyer.jui.ui.base.image import ca.gosyer.jui.core.io.userDataDir +import ca.gosyer.jui.domain.server.Http import ca.gosyer.jui.uicore.vm.ContextWrapper -import com.seiko.imageloader.ImageLoaderBuilder -import com.seiko.imageloader.cache.disk.DiskCache import com.seiko.imageloader.cache.disk.DiskCacheBuilder -import com.seiko.imageloader.cache.memory.MemoryCache import com.seiko.imageloader.cache.memory.MemoryCacheBuilder -import com.seiko.imageloader.request.Options +import com.seiko.imageloader.component.ComponentRegistryBuilder +import com.seiko.imageloader.component.setupDefaultComponents +import com.seiko.imageloader.option.Options actual val imageConfig: Options.ImageConfig = Options.ImageConfig.ARGB_8888 -actual fun imageLoaderBuilder(contextWrapper: ContextWrapper): ImageLoaderBuilder { - return ImageLoaderBuilder() +actual fun ComponentRegistryBuilder.register(contextWrapper: ContextWrapper, http: Http) { + setupDefaultComponents(httpClient = { http }) } -actual fun diskCache(contextWrapper: ContextWrapper, cacheDir: String): DiskCache { - return DiskCacheBuilder() - .directory(userDataDir / cacheDir) - .maxSizeBytes(1024 * 1024 * 150) // 150 MB - .build() +actual fun DiskCacheBuilder.configure(contextWrapper: ContextWrapper, cacheDir: String) { + directory(userDataDir / cacheDir) + maxSizeBytes(1024 * 1024 * 150) // 150 MB } -actual fun memoryCache(contextWrapper: ContextWrapper): MemoryCache { - return MemoryCacheBuilder() - .build() +actual fun MemoryCacheBuilder.configure(contextWrapper: ContextWrapper) { } diff --git a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt index 910c0b05..4fc6fd7c 100644 --- a/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt +++ b/presentation/src/desktopMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt @@ -7,7 +7,6 @@ package ca.gosyer.jui.ui.util.compose import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.asComposeImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap import ca.gosyer.jui.domain.server.Http import io.ktor.client.call.body @@ -19,7 +18,6 @@ import okio.FileSystem import okio.Path import okio.buffer import org.jetbrains.skia.Image -import com.seiko.imageloader.Image as ImageLoaderImage fun imageFromFile(file: Path): ImageBitmap { return Image.makeFromEncoded(FileSystem.SYSTEM.source(file).buffer().readByteArray()) @@ -36,7 +34,3 @@ suspend fun imageFromUrl(client: Http, url: String, block: HttpRequestBuilder.() actual suspend fun HttpResponse.toImageBitmap(): ImageBitmap { return Image.makeFromEncoded(body()).toComposeImageBitmap() } - -actual fun ImageLoaderImage.asImageBitmap(): ImageBitmap { - return asComposeImageBitmap() -} diff --git a/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/base/image/IosImageLoaderBuilder.kt b/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/base/image/IosImageLoaderBuilder.kt index 8b9458c0..4543b989 100644 --- a/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/base/image/IosImageLoaderBuilder.kt +++ b/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/base/image/IosImageLoaderBuilder.kt @@ -6,13 +6,14 @@ package ca.gosyer.jui.ui.base.image +import ca.gosyer.jui.domain.server.Http import ca.gosyer.jui.uicore.vm.ContextWrapper -import com.seiko.imageloader.ImageLoaderBuilder -import com.seiko.imageloader.cache.disk.DiskCache import com.seiko.imageloader.cache.disk.DiskCacheBuilder -import com.seiko.imageloader.cache.memory.MemoryCache import com.seiko.imageloader.cache.memory.MemoryCacheBuilder -import com.seiko.imageloader.request.Options +import com.seiko.imageloader.cache.memory.maxSizePercent +import com.seiko.imageloader.component.ComponentRegistryBuilder +import com.seiko.imageloader.component.setupDefaultComponents +import com.seiko.imageloader.option.Options import okio.Path.Companion.toPath import platform.Foundation.NSCachesDirectory import platform.Foundation.NSFileManager @@ -20,15 +21,13 @@ import platform.Foundation.NSUserDomainMask actual val imageConfig: Options.ImageConfig = Options.ImageConfig.ARGB_8888 -actual fun imageLoaderBuilder(contextWrapper: ContextWrapper): ImageLoaderBuilder { - return ImageLoaderBuilder() +actual fun ComponentRegistryBuilder.register(contextWrapper: ContextWrapper, http: Http) { + setupDefaultComponents(httpClient = { http }) } -actual fun diskCache(contextWrapper: ContextWrapper, cacheDir: String): DiskCache { - return DiskCacheBuilder() - .directory(getCacheDir().toPath() / cacheDir) - .maxSizeBytes(1024 * 1024 * 150) // 150 MB - .build() +actual fun DiskCacheBuilder.configure(contextWrapper: ContextWrapper, cacheDir: String) { + directory(getCacheDir().toPath() / cacheDir) + maxSizeBytes(1024 * 1024 * 150) // 150 MB } private fun getCacheDir(): String { @@ -41,8 +40,6 @@ private fun getCacheDir(): String { )!!.path.orEmpty() } -actual fun memoryCache(contextWrapper: ContextWrapper): MemoryCache { - return MemoryCacheBuilder() - .maxSizePercent(0.25) - .build() +actual fun MemoryCacheBuilder.configure(contextWrapper: ContextWrapper) { + maxSizePercent(0.25) } diff --git a/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt b/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt index 6998402e..2abfc0cb 100644 --- a/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt +++ b/presentation/src/iosMain/kotlin/ca/gosyer/jui/ui/util/compose/Image.kt @@ -7,17 +7,11 @@ package ca.gosyer.jui.ui.util.compose import androidx.compose.ui.graphics.ImageBitmap -import androidx.compose.ui.graphics.asComposeImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap import io.ktor.client.call.body import io.ktor.client.statement.HttpResponse import org.jetbrains.skia.Image -import com.seiko.imageloader.Image as ImageLoaderImage actual suspend fun HttpResponse.toImageBitmap(): ImageBitmap { return Image.makeFromEncoded(body()).toComposeImageBitmap() } - -actual fun ImageLoaderImage.asImageBitmap(): ImageBitmap { - return asComposeImageBitmap() -} diff --git a/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/image/ImageLoaderImage.kt b/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/image/ImageLoaderImage.kt index b69284bc..7d6ad663 100644 --- a/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/image/ImageLoaderImage.kt +++ b/ui-core/src/commonMain/kotlin/ca/gosyer/jui/uicore/image/ImageLoaderImage.kt @@ -36,8 +36,8 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import ca.gosyer.jui.uicore.components.LoadingScreen import com.seiko.imageloader.ImageRequestState +import com.seiko.imageloader.model.ImageRequest import com.seiko.imageloader.rememberAsyncImagePainter -import com.seiko.imageloader.request.ImageRequestBuilder import org.lighthousegames.logging.logging private val log = logging() @@ -83,7 +83,7 @@ fun ImageLoaderImage( animationSpec: FiniteAnimationSpec? = tween() ) { key(data) { - val request = remember { ImageRequestBuilder().data(data).build() } + val request = remember { ImageRequest(data) } val painter = rememberAsyncImagePainter( request, contentScale = contentScale,