Added avatar caching
This commit is contained in:
parent
a948e2da06
commit
b518c5007e
6
src/main/kotlin/app/images/ImagesCache.kt
Normal file
6
src/main/kotlin/app/images/ImagesCache.kt
Normal file
@ -0,0 +1,6 @@
|
||||
package app.images
|
||||
|
||||
interface ImagesCache {
|
||||
fun getCachedObject(urlSource: String): ByteArray?
|
||||
fun cacheImage(urlSource: String, image: ByteArray)
|
||||
}
|
13
src/main/kotlin/app/images/InMemoryImagesCache.kt
Normal file
13
src/main/kotlin/app/images/InMemoryImagesCache.kt
Normal file
@ -0,0 +1,13 @@
|
||||
package app.images
|
||||
|
||||
object InMemoryImagesCache : ImagesCache {
|
||||
private val cachedImages = hashMapOf<String, ByteArray>()
|
||||
|
||||
override fun getCachedObject(urlSource: String): ByteArray? {
|
||||
return cachedImages[urlSource]
|
||||
}
|
||||
|
||||
override fun cacheImage(urlSource: String, image: ByteArray) {
|
||||
cachedImages[urlSource] = image
|
||||
}
|
||||
}
|
@ -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<ImageBitmap>(
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user