Refactor image loading configuration and improve item key handling in lists

This commit is contained in:
2026-01-17 17:54:04 +01:00
parent 625453692b
commit 249540be28
3 changed files with 56 additions and 32 deletions

View File

@@ -1,5 +1,6 @@
package hu.bbara.purefin
import android.content.pm.ApplicationInfo
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
@@ -8,7 +9,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.lifecycle.lifecycleScope
import coil3.ImageLoader
import coil3.compose.setSingletonImageLoaderFactory
import coil3.SingletonImageLoader
import coil3.disk.DiskCache
import coil3.memory.MemoryCache
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
@@ -38,41 +39,20 @@ class PurefinActivity : ComponentActivity() {
@Inject
lateinit var authInterceptor: JellyfinAuthInterceptor
private val imageOkHttpClient: OkHttpClient by lazy {
OkHttpClient.Builder()
.addNetworkInterceptor(authInterceptor)
.build()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch { init() }
configureImageLoader()
enableEdgeToEdge()
setContent {
PurefinTheme {
setSingletonImageLoaderFactory { context ->
ImageLoader.Builder(context)
.components {
add(
OkHttpNetworkFetcherFactory(
callFactory = {
OkHttpClient.Builder()
.addNetworkInterceptor(authInterceptor)
.build()
}
)
)
}
.memoryCache {
MemoryCache.Builder()
.maxSizePercent(context, 0.10)
.build()
}
.diskCache {
DiskCache.Builder()
.directory(context.cacheDir.resolve("image_cache").absolutePath.toPath())
.maxSizeBytes(30000000)
.build()
}
.logger(DebugLogger())
.crossfade(true)
.build()
}
val isLoggedIn by userSessionRepository.isLoggedIn.collectAsState(initial = false)
if (isLoggedIn) {
HomePage()
@@ -86,4 +66,39 @@ class PurefinActivity : ComponentActivity() {
private suspend fun init() {
jellyfinApiClient.updateApiClient()
}
private fun configureImageLoader() {
SingletonImageLoader.setSafe { context ->
val builder = ImageLoader.Builder(context)
.components {
add(
OkHttpNetworkFetcherFactory(
callFactory = { imageOkHttpClient }
)
)
}
.memoryCache {
MemoryCache.Builder()
.maxSizePercent(context, 0.20)
.build()
}
.diskCache {
DiskCache.Builder()
.directory(context.cacheDir.resolve("image_cache").absolutePath.toPath())
.maxSizeBytes(30000000)
.build()
}
.crossfade(true)
if (isDebuggable()) {
builder.logger(DebugLogger())
}
builder.build()
}
}
private fun isDebuggable(): Boolean {
return (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
}
}

View File

@@ -39,7 +39,10 @@ fun HomeContent(
colors = colors
)
}
items(libraries) { item ->
items(
items = libraries,
key = { it.id }
) { item ->
LibraryPosterSection(
title = item.name,
items = libraryContent[item.id] ?: emptyList(),

View File

@@ -50,7 +50,10 @@ fun ContinueWatchingSection(
contentPadding = PaddingValues(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
items(items) { item ->
items(
items = items,
key = { it.id }
) { item ->
ContinueWatchingCard(
item = item,
colors = colors
@@ -145,7 +148,10 @@ fun LibraryPosterSection(
contentPadding = PaddingValues(horizontal = 16.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
items(items) { item ->
items(
items = items,
key = { it.id }
) { item ->
PosterCard(
item = item,
colors = colors