mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-10 06:42:05 +01:00
Update dependencies
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>()
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
@@ -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"}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user