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.buildkonfig) apply false
alias(libs.plugins.moko.gradle) apply false alias(libs.plugins.moko.gradle) apply false
alias(libs.plugins.kotlinter) apply false alias(libs.plugins.kotlinter) apply false
alias(libs.plugins.ktorfit) apply false
alias(libs.plugins.aboutLibraries) apply false alias(libs.plugins.aboutLibraries) apply false
alias(libs.plugins.versions) alias(libs.plugins.versions)
} }

View File

@@ -6,6 +6,7 @@ plugins {
id(libs.plugins.ksp.get().pluginId) id(libs.plugins.ksp.get().pluginId)
id(libs.plugins.buildkonfig.get().pluginId) id(libs.plugins.buildkonfig.get().pluginId)
id(libs.plugins.kotlinter.get().pluginId) id(libs.plugins.kotlinter.get().pluginId)
id(libs.plugins.ktorfit.get().pluginId)
} }
kotlin { 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.backup.service.BackupRepository
import ca.gosyer.jui.domain.category.service.CategoryRepository import ca.gosyer.jui.domain.category.service.CategoryRepository
import ca.gosyer.jui.domain.chapter.service.ChapterRepository 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.download.service.DownloadRepository
import ca.gosyer.jui.domain.extension.service.ExtensionRepository import ca.gosyer.jui.domain.extension.service.ExtensionRepository
import ca.gosyer.jui.domain.global.service.GlobalRepository import ca.gosyer.jui.domain.global.service.GlobalRepository
@@ -35,35 +34,35 @@ interface DataComponent {
.build() .build()
@Provides @Provides
fun backupRepository(ktorfit: Ktorfit) = ktorfit.createIt<BackupRepository>() fun backupRepository(ktorfit: Ktorfit) = ktorfit.create<BackupRepository>()
@Provides @Provides
fun categoryRepository(ktorfit: Ktorfit) = ktorfit.createIt<CategoryRepository>() fun categoryRepository(ktorfit: Ktorfit) = ktorfit.create<CategoryRepository>()
@Provides @Provides
fun chapterRepository(ktorfit: Ktorfit) = ktorfit.createIt<ChapterRepository>() fun chapterRepository(ktorfit: Ktorfit) = ktorfit.create<ChapterRepository>()
@Provides @Provides
fun downloadRepository(ktorfit: Ktorfit) = ktorfit.createIt<DownloadRepository>() fun downloadRepository(ktorfit: Ktorfit) = ktorfit.create<DownloadRepository>()
@Provides @Provides
fun extensionRepository(ktorfit: Ktorfit) = ktorfit.createIt<ExtensionRepository>() fun extensionRepository(ktorfit: Ktorfit) = ktorfit.create<ExtensionRepository>()
@Provides @Provides
fun globalRepository(ktorfit: Ktorfit) = ktorfit.createIt<GlobalRepository>() fun globalRepository(ktorfit: Ktorfit) = ktorfit.create<GlobalRepository>()
@Provides @Provides
fun libraryRepository(ktorfit: Ktorfit) = ktorfit.createIt<LibraryRepository>() fun libraryRepository(ktorfit: Ktorfit) = ktorfit.create<LibraryRepository>()
@Provides @Provides
fun mangaRepository(ktorfit: Ktorfit) = ktorfit.createIt<MangaRepository>() fun mangaRepository(ktorfit: Ktorfit) = ktorfit.create<MangaRepository>()
@Provides @Provides
fun settingsRepository(ktorfit: Ktorfit) = ktorfit.createIt<SettingsRepository>() fun settingsRepository(ktorfit: Ktorfit) = ktorfit.create<SettingsRepository>()
@Provides @Provides
fun sourceRepository(ktorfit: Ktorfit) = ktorfit.createIt<SourceRepository>() fun sourceRepository(ktorfit: Ktorfit) = ktorfit.create<SourceRepository>()
@Provides @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] [versions]
# Kotlin # Kotlin
kotlin = "1.7.20" kotlin = "1.8.0"
coroutines = "1.6.4" coroutines = "1.6.4"
# Serialization # Serialization
json = "1.4.1" json = "1.4.1"
# Compose # Compose
composeGradle = "1.2.1" composeGradle = "1.3.0"
composeCompiler = "1.3.2.1" composeCompiler = "1.4.0"
composeAndroid = "1.2.1" composeAndroidRuntime = "1.3.3"
voyager = "1.0.0-rc06" 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" accompanist = "0.25.2"
googleAccompanist = "0.25.1" googleAccompanist = "0.28.0"
imageloader = "1.2.2.1" imageloader = "1.2.8"
materialDialogs = "0.9.1" materialDialogs = "0.9.1"
# Android # Android
androidGradle = "7.3.1" androidGradle = "7.4.1"
core = "1.9.0" core = "1.9.0"
appCompat = "1.6.0-rc01" appCompat = "1.7.0-alpha01"
activityCompose = "1.6.1" activityCompose = "1.6.1"
work = "2.7.1" work = "2.7.1"
# Android Lifecycle # Android Lifecycle
lifecycle = "2.6.0-alpha03" lifecycle = "2.6.0-alpha05"
# Swing # Swing
darklaf = "3.0.2" darklaf = "3.0.2"
# Ksp # Ksp
ksp = "1.7.20-1.0.8" ksp = "1.8.0-1.0.9"
# Dependency Injection # Dependency Injection
kotlinInject = "0.5.1" kotlinInject = "0.5.1"
# Network # Network
ktor = "2.1.3" ktor = "2.2.3"
ktorfit = "1.0.0-beta16" ktorfit = "1.0.0-beta17"
# Logging # Logging
slf4j = "2.0.3" slf4j = "2.0.6"
log4j = "2.19.0" log4j = "2.19.0"
kmlogging = "1.2.0" kmlogging = "1.2.1"
# Storage # Storage
okio = "3.2.0" okio = "3.3.0"
appDirs = "1.2.1" appDirs = "1.2.1"
# Preferences # Preferences
@@ -53,10 +59,10 @@ multiplatformSettings = "1.0.0-alpha01"
# Utility # Utility
desugarJdkLibs = "1.2.2" desugarJdkLibs = "1.2.2"
aboutLibraries = "10.5.1" aboutLibraries = "10.5.2"
dateTime = "0.4.0" dateTime = "0.4.0"
immutableCollections = "0.3.5" immutableCollections = "0.3.5"
kds = "3.3.1" kds = "3.4.0"
# Localization # Localization
moko = "0.20.1" moko = "0.20.1"
@@ -66,10 +72,10 @@ buildconfig = "3.1.0"
buildkonfig = "0.13.3" buildkonfig = "0.13.3"
# Linter # Linter
kotlinter = "3.12.0" kotlinter = "3.13.0"
# Version updates # Version updates
versions = "0.43.0" versions = "0.45.0"
# Optimizer # Optimizer
proguard = "7.2.2" 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" } serialization-json-okio = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-okio", version.ref = "json" }
# Compose # Compose
compose-animation = { module = "androidx.compose.animation:animation", version.ref = "composeAndroid" } compose-animation = { module = "androidx.compose.animation:animation", version.ref = "composeAndroidAnimation" }
compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "composeAndroid" } compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "composeAndroidFoundation" }
compose-runtime = { module = "androidx.compose.runtime:runtime", version.ref = "composeAndroid" } compose-runtime = { module = "androidx.compose.runtime:runtime", version.ref = "composeAndroidRuntime" }
compose-ui-core = { module = "androidx.compose.ui:ui", version.ref = "composeAndroid" } compose-ui-core = { module = "androidx.compose.ui:ui", version.ref = "composeAndroidUI" }
compose-ui-util = { module = "androidx.compose.ui:ui-util", version.ref = "composeAndroid" } compose-ui-util = { module = "androidx.compose.ui:ui-util", version.ref = "composeAndroidUI" }
compose-ui-text = { module = "androidx.compose.ui:ui-text", version.ref = "composeAndroid" } 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 = "composeAndroid" } compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "composeAndroidUI" }
compose-material-core = { module = "androidx.compose.material:material", version.ref = "composeAndroid" } compose-material-core = { module = "androidx.compose.material:material", version.ref = "composeAndroidMaterial" }
compose-material-icons = { module = "androidx.compose.material:material-icons-extended", version.ref = "composeAndroid" } compose-material-icons = { module = "androidx.compose.material:material-icons-extended", version.ref = "composeAndroidMaterial" }
# Compose UI # Compose UI
voyager-core = { module = "ca.gosyer:voyager-core", version.ref = "voyager" } voyager-core = { module = "ca.gosyer:voyager-core", version.ref = "voyager" }
voyager-navigation = { module = "ca.gosyer:voyager-navigator", 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
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"} ksp = { id = "com.google.devtools.ksp", version.ref = "ksp"}
# Network
ktorfit = { id = "de.jensklingenberg.ktorfit", version = "1.0.0"}
# Localization # Localization
moko-gradle = { id = "dev.icerock.mobile.multiplatform-resources", version.ref = "moko"} 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 import com.seiko.imageloader.component.decoder.Decoder
actual class BitmapDecoderFactory actual constructor(contextWrapper: ContextWrapper) : 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 package ca.gosyer.jui.ui.base.image
import android.os.Build import android.os.Build
import ca.gosyer.jui.domain.server.Http
import ca.gosyer.jui.uicore.vm.ContextWrapper 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.disk.DiskCacheBuilder
import com.seiko.imageloader.cache.memory.MemoryCache
import com.seiko.imageloader.cache.memory.MemoryCacheBuilder 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 import okio.Path.Companion.toOkioPath
actual val imageConfig: Options.ImageConfig = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { 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 Options.ImageConfig.HARDWARE
} }
actual fun imageLoaderBuilder(contextWrapper: ContextWrapper): ImageLoaderBuilder { actual fun ComponentRegistryBuilder.register(contextWrapper: ContextWrapper, http: Http) {
return ImageLoaderBuilder(contextWrapper) setupDefaultComponents(contextWrapper, httpClient = { http })
} }
actual fun diskCache(contextWrapper: ContextWrapper, cacheDir: String): DiskCache { actual fun DiskCacheBuilder.configure(contextWrapper: ContextWrapper, cacheDir: String) {
return DiskCacheBuilder() directory(contextWrapper.cacheDir.toOkioPath() / cacheDir)
.directory(contextWrapper.cacheDir.toOkioPath() / cacheDir) maxSizeBytes(1024 * 1024 * 150) // 150 MB
.maxSizeBytes(1024 * 1024 * 150) // 150 MB
.build()
} }
actual fun memoryCache(contextWrapper: ContextWrapper): MemoryCache { actual fun MemoryCacheBuilder.configure(contextWrapper: ContextWrapper) {
return MemoryCacheBuilder(contextWrapper)
.build()
} }

View File

@@ -9,7 +9,6 @@ package ca.gosyer.jui.ui.util.compose
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import com.seiko.imageloader.Image
import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.bodyAsChannel import io.ktor.client.statement.bodyAsChannel
import io.ktor.utils.io.jvm.javaio.toInputStream 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 { actual suspend fun HttpResponse.toImageBitmap(): ImageBitmap {
return BitmapFactory.decodeStream(bodyAsChannel().toInputStream()).asImageBitmap() 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.core.di.AppScope
import ca.gosyer.jui.ui.ViewModelComponent import ca.gosyer.jui.ui.ViewModelComponent
import ca.gosyer.jui.ui.base.image.ImageLoaderProvider 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 ca.gosyer.jui.uicore.vm.ContextWrapper
import com.seiko.imageloader.ImageLoader import com.seiko.imageloader.ImageLoader
import com.seiko.imageloader.LocalImageLoader import com.seiko.imageloader.LocalImageLoader
@@ -27,7 +27,7 @@ interface UiComponent {
val contextWrapper: ContextWrapper val contextWrapper: ContextWrapper
val hooks: Array<ProvidedValue<out Any>> val hooks: Array<ProvidedValue<out Any?>>
val imageCache: ImageCache val imageCache: ImageCache
@@ -39,11 +39,11 @@ interface UiComponent {
@AppScope @AppScope
@Provides @Provides
fun imageCacheFactory(): ImageCache = diskCache(contextWrapper, "image_cache") fun imageCacheFactory(): ImageCache = DiskCache { configure(contextWrapper, "image_cache") }
@AppScope @AppScope
@Provides @Provides
fun chapterCacheFactory(): ChapterCache = diskCache(contextWrapper, "chapter_cache") fun chapterCacheFactory(): ChapterCache = DiskCache { configure(contextWrapper, "chapter_cache") }
@Provides @Provides
fun getHooks(viewModelComponent: ViewModelComponent) = arrayOf( 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.ui.base.ImageCache
import ca.gosyer.jui.uicore.vm.ContextWrapper import ca.gosyer.jui.uicore.vm.ContextWrapper
import com.seiko.imageloader.ImageLoader import com.seiko.imageloader.ImageLoader
import com.seiko.imageloader.ImageLoaderBuilder import com.seiko.imageloader.cache.disk.DiskCacheBuilder
import com.seiko.imageloader.cache.disk.DiskCache import com.seiko.imageloader.cache.memory.MemoryCacheBuilder
import com.seiko.imageloader.cache.memory.MemoryCache import com.seiko.imageloader.component.ComponentRegistryBuilder
import com.seiko.imageloader.component.keyer.Keyer import com.seiko.imageloader.component.keyer.Keyer
import com.seiko.imageloader.component.mapper.Mapper 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.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import me.tatarka.inject.annotations.Inject import me.tatarka.inject.annotations.Inject
@@ -33,9 +34,9 @@ class ImageLoaderProvider @Inject constructor(
val serverUrl = serverPreferences.serverUrl().stateIn(GlobalScope) val serverUrl = serverPreferences.serverUrl().stateIn(GlobalScope)
fun get(imageCache: ImageCache): ImageLoader { fun get(imageCache: ImageCache): ImageLoader {
return imageLoaderBuilder(context).apply { return ImageLoader {
httpClient { http }
components { components {
register(context, http)
add(MangaCoverMapper()) add(MangaCoverMapper())
add(MangaCoverKeyer()) add(MangaCoverKeyer())
add(ExtensionIconMapper()) add(ExtensionIconMapper())
@@ -43,23 +44,19 @@ class ImageLoaderProvider @Inject constructor(
add(SourceIconMapper()) add(SourceIconMapper())
add(SourceIconKeyer()) add(SourceIconKeyer())
} }
options( options.config = imageConfig
Options(config = imageConfig) interceptor {
) diskCache { imageCache }
diskCache { memoryCacheConfig { configure(context) }
imageCache
} }
memoryCache { }
memoryCache(context)
}
}.build()
} }
inner class MangaCoverMapper : Mapper<String> { inner class MangaCoverMapper : Mapper<Url> {
override fun map(data: Any, options: Options): String? { override fun map(data: Any, options: Options): Url? {
if (data !is Manga) return null if (data !is Manga) return null
if (data.thumbnailUrl.isNullOrBlank()) 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> { inner class ExtensionIconMapper : Mapper<Url> {
override fun map(data: Any, options: Options): String? { override fun map(data: Any, options: Options): Url? {
if (data !is Extension) return null if (data !is Extension) return null
if (data.iconUrl.isBlank()) 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> { inner class SourceIconMapper : Mapper<Url> {
override fun map(data: Any, options: Options): String? { override fun map(data: Any, options: Options): Url? {
if (data !is Source) return null if (data !is Source) return null
if (data.iconUrl.isBlank()) 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 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.base.model.StableHolder
import ca.gosyer.jui.ui.reader.model.ReaderChapter import ca.gosyer.jui.ui.reader.model.ReaderChapter
import ca.gosyer.jui.ui.reader.model.ReaderPage 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 ca.gosyer.jui.ui.util.lang.toSource
import cafe.adriel.voyager.core.concurrent.AtomicInt32 import cafe.adriel.voyager.core.concurrent.AtomicInt32
import com.seiko.imageloader.asImageBitmap
import com.seiko.imageloader.cache.disk.DiskCache import com.seiko.imageloader.cache.disk.DiskCache
import com.seiko.imageloader.component.decoder.DecodeImageResult import com.seiko.imageloader.component.decoder.DecodeResult
import com.seiko.imageloader.request.ImageRequestBuilder import com.seiko.imageloader.model.DataSource
import com.seiko.imageloader.request.Options import com.seiko.imageloader.model.ImageRequest
import com.seiko.imageloader.request.SourceResult import com.seiko.imageloader.model.ImageResult
import com.seiko.imageloader.option.Options
import io.ktor.client.plugins.onDownload import io.ktor.client.plugins.onDownload
import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.HttpResponse
import io.ktor.client.statement.bodyAsChannel import io.ktor.client.statement.bodyAsChannel
@@ -149,17 +150,18 @@ class TachideskPageLoader(
return chapterCache[page.cacheKey]?.use { return chapterCache[page.cacheKey]?.use {
it.source().use { source -> it.source().use { source ->
val decoder = bitmapDecoderFactory.create( val decoder = bitmapDecoderFactory.create(
SourceResult( ImageResult.Source(
ImageRequestBuilder().build(), ImageRequest(Any()),
source source,
DataSource.Engine
), ),
Options() Options()
) )
if (decoder != null) { if (decoder != null) {
runCatching { decoder.decode() as DecodeImageResult } runCatching { decoder.decode() as DecodeResult.Bitmap }
.mapCatching { .mapCatching {
ReaderPage.ImageDecodeState.Success( ReaderPage.ImageDecodeState.Success(
it.image.asImageBitmap().also { it.bitmap.asImageBitmap().also {
page.bitmapInfo.value = ReaderPage.BitmapInfo( page.bitmapInfo.value = ReaderPage.BitmapInfo(
IntSize(it.width, it.height) IntSize(it.width, it.height)
) )

View File

@@ -7,9 +7,6 @@
package ca.gosyer.jui.ui.util.compose package ca.gosyer.jui.ui.util.compose
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import com.seiko.imageloader.Image
import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.HttpResponse
expect suspend fun HttpResponse.toImageBitmap(): ImageBitmap expect suspend fun HttpResponse.toImageBitmap(): ImageBitmap
expect fun Image.asImageBitmap(): ImageBitmap

View File

@@ -7,28 +7,24 @@
package ca.gosyer.jui.ui.base.image package ca.gosyer.jui.ui.base.image
import ca.gosyer.jui.core.io.userDataDir import ca.gosyer.jui.core.io.userDataDir
import ca.gosyer.jui.domain.server.Http
import ca.gosyer.jui.uicore.vm.ContextWrapper 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.disk.DiskCacheBuilder
import com.seiko.imageloader.cache.memory.MemoryCache
import com.seiko.imageloader.cache.memory.MemoryCacheBuilder 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 val imageConfig: Options.ImageConfig = Options.ImageConfig.ARGB_8888
actual fun imageLoaderBuilder(contextWrapper: ContextWrapper): ImageLoaderBuilder { actual fun ComponentRegistryBuilder.register(contextWrapper: ContextWrapper, http: Http) {
return ImageLoaderBuilder() setupDefaultComponents(httpClient = { http })
} }
actual fun diskCache(contextWrapper: ContextWrapper, cacheDir: String): DiskCache { actual fun DiskCacheBuilder.configure(contextWrapper: ContextWrapper, cacheDir: String) {
return DiskCacheBuilder() directory(userDataDir / cacheDir)
.directory(userDataDir / cacheDir) maxSizeBytes(1024 * 1024 * 150) // 150 MB
.maxSizeBytes(1024 * 1024 * 150) // 150 MB
.build()
} }
actual fun memoryCache(contextWrapper: ContextWrapper): MemoryCache { actual fun MemoryCacheBuilder.configure(contextWrapper: ContextWrapper) {
return MemoryCacheBuilder()
.build()
} }

View File

@@ -7,7 +7,6 @@
package ca.gosyer.jui.ui.util.compose package ca.gosyer.jui.ui.util.compose
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asComposeImageBitmap
import androidx.compose.ui.graphics.toComposeImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap
import ca.gosyer.jui.domain.server.Http import ca.gosyer.jui.domain.server.Http
import io.ktor.client.call.body import io.ktor.client.call.body
@@ -19,7 +18,6 @@ import okio.FileSystem
import okio.Path import okio.Path
import okio.buffer import okio.buffer
import org.jetbrains.skia.Image import org.jetbrains.skia.Image
import com.seiko.imageloader.Image as ImageLoaderImage
fun imageFromFile(file: Path): ImageBitmap { fun imageFromFile(file: Path): ImageBitmap {
return Image.makeFromEncoded(FileSystem.SYSTEM.source(file).buffer().readByteArray()) 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 { actual suspend fun HttpResponse.toImageBitmap(): ImageBitmap {
return Image.makeFromEncoded(body<ByteArray>()).toComposeImageBitmap() 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 package ca.gosyer.jui.ui.base.image
import ca.gosyer.jui.domain.server.Http
import ca.gosyer.jui.uicore.vm.ContextWrapper 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.disk.DiskCacheBuilder
import com.seiko.imageloader.cache.memory.MemoryCache
import com.seiko.imageloader.cache.memory.MemoryCacheBuilder 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 okio.Path.Companion.toPath
import platform.Foundation.NSCachesDirectory import platform.Foundation.NSCachesDirectory
import platform.Foundation.NSFileManager import platform.Foundation.NSFileManager
@@ -20,15 +21,13 @@ import platform.Foundation.NSUserDomainMask
actual val imageConfig: Options.ImageConfig = Options.ImageConfig.ARGB_8888 actual val imageConfig: Options.ImageConfig = Options.ImageConfig.ARGB_8888
actual fun imageLoaderBuilder(contextWrapper: ContextWrapper): ImageLoaderBuilder { actual fun ComponentRegistryBuilder.register(contextWrapper: ContextWrapper, http: Http) {
return ImageLoaderBuilder() setupDefaultComponents(httpClient = { http })
} }
actual fun diskCache(contextWrapper: ContextWrapper, cacheDir: String): DiskCache { actual fun DiskCacheBuilder.configure(contextWrapper: ContextWrapper, cacheDir: String) {
return DiskCacheBuilder() directory(getCacheDir().toPath() / cacheDir)
.directory(getCacheDir().toPath() / cacheDir) maxSizeBytes(1024 * 1024 * 150) // 150 MB
.maxSizeBytes(1024 * 1024 * 150) // 150 MB
.build()
} }
private fun getCacheDir(): String { private fun getCacheDir(): String {
@@ -41,8 +40,6 @@ private fun getCacheDir(): String {
)!!.path.orEmpty() )!!.path.orEmpty()
} }
actual fun memoryCache(contextWrapper: ContextWrapper): MemoryCache { actual fun MemoryCacheBuilder.configure(contextWrapper: ContextWrapper) {
return MemoryCacheBuilder() maxSizePercent(0.25)
.maxSizePercent(0.25)
.build()
} }

View File

@@ -7,17 +7,11 @@
package ca.gosyer.jui.ui.util.compose package ca.gosyer.jui.ui.util.compose
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asComposeImageBitmap
import androidx.compose.ui.graphics.toComposeImageBitmap import androidx.compose.ui.graphics.toComposeImageBitmap
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.HttpResponse
import org.jetbrains.skia.Image import org.jetbrains.skia.Image
import com.seiko.imageloader.Image as ImageLoaderImage
actual suspend fun HttpResponse.toImageBitmap(): ImageBitmap { actual suspend fun HttpResponse.toImageBitmap(): ImageBitmap {
return Image.makeFromEncoded(body<ByteArray>()).toComposeImageBitmap() 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 androidx.compose.ui.unit.dp
import ca.gosyer.jui.uicore.components.LoadingScreen import ca.gosyer.jui.uicore.components.LoadingScreen
import com.seiko.imageloader.ImageRequestState import com.seiko.imageloader.ImageRequestState
import com.seiko.imageloader.model.ImageRequest
import com.seiko.imageloader.rememberAsyncImagePainter import com.seiko.imageloader.rememberAsyncImagePainter
import com.seiko.imageloader.request.ImageRequestBuilder
import org.lighthousegames.logging.logging import org.lighthousegames.logging.logging
private val log = logging() private val log = logging()
@@ -83,7 +83,7 @@ fun ImageLoaderImage(
animationSpec: FiniteAnimationSpec<Float>? = tween() animationSpec: FiniteAnimationSpec<Float>? = tween()
) { ) {
key(data) { key(data) {
val request = remember { ImageRequestBuilder().data(data).build() } val request = remember { ImageRequest(data) }
val painter = rememberAsyncImagePainter( val painter = rememberAsyncImagePainter(
request, request,
contentScale = contentScale, contentScale = contentScale,