mirror of
https://github.com/bbara04/Purefin.git
synced 2026-04-01 01:30:08 +02:00
Refactor image loading configuration and improve item key handling in lists
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package hu.bbara.purefin
|
package hu.bbara.purefin
|
||||||
|
|
||||||
|
import android.content.pm.ApplicationInfo
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
@@ -8,7 +9,7 @@ import androidx.compose.runtime.collectAsState
|
|||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import coil3.ImageLoader
|
import coil3.ImageLoader
|
||||||
import coil3.compose.setSingletonImageLoaderFactory
|
import coil3.SingletonImageLoader
|
||||||
import coil3.disk.DiskCache
|
import coil3.disk.DiskCache
|
||||||
import coil3.memory.MemoryCache
|
import coil3.memory.MemoryCache
|
||||||
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
|
import coil3.network.okhttp.OkHttpNetworkFetcherFactory
|
||||||
@@ -38,41 +39,20 @@ class PurefinActivity : ComponentActivity() {
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var authInterceptor: JellyfinAuthInterceptor
|
lateinit var authInterceptor: JellyfinAuthInterceptor
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
private val imageOkHttpClient: OkHttpClient by lazy {
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
|
|
||||||
lifecycleScope.launch { init() }
|
|
||||||
enableEdgeToEdge()
|
|
||||||
setContent {
|
|
||||||
PurefinTheme {
|
|
||||||
setSingletonImageLoaderFactory { context ->
|
|
||||||
ImageLoader.Builder(context)
|
|
||||||
.components {
|
|
||||||
add(
|
|
||||||
OkHttpNetworkFetcherFactory(
|
|
||||||
callFactory = {
|
|
||||||
OkHttpClient.Builder()
|
OkHttpClient.Builder()
|
||||||
.addNetworkInterceptor(authInterceptor)
|
.addNetworkInterceptor(authInterceptor)
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
)
|
|
||||||
)
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
}
|
super.onCreate(savedInstanceState)
|
||||||
.memoryCache {
|
|
||||||
MemoryCache.Builder()
|
lifecycleScope.launch { init() }
|
||||||
.maxSizePercent(context, 0.10)
|
configureImageLoader()
|
||||||
.build()
|
enableEdgeToEdge()
|
||||||
}
|
setContent {
|
||||||
.diskCache {
|
PurefinTheme {
|
||||||
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)
|
val isLoggedIn by userSessionRepository.isLoggedIn.collectAsState(initial = false)
|
||||||
if (isLoggedIn) {
|
if (isLoggedIn) {
|
||||||
HomePage()
|
HomePage()
|
||||||
@@ -86,4 +66,39 @@ class PurefinActivity : ComponentActivity() {
|
|||||||
private suspend fun init() {
|
private suspend fun init() {
|
||||||
jellyfinApiClient.updateApiClient()
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,10 @@ fun HomeContent(
|
|||||||
colors = colors
|
colors = colors
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
items(libraries) { item ->
|
items(
|
||||||
|
items = libraries,
|
||||||
|
key = { it.id }
|
||||||
|
) { item ->
|
||||||
LibraryPosterSection(
|
LibraryPosterSection(
|
||||||
title = item.name,
|
title = item.name,
|
||||||
items = libraryContent[item.id] ?: emptyList(),
|
items = libraryContent[item.id] ?: emptyList(),
|
||||||
|
|||||||
@@ -50,7 +50,10 @@ fun ContinueWatchingSection(
|
|||||||
contentPadding = PaddingValues(horizontal = 16.dp),
|
contentPadding = PaddingValues(horizontal = 16.dp),
|
||||||
horizontalArrangement = Arrangement.spacedBy(16.dp)
|
horizontalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
) {
|
) {
|
||||||
items(items) { item ->
|
items(
|
||||||
|
items = items,
|
||||||
|
key = { it.id }
|
||||||
|
) { item ->
|
||||||
ContinueWatchingCard(
|
ContinueWatchingCard(
|
||||||
item = item,
|
item = item,
|
||||||
colors = colors
|
colors = colors
|
||||||
@@ -145,7 +148,10 @@ fun LibraryPosterSection(
|
|||||||
contentPadding = PaddingValues(horizontal = 16.dp),
|
contentPadding = PaddingValues(horizontal = 16.dp),
|
||||||
horizontalArrangement = Arrangement.spacedBy(16.dp)
|
horizontalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
) {
|
) {
|
||||||
items(items) { item ->
|
items(
|
||||||
|
items = items,
|
||||||
|
key = { it.id }
|
||||||
|
) { item ->
|
||||||
PosterCard(
|
PosterCard(
|
||||||
item = item,
|
item = item,
|
||||||
colors = colors
|
colors = colors
|
||||||
|
|||||||
Reference in New Issue
Block a user