Update dependencies

This commit is contained in:
Syer10
2023-02-02 23:43:04 -05:00
parent 51547ae4df
commit a23d9e85c3
17 changed files with 126 additions and 160 deletions

View File

@@ -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)
}

View File

@@ -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 {

View File

@@ -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<BackupRepository>()
fun backupRepository(ktorfit: Ktorfit) = ktorfit.create<BackupRepository>()
@Provides
fun categoryRepository(ktorfit: Ktorfit) = ktorfit.createIt<CategoryRepository>()
fun categoryRepository(ktorfit: Ktorfit) = ktorfit.create<CategoryRepository>()
@Provides
fun chapterRepository(ktorfit: Ktorfit) = ktorfit.createIt<ChapterRepository>()
fun chapterRepository(ktorfit: Ktorfit) = ktorfit.create<ChapterRepository>()
@Provides
fun downloadRepository(ktorfit: Ktorfit) = ktorfit.createIt<DownloadRepository>()
fun downloadRepository(ktorfit: Ktorfit) = ktorfit.create<DownloadRepository>()
@Provides
fun extensionRepository(ktorfit: Ktorfit) = ktorfit.createIt<ExtensionRepository>()
fun extensionRepository(ktorfit: Ktorfit) = ktorfit.create<ExtensionRepository>()
@Provides
fun globalRepository(ktorfit: Ktorfit) = ktorfit.createIt<GlobalRepository>()
fun globalRepository(ktorfit: Ktorfit) = ktorfit.create<GlobalRepository>()
@Provides
fun libraryRepository(ktorfit: Ktorfit) = ktorfit.createIt<LibraryRepository>()
fun libraryRepository(ktorfit: Ktorfit) = ktorfit.create<LibraryRepository>()
@Provides
fun mangaRepository(ktorfit: Ktorfit) = ktorfit.createIt<MangaRepository>()
fun mangaRepository(ktorfit: Ktorfit) = ktorfit.create<MangaRepository>()
@Provides
fun settingsRepository(ktorfit: Ktorfit) = ktorfit.createIt<SettingsRepository>()
fun settingsRepository(ktorfit: Ktorfit) = ktorfit.create<SettingsRepository>()
@Provides
fun sourceRepository(ktorfit: Ktorfit) = ktorfit.createIt<SourceRepository>()
fun sourceRepository(ktorfit: Ktorfit) = ktorfit.create<SourceRepository>()
@Provides
fun updatesRepository(ktorfit: Ktorfit) = ktorfit.createIt<UpdatesRepository>()
fun updatesRepository(ktorfit: Ktorfit) = ktorfit.create<UpdatesRepository>()
}

View File

@@ -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 <reified T> Ktorfit.createIt(): T = create()

View File

@@ -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"}

View File

@@ -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)

View File

@@ -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) {
}

View File

@@ -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()
}

View File

@@ -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<ProvidedValue<out Any>>
val hooks: Array<ProvidedValue<out Any?>>
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(

View File

@@ -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<String> {
override fun map(data: Any, options: Options): String? {
inner class MangaCoverMapper : Mapper<Url> {
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<String> {
override fun map(data: Any, options: Options): String? {
inner class ExtensionIconMapper : Mapper<Url> {
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<String> {
override fun map(data: Any, options: Options): String? {
inner class SourceIconMapper : Mapper<Url> {
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)

View File

@@ -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)
)

View File

@@ -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

View File

@@ -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) {
}

View File

@@ -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<ByteArray>()).toComposeImageBitmap()
}
actual fun ImageLoaderImage.asImageBitmap(): ImageBitmap {
return asComposeImageBitmap()
}

View File

@@ -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)
}

View File

@@ -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<ByteArray>()).toComposeImageBitmap()
}
actual fun ImageLoaderImage.asImageBitmap(): ImageBitmap {
return asComposeImageBitmap()
}

View File

@@ -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<Float>? = tween()
) {
key(data) {
val request = remember { ImageRequestBuilder().data(data).build() }
val request = remember { ImageRequest(data) }
val painter = rememberAsyncImagePainter(
request,
contentScale = contentScale,