From 00e54706424897f75aaccc8c43fc20cbb836aa94 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 20 Apr 2023 10:07:03 -0400 Subject: [PATCH] Passing the size of the robohash rendering to the request in the hopes to improve performance. --- .../amethyst/ui/components/Robohash.kt | 7 ++- .../ui/components/RobohashAsyncImage.kt | 47 ++++++++++++++----- .../ui/note/ChatroomMessageCompose.kt | 1 + .../amethyst/ui/note/NoteCompose.kt | 2 + .../ui/screen/loggedIn/ProfileScreen.kt | 2 + 5 files changed, 44 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt index 556c3a134..dedb0cdd4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/Robohash.kt @@ -11,6 +11,7 @@ import coil.fetch.Fetcher import coil.fetch.SourceResult import coil.request.ImageRequest import coil.request.Options +import coil.size.Size import okio.Buffer import java.security.MessageDigest @@ -61,6 +62,7 @@ private fun svgString(msg: String): String { class HashImageFetcher( private val context: Context, + private val size: Size, private val data: Uri ) : Fetcher { @@ -79,16 +81,17 @@ class HashImageFetcher( object Factory : Fetcher.Factory { override fun create(data: Uri, options: Options, imageLoader: ImageLoader): Fetcher { - return HashImageFetcher(options.context, data) + return HashImageFetcher(options.context, options.size, data) } } } object Robohash { - fun imageRequest(context: Context, message: String): ImageRequest { + fun imageRequest(context: Context, message: String, robotSize: Size): ImageRequest { return ImageRequest .Builder(context) .data("robohash:$message") .fetcherFactory(HashImageFetcher.Factory) + .size(robotSize) .crossfade(100) .build() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt index 73b500ccf..845037266 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RobohashAsyncImage.kt @@ -9,13 +9,17 @@ import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp import coil.compose.AsyncImage import coil.compose.AsyncImagePainter import coil.compose.rememberAsyncImagePainter +import coil.size.Size @Composable fun RobohashAsyncImage( robot: String, + robotSize: Dp, modifier: Modifier = Modifier, contentDescription: String? = null, transform: (AsyncImagePainter.State) -> AsyncImagePainter.State = AsyncImagePainter.DefaultTransform, @@ -26,23 +30,30 @@ fun RobohashAsyncImage( colorFilter: ColorFilter? = null, filterQuality: FilterQuality = DrawScope.DefaultFilterQuality ) { - AsyncImage( - model = Robohash.imageRequest(LocalContext.current, robot), - contentDescription = contentDescription, - modifier = modifier, - transform = transform, - onState = onState, - alignment = alignment, - contentScale = contentScale, - alpha = alpha, - colorFilter = colorFilter, - filterQuality = filterQuality - ) + with(LocalDensity.current) { + AsyncImage( + model = Robohash.imageRequest( + LocalContext.current, + robot, + Size(robotSize.roundToPx(), robotSize.roundToPx()) + ), + contentDescription = contentDescription, + modifier = modifier, + transform = transform, + onState = onState, + alignment = alignment, + contentScale = contentScale, + alpha = alpha, + colorFilter = colorFilter, + filterQuality = filterQuality + ) + } } @Composable fun RobohashFallbackAsyncImage( robot: String, + robotSize: Dp, model: String?, contentDescription: String?, modifier: Modifier = Modifier, @@ -53,7 +64,15 @@ fun RobohashFallbackAsyncImage( filterQuality: FilterQuality = DrawScope.DefaultFilterQuality ) { val context = LocalContext.current - val painter = rememberAsyncImagePainter(model = Robohash.imageRequest(context, robot)) + val painter = with(LocalDensity.current) { + rememberAsyncImagePainter( + model = Robohash.imageRequest( + context, + robot, + Size(robotSize.roundToPx(), robotSize.roundToPx()) + ) + ) + } AsyncImage( model = model, @@ -85,6 +104,7 @@ fun RobohashAsyncImageProxy( if (model.url == null) { RobohashAsyncImage( robot = robot, + robotSize = model.size, contentDescription = contentDescription, modifier = modifier, alignment = alignment, @@ -96,6 +116,7 @@ fun RobohashAsyncImageProxy( } else { RobohashFallbackAsyncImage( robot = robot, + robotSize = model.size, model = model.proxyUrl(), contentDescription = contentDescription, modifier = modifier, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt index bee998015..1294cf883 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt @@ -373,6 +373,7 @@ private fun RelayBadges(baseNote: Note) { ) { RobohashFallbackAsyncImage( robot = "https://$url/favicon.ico", + robotSize = 15.dp, model = "https://$url/favicon.ico", contentDescription = stringResource(id = R.string.relay_icon), colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }), diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 8400d174b..34c97bd9b 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -898,6 +898,7 @@ private fun RelayBadges(baseNote: Note) { ) { RobohashFallbackAsyncImage( robot = "https://$url/favicon.ico", + robotSize = 15.dp, model = "https://$url/favicon.ico", contentDescription = stringResource(R.string.relay_icon), colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }), @@ -970,6 +971,7 @@ fun NoteAuthorPicture( if (author == null) { RobohashAsyncImage( robot = "authornotfound", + robotSize = size, contentDescription = stringResource(R.string.unknown_author), modifier = modifier .width(size) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 6c832ceac..2b69981de 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -655,6 +655,7 @@ fun BadgeThumb( if (image == null) { RobohashAsyncImage( robot = "authornotfound", + robotSize = size, contentDescription = stringResource(R.string.unknown_author), modifier = pictureModifier .width(size) @@ -664,6 +665,7 @@ fun BadgeThumb( } else { RobohashFallbackAsyncImage( robot = note.idHex, + robotSize = size, model = image, contentDescription = stringResource(id = R.string.profile_image), modifier = pictureModifier