From 249540be2874ee0ece6e58a4fd94cc96cf66a891 Mon Sep 17 00:00:00 2001 From: Barnabas Balogh Date: Sat, 17 Jan 2026 17:54:04 +0100 Subject: [PATCH] Refactor image loading configuration and improve item key handling in lists --- .../java/hu/bbara/purefin/PurefinActivity.kt | 73 +++++++++++-------- .../hu/bbara/purefin/app/home/HomeContent.kt | 5 +- .../hu/bbara/purefin/app/home/HomeSections.kt | 10 ++- 3 files changed, 56 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt b/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt index 42d074d..b6eb8e2 100644 --- a/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt +++ b/app/src/main/java/hu/bbara/purefin/PurefinActivity.kt @@ -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 + } } diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomeContent.kt b/app/src/main/java/hu/bbara/purefin/app/home/HomeContent.kt index ce18030..32ce8d0 100644 --- a/app/src/main/java/hu/bbara/purefin/app/home/HomeContent.kt +++ b/app/src/main/java/hu/bbara/purefin/app/home/HomeContent.kt @@ -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(), diff --git a/app/src/main/java/hu/bbara/purefin/app/home/HomeSections.kt b/app/src/main/java/hu/bbara/purefin/app/home/HomeSections.kt index 4c97628..9a6d244 100644 --- a/app/src/main/java/hu/bbara/purefin/app/home/HomeSections.kt +++ b/app/src/main/java/hu/bbara/purefin/app/home/HomeSections.kt @@ -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