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.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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]
|
[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"}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user