diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt index 798b8a854e1f3f726788cdf94414f39e830f2c81..9cca0a10c5ee128963f2529a6a45cae66fd27285 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/navigation/MeteroidTopBar.kt @@ -25,12 +25,12 @@ package de.chaosdorf.meteroid.ui.navigation import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar @@ -38,9 +38,12 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage import de.chaosdorf.meteroid.model.Server import de.chaosdorf.meteroid.model.User @@ -58,9 +61,16 @@ fun MeteroidTopBar( ) }, navigationIcon = { - IconButton(onClick = { onNavigate(Routes.Users.Root) }) { - Icon(Icons.AutoMirrored.Default.ArrowBack, contentDescription = "Back") - } + AsyncImage( + account?.second?.gravatarUrl(), + contentDescription = "User List", + contentScale = ContentScale.Crop, + modifier = Modifier + .size(48.dp) + .clip(CircleShape) + .border(1.dp, Color.White, CircleShape) + .background(MaterialTheme.colorScheme.primaryContainer) + ) }, actions = { account?.second?.let { user -> @@ -84,6 +94,8 @@ fun MeteroidTopBar( ) } }, - modifier = Modifier.shadow(4.dp) + modifier = Modifier + .shadow(4.dp) + .clickable { onNavigate(Routes.Users.Root) } ) } diff --git a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt index 92cbdad4aea35a18fd0b5292e6b3430b5031767f..25eb6f7ff0da2e3e034543c465074bd653f972fe 100644 --- a/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt +++ b/app/src/main/kotlin/de/chaosdorf/meteroid/ui/users/UserListScreen.kt @@ -24,17 +24,18 @@ package de.chaosdorf.meteroid.ui.users +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.ListItem +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar @@ -42,8 +43,12 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage import de.chaosdorf.mete.UserId import de.chaosdorf.meteroid.sync.SyncHandler @@ -68,11 +73,20 @@ fun UserListScreen( ) }, navigationIcon = { - IconButton(onClick = { onBack() }) { - Icon(Icons.AutoMirrored.Default.ArrowBack, contentDescription = "Back") - } + AsyncImage( + server?.first?.logoUrl, + contentDescription = "User List", + contentScale = ContentScale.Crop, + modifier = Modifier + .size(48.dp) + .clip(CircleShape) + .border(1.dp, Color.White, CircleShape) + .background(MaterialTheme.colorScheme.primaryContainer) + ) }, - modifier = Modifier.shadow(4.dp) + modifier = Modifier + .shadow(4.dp) + .clickable { onBack() } ) } ) { paddingValues -> diff --git a/persistence/src/main/kotlin/de/chaosdorf/meteroid/model/User.kt b/persistence/src/main/kotlin/de/chaosdorf/meteroid/model/User.kt index 5e1b16671c9786bb004e5e23e308c457ceea8f92..40d52aeec9d3096a47b95eab34a97349e02ae123 100644 --- a/persistence/src/main/kotlin/de/chaosdorf/meteroid/model/User.kt +++ b/persistence/src/main/kotlin/de/chaosdorf/meteroid/model/User.kt @@ -34,6 +34,8 @@ import de.chaosdorf.mete.UserId import de.chaosdorf.mete.v1.UserModelV1 import kotlinx.coroutines.flow.Flow import kotlinx.datetime.Instant +import java.security.MessageDigest +import java.util.Locale @Entity( primaryKeys = ["serverId", "userId"], @@ -67,6 +69,15 @@ data class User( value.updatedAt ) } + + @OptIn(ExperimentalStdlibApi::class) + fun gravatarUrl(): String { + val normalised: String = email.lowercase(Locale.ROOT) + val binaryData: ByteArray = normalised.toByteArray(Charsets.UTF_8) + val binaryHash: ByteArray = MessageDigest.getInstance("MD5").digest(binaryData) + val hash: String = binaryHash.toHexString() + return "https://www.gravatar.com/avatar/$hash?d=404" + } } @Dao