diff --git a/src/main/kotlin/app/images/NetworkImageLoader.kt b/src/main/kotlin/app/images/NetworkImageLoader.kt index f8360c6..f5e8cf0 100644 --- a/src/main/kotlin/app/images/NetworkImageLoader.kt +++ b/src/main/kotlin/app/images/NetworkImageLoader.kt @@ -49,16 +49,18 @@ object NetworkImageLoader { } } - @Composable -fun rememberNetworkImage(url: String): ImageBitmap { +fun rememberNetworkImageOrNull(url: String, placeHolderImageRes: String? = null): ImageBitmap? { val networkImageLoader = NetworkImageLoader var image by remember(url) { - mutableStateOf( - useResource("image.jpg") { + val placeHolderImage = if(placeHolderImageRes != null) + useResource(placeHolderImageRes) { Image.makeFromEncoded(it.toByteArray()).toComposeImageBitmap() } - ) + else + null + + mutableStateOf(placeHolderImage) } LaunchedEffect(url) { @@ -71,4 +73,3 @@ fun rememberNetworkImage(url: String): ImageBitmap { } fun ByteArray.toComposeImage() = Image.makeFromEncoded(this).toComposeImageBitmap() - diff --git a/src/main/kotlin/app/ui/CommitChanges.kt b/src/main/kotlin/app/ui/CommitChanges.kt index b341982..76144a9 100644 --- a/src/main/kotlin/app/ui/CommitChanges.kt +++ b/src/main/kotlin/app/ui/CommitChanges.kt @@ -20,11 +20,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import app.extensions.* import app.git.GitManager -import app.images.rememberNetworkImage import app.theme.headerBackground import app.theme.headerText import app.theme.primaryTextColor import app.theme.secondaryTextColor +import app.ui.components.AvatarImage import app.ui.components.ScrollableLazyColumn import app.ui.components.TooltipText import org.eclipse.jgit.diff.DiffEntry @@ -108,14 +108,11 @@ fun Author(commit: RevCommit) { .background(MaterialTheme.colors.background), verticalAlignment = Alignment.CenterVertically ) { - val url = "https://www.gravatar.com/avatar/${authorIdent.emailAddress.md5}" - Image( - bitmap = rememberNetworkImage(url), + AvatarImage( modifier = Modifier .padding(horizontal = 16.dp) - .height(40.dp) - .clip(CircleShape), - contentDescription = null, + .size(40.dp), + personIdent = commit.authorIdent, ) Column( diff --git a/src/main/kotlin/app/ui/components/AvatarImage.kt b/src/main/kotlin/app/ui/components/AvatarImage.kt new file mode 100644 index 0000000..8425483 --- /dev/null +++ b/src/main/kotlin/app/ui/components/AvatarImage.kt @@ -0,0 +1,62 @@ +package app.ui.components + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap +import app.extensions.md5 +import app.images.rememberNetworkImageOrNull +import org.eclipse.jgit.lib.PersonIdent + +@Composable +fun AvatarImage( + modifier: Modifier = Modifier, + personIdent: PersonIdent, + color: Color = MaterialTheme.colors.primary +) { + Box( + modifier = modifier + .clip(CircleShape) + ) { + val avatar = rememberAvatar(personIdent.emailAddress) + if(avatar == null) { + Box( + modifier = Modifier + .fillMaxSize() + .background(color), + contentAlignment = Alignment.Center, + ) { + Text( + text = personIdent.name.firstOrNull()?.uppercase() ?: "#", + color = Color.White, + ) + } + } else { + Image( + bitmap = avatar, + modifier = Modifier + .fillMaxSize(), + contentDescription = null, + ) + } + } +} + + +@Composable +fun rememberAvatar(email: String): ImageBitmap? { + val url = "https://www.gravatar.com/avatar/${email.md5}?s=60&d=404" + return rememberNetworkImageOrNull( + url = url, + placeHolderImageRes = null, + ) +} \ No newline at end of file diff --git a/src/main/kotlin/app/ui/log/Log.kt b/src/main/kotlin/app/ui/log/Log.kt index 1c34412..b410251 100644 --- a/src/main/kotlin/app/ui/log/Log.kt +++ b/src/main/kotlin/app/ui/log/Log.kt @@ -37,9 +37,9 @@ import app.extensions.* import app.git.GitManager import app.git.LogStatus import app.git.graph.GraphNode -import app.images.rememberNetworkImage import app.theme.* import app.ui.SelectedItem +import app.ui.components.AvatarImage import app.ui.components.ScrollableLazyColumn import app.ui.context_menu.branchContextMenuItems import app.ui.context_menu.tagContextMenuItems @@ -592,12 +592,10 @@ fun CommitNode( .border(2.dp, color, shape = CircleShape) .clip(CircleShape) ) { - val url = "https://www.gravatar.com/avatar/${plotCommit.authorIdent.emailAddress.md5}?s=60" - Image( - bitmap = rememberNetworkImage(url), - modifier = Modifier - .fillMaxSize(), - contentDescription = null + AvatarImage( + modifier = Modifier.fillMaxSize(), + personIdent = plotCommit.authorIdent, + color = color, ) } } diff --git a/src/main/resources/image.jpg b/src/main/resources/image.jpg deleted file mode 100644 index 514f3f2..0000000 Binary files a/src/main/resources/image.jpg and /dev/null differ