From 5c518501ab282e4f72a1f2bb40d6f242a0082d54 Mon Sep 17 00:00:00 2001 From: maxmoney21m Date: Mon, 13 Mar 2023 11:24:11 +0800 Subject: [PATCH] Edit background shape, use painter placeholder/fallback Use logo-shaped background Use painter as placeholder and fallback --- .../amethyst/ui/components/Robohash.kt | 37 +++++-------- .../ui/components/RobohashAsyncImage.kt | 55 ++++++------------- 2 files changed, 31 insertions(+), 61 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 e3f9a2f97..28def6986 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 @@ -15,9 +15,9 @@ private fun toHex(color: Color): String { private val sha256: MessageDigest = MessageDigest.getInstance("SHA-256") -private fun byteMod(byte: Byte, modulo: Int): Int { +private fun byteMod10(byte: Byte): Int { val ub = byte.toUByte().toInt() - return ub % modulo + return ub % 10 } private fun bytesToRGB(b1: Byte, b2: Byte, b3: Byte): Color { @@ -27,16 +27,13 @@ private fun bytesToRGB(b1: Byte, b2: Byte, b3: Byte): Color { private fun svgString(msg: String): String { val hash = sha256.digest(msg.toByteArray()) val hashHex = hash.joinToString(separator = "") { b -> "%02x".format(b) } - val bgColor1 = bytesToRGB(hash[0], hash[1], hash[2]) - val bgColor2 = bytesToRGB(hash[3], hash[4], hash[5]) - val fgColor = bytesToRGB(hash[6], hash[7], hash[8]) - val bgIndex = byteMod(hash[9], 8) - val bodyIndex = byteMod(hash[10], 10) - val faceIndex = byteMod(hash[11], 10) - val eyesIndex = byteMod(hash[12], 10) - val mouthIndex = byteMod(hash[13], 10) - val accIndex = byteMod(hash[14], 10) - val background = backgrounds[bgIndex] + val bgColor = bytesToRGB(hash[0], hash[1], hash[2]) + val fgColor = bytesToRGB(hash[3], hash[4], hash[5]) + val bodyIndex = byteMod10(hash[6]) + val faceIndex = byteMod10(hash[7]) + val eyesIndex = byteMod10(hash[8]) + val mouthIndex = byteMod10(hash[9]) + val accIndex = byteMod10(hash[10]) val body = bodies[bodyIndex] val face = faces[faceIndex] val eye = eyes[eyesIndex] @@ -47,11 +44,11 @@ private fun svgString(msg: String): String { - RoboHash $hashHex + Robohash $hashHex ${background}${body.paths}${face.paths}${eye.paths}${mouth.paths}${accessory.paths} """.trimIndent() @@ -66,22 +63,14 @@ object Robohash { svgString(message).toByteArray() ) ) + .crossfade(100) .build() } } private data class Part(val style: String, val paths: String) -private val backgrounds: List = listOf( - """""", - """""", - """""", - """""", - """""", - """""", - """""", - """""" -) +private const val background = """""" private val accessories: List = listOf( Part( 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 7523dff6e..73b500ccf 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 @@ -1,11 +1,6 @@ package com.vitorpamplona.amethyst.ui.components -import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter @@ -16,6 +11,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import coil.compose.AsyncImage import coil.compose.AsyncImagePainter +import coil.compose.rememberAsyncImagePainter @Composable fun RobohashAsyncImage( @@ -46,8 +42,8 @@ fun RobohashAsyncImage( @Composable fun RobohashFallbackAsyncImage( - robot: String = "aaaa", - model: Any?, + robot: String, + model: String?, contentDescription: String?, modifier: Modifier = Modifier, alignment: Alignment = Alignment.Center, @@ -56,37 +52,22 @@ fun RobohashFallbackAsyncImage( colorFilter: ColorFilter? = null, filterQuality: FilterQuality = DrawScope.DefaultFilterQuality ) { - var loading by remember { mutableStateOf(false) } - var error by remember { mutableStateOf(false) } + val context = LocalContext.current + val painter = rememberAsyncImagePainter(model = Robohash.imageRequest(context, robot)) - Box { - AsyncImage( - model = model, - contentDescription = contentDescription, - modifier = modifier, - onLoading = { loading = true }, - onSuccess = { loading = false; error = false }, - onError = { error = true }, - alignment = alignment, - contentScale = contentScale, - alpha = alpha, - colorFilter = colorFilter, - filterQuality = filterQuality - ) - - if (loading || error) { - RobohashAsyncImage( - robot = robot, - contentDescription = contentDescription, - modifier = modifier, - alignment = alignment, - contentScale = contentScale, - alpha = alpha, - colorFilter = colorFilter, - filterQuality = filterQuality - ) - } - } + AsyncImage( + model = model, + contentDescription = contentDescription, + modifier = modifier, + placeholder = painter, + fallback = painter, + error = painter, + alignment = alignment, + contentScale = contentScale, + alpha = alpha, + colorFilter = colorFilter, + filterQuality = filterQuality + ) } @Composable