From 0679b18b8e5e8a408833918b75cf6cfff0f3dc6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Orzech?= Date: Fri, 20 Mar 2026 00:32:24 +0100 Subject: [PATCH] feat: show blog name and site icon in Feed top bar Replace account name with blog title from SiteMetadataCache in the Feed TopAppBar. Show site icon (24dp, circular) before the title. Truncate blog name to 20 characters with ellipsis. Falls back to account name or "Swoosh" if no cached site data exists. --- .../swoosh/microblog/ui/feed/FeedScreen.kt | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/swoosh/microblog/ui/feed/FeedScreen.kt b/app/src/main/java/com/swoosh/microblog/ui/feed/FeedScreen.kt index d46edb6..f7d58d2 100644 --- a/app/src/main/java/com/swoosh/microblog/ui/feed/FeedScreen.kt +++ b/app/src/main/java/com/swoosh/microblog/ui/feed/FeedScreen.kt @@ -81,6 +81,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import coil.compose.AsyncImage import com.swoosh.microblog.data.CredentialsManager import com.swoosh.microblog.data.ShareUtils +import com.swoosh.microblog.data.SiteMetadataCache import com.swoosh.microblog.data.model.FeedPost import com.swoosh.microblog.data.model.GhostAccount import com.swoosh.microblog.data.model.PostFilter @@ -113,6 +114,10 @@ fun FeedScreen( val context = LocalContext.current val snackbarHostState = remember { SnackbarHostState() } val baseUrl = remember { CredentialsManager(context).ghostUrl } + val siteMetadataCache = remember { SiteMetadataCache(context) } + val siteData = remember(activeAccount?.id) { + activeAccount?.let { siteMetadataCache.get(it.id) } + } // Track which post is pending delete confirmation var postPendingDelete by remember { mutableStateOf(null) } @@ -201,8 +206,19 @@ fun FeedScreen( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clickable { showAccountSwitcher = true } ) { - // Account color indicator - if (activeAccount != null) { + // Site icon or account avatar + val siteIconUrl = siteData?.icon ?: siteData?.logo + if (siteIconUrl != null) { + AsyncImage( + model = siteIconUrl, + contentDescription = "Site icon", + modifier = Modifier + .size(24.dp) + .clip(CircleShape), + contentScale = ContentScale.Crop + ) + Spacer(modifier = Modifier.width(8.dp)) + } else if (activeAccount != null) { AccountAvatar( account = activeAccount!!, size = 28 @@ -211,8 +227,12 @@ fun FeedScreen( } Column { + // Use blog name from site metadata, truncate to ~20 chars + val displayName = siteData?.title?.let { + if (it.length > 20) it.take(20) + "\u2026" else it + } ?: activeAccount?.name ?: "Swoosh" Text( - text = activeAccount?.name ?: "Swoosh", + text = displayName, style = MaterialTheme.typography.titleMedium, maxLines = 1, overflow = TextOverflow.Ellipsis