diff --git a/src/main/kotlin/app/images/ImagesCache.kt b/src/main/kotlin/app/images/ImagesCache.kt new file mode 100644 index 0000000..d8ef842 --- /dev/null +++ b/src/main/kotlin/app/images/ImagesCache.kt @@ -0,0 +1,6 @@ +package app.images + +interface ImagesCache { + fun getCachedObject(urlSource: String): ByteArray? + fun cacheImage(urlSource: String, image: ByteArray) +} \ No newline at end of file diff --git a/src/main/kotlin/app/images/InMemoryImagesCache.kt b/src/main/kotlin/app/images/InMemoryImagesCache.kt new file mode 100644 index 0000000..7369e3d --- /dev/null +++ b/src/main/kotlin/app/images/InMemoryImagesCache.kt @@ -0,0 +1,13 @@ +package app.images + +object InMemoryImagesCache : ImagesCache { + private val cachedImages = hashMapOf() + + override fun getCachedObject(urlSource: String): ByteArray? { + return cachedImages[urlSource] + } + + override fun cacheImage(urlSource: String, image: ByteArray) { + cachedImages[urlSource] = image + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/ui/CommitChanges.kt b/src/main/kotlin/app/ui/CommitChanges.kt index 7e84b44..3251e20 100644 --- a/src/main/kotlin/app/ui/CommitChanges.kt +++ b/src/main/kotlin/app/ui/CommitChanges.kt @@ -32,6 +32,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.graphics.toComposeImageBitmap import app.ui.components.ScrollableLazyColumn import app.git.GitManager +import app.images.ImagesCache +import app.images.InMemoryImagesCache import app.theme.headerText import org.eclipse.jgit.lib.PersonIdent import org.jetbrains.skia.Image.Companion.makeFromEncoded @@ -171,27 +173,33 @@ suspend fun loadImage(link: String): ByteArray = withContext(Dispatchers.IO) { } @Composable -fun rememberNetworkImage(url: String): ImageBitmap { +fun rememberNetworkImage(url: String, cache: ImagesCache = InMemoryImagesCache): ImageBitmap { + val cachedImage = cache.getCachedObject(url) + var image by remember(url) { - mutableStateOf( - useResource("image.jpg") { - makeFromEncoded(it.toByteArray()).toComposeImageBitmap() - } - ) + if(cachedImage != null) + mutableStateOf(makeFromEncoded(cachedImage).toComposeImageBitmap()) + else + mutableStateOf( + useResource("image.jpg") { + makeFromEncoded(it.toByteArray()).toComposeImageBitmap() + } + ) } - - LaunchedEffect(url) { - try { - loadImage(url).let { - image = makeFromEncoded(it).toComposeImageBitmap() + if(cachedImage == null) { + LaunchedEffect(url) { + try { + loadImage(url).let { + image = makeFromEncoded(it).toComposeImageBitmap() + cache.cacheImage(url, it) + } + } catch (ex: Exception) { + println("Avatar loading failed: ${ex.message}") } - } catch (ex: Exception) { - println("Avatar loading failed: ${ex.message}") } } - return image } diff --git a/src/main/kotlin/app/ui/Log.kt b/src/main/kotlin/app/ui/Log.kt index 3cc28db..96ed63c 100644 --- a/src/main/kotlin/app/ui/Log.kt +++ b/src/main/kotlin/app/ui/Log.kt @@ -1,4 +1,5 @@ @file:OptIn(ExperimentalComposeUiApi::class) +@file:Suppress("UNUSED_PARAMETER") package app.ui @@ -493,7 +494,7 @@ fun CommitNode( .border(2.dp, color, shape = CircleShape) .clip(CircleShape) ) { - val url = "https://www.gravatar.com/avatar/${plotCommit.authorIdent.emailAddress.md5}" + val url = "https://www.gravatar.com/avatar/${plotCommit.authorIdent.emailAddress.md5}?s=60" Image( bitmap = rememberNetworkImage(url), modifier = Modifier