feat(image): migrate to Coil 3.6.0 with OkHttp network fetcher (#996)

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-08-27 15:13:18 +03:00
1 parent 10d7d473fd
commit 14fde03083
7 files changed
+33 -20

No files matched your search

+2 -1
View File
@@ -171,9 +171,10 @@ dependencies {
implementation(libs.latex.parser) implementation(libs.latex.parser)
implementation(libs.latex.renderer) implementation(libs.latex.renderer)
// Image loading // Image loading (Coil 3)
implementation(libs.coil.compose) implementation(libs.coil.compose)
implementation(libs.coil.gif) implementation(libs.coil.gif)
implementation(libs.coil.network.okhttp)
// Encrypted storage // Encrypted storage
implementation(libs.androidx.security.crypto) implementation(libs.androidx.security.crypto)
@@ -2,10 +2,13 @@ package com.m57.hermescontrol
import android.app.Application import android.app.Application
import android.os.Build import android.os.Build
import coil.ImageLoader import coil3.ImageLoader
import coil.ImageLoaderFactory import coil3.PlatformContext
import coil.decode.GifDecoder import coil3.SingletonImageLoader
import coil.decode.ImageDecoderDecoder import coil3.gif.AnimatedImageDecoder
import coil3.gif.GifDecoder
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
import coil3.request.crossfade
import com.m57.hermescontrol.data.local.AuthManager import com.m57.hermescontrol.data.local.AuthManager
import com.m57.hermescontrol.data.remote.NetworkMonitor import com.m57.hermescontrol.data.remote.NetworkMonitor
import com.m57.hermescontrol.data.remote.OkHttpProvider import com.m57.hermescontrol.data.remote.OkHttpProvider
@@ -14,7 +17,7 @@ import com.m57.hermescontrol.ui.analytics.AnalyticsPreloader
class HermesControlApp : class HermesControlApp :
Application(), Application(),
ImageLoaderFactory { SingletonImageLoader.Factory {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
AuthManager.init(this) AuthManager.init(this)
@@ -31,13 +34,17 @@ class HermesControlApp :
UpdateNoticeManager.checkOnLaunch() UpdateNoticeManager.checkOnLaunch()
} }
override fun newImageLoader(): ImageLoader = override fun newImageLoader(context: PlatformContext): ImageLoader =
ImageLoader ImageLoader
.Builder(this) .Builder(context)
.okHttpClient(OkHttpProvider.base)
.components { .components {
add(
OkHttpNetworkFetcherFactory(
callFactory = { OkHttpProvider.base },
),
)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
add(ImageDecoderDecoder.Factory()) add(AnimatedImageDecoder.Factory())
} else { } else {
add(GifDecoder.Factory()) add(GifDecoder.Factory())
} }
@@ -35,7 +35,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import coil.compose.AsyncImage import coil3.compose.AsyncImage
import com.m57.hermescontrol.R import com.m57.hermescontrol.R
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -60,7 +60,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage import coil3.compose.AsyncImage
import com.m57.hermescontrol.R import com.m57.hermescontrol.R
import com.m57.hermescontrol.data.model.Attachment import com.m57.hermescontrol.data.model.Attachment
import com.m57.hermescontrol.data.model.ProfileInfo import com.m57.hermescontrol.data.model.ProfileInfo
@@ -25,10 +25,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage import coil3.asDrawable
import coil3.compose.AsyncImage
import com.m57.hermescontrol.R import com.m57.hermescontrol.R
@Composable @Composable
@@ -54,6 +56,7 @@ fun GifImageThumbnail(
} }
} }
val context = LocalContext.current
Box( Box(
modifier = modifier =
modifier modifier
@@ -65,7 +68,7 @@ fun GifImageThumbnail(
model = model, model = model,
contentDescription = contentDescription, contentDescription = contentDescription,
onSuccess = { result -> onSuccess = { result ->
val drawable = result.result.drawable val drawable = result.result.image.asDrawable(context.resources)
if (drawable is Animatable) { if (drawable is Animatable) {
animatableDrawable = drawable animatableDrawable = drawable
if (isPlaying) { if (isPlaying) {
@@ -35,8 +35,9 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage import coil3.compose.AsyncImage
import coil.request.ImageRequest import coil3.request.ImageRequest
import coil3.request.crossfade
import com.m57.hermescontrol.data.model.BotAvatarMeta import com.m57.hermescontrol.data.model.BotAvatarMeta
import com.m57.hermescontrol.theme.StatusGreen import com.m57.hermescontrol.theme.StatusGreen
import com.m57.hermescontrol.theme.parseHexColor import com.m57.hermescontrol.theme.parseHexColor
+5 -4
View File
@@ -25,7 +25,7 @@ retrofit = "3.0.0"
securityCrypto = "1.0.0" securityCrypto = "1.0.0"
mockk = "1.14.11" mockk = "1.14.11"
turbine = "1.2.1" turbine = "1.2.1"
coil = "2.7.0" coil = "3.6.0"
room = "3.0.2" room = "3.0.2"
sqlcipher = "4.18.0" sqlcipher = "4.18.0"
datastore = "1.1.2" datastore = "1.1.2"
@@ -86,9 +86,10 @@ latex-base = { module = "io.github.huarangmeng:latex-base", version.ref = "latex
latex-parser = { module = "io.github.huarangmeng:latex-parser", version.ref = "latex" } latex-parser = { module = "io.github.huarangmeng:latex-parser", version.ref = "latex" }
latex-renderer = { module = "io.github.huarangmeng:latex-renderer", version.ref = "latex" } latex-renderer = { module = "io.github.huarangmeng:latex-renderer", version.ref = "latex" }
# Image loading # Image loading (Coil 3)
coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" }
coil-gif = { module = "io.coil-kt:coil-gif", version.ref = "coil" } coil-gif = { module = "io.coil-kt.coil3:coil-gif", version.ref = "coil" }
coil-network-okhttp = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }