feat: Implement avatar handling and display across chat and account screens

This commit is contained in:
2026-01-24 01:14:25 +05:00
parent 1367864008
commit 10c78e6231
7 changed files with 135 additions and 87 deletions

View File

@@ -16,11 +16,15 @@ 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.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.rosetta.messenger.database.RosettaDatabase
import com.rosetta.messenger.repository.AvatarRepository
import com.rosetta.messenger.ui.components.AvatarImage
import com.rosetta.messenger.ui.onboarding.PrimaryBlue
data class AccountInfo(
@@ -258,6 +262,12 @@ private fun AccountListItem(
val avatarColor = getAccountColor(account.name)
val context = LocalContext.current
val avatarRepository = remember(account.publicKey) {
val database = RosettaDatabase.getDatabase(context)
AvatarRepository(context, database.avatarDao(), account.publicKey)
}
var visible by remember { mutableStateOf(false) }
LaunchedEffect(Unit) {
@@ -288,20 +298,12 @@ private fun AccountListItem(
verticalAlignment = Alignment.CenterVertically
) {
// Avatar
Box(
modifier = Modifier
.size(48.dp)
.clip(CircleShape)
.background(avatarColor.copy(alpha = 0.2f)),
contentAlignment = Alignment.Center
) {
Text(
text = account.initials,
fontSize = 18.sp,
fontWeight = FontWeight.SemiBold,
color = avatarColor
)
}
AvatarImage(
publicKey = account.publicKey,
avatarRepository = avatarRepository,
size = 48.dp,
isDarkTheme = isDarkTheme
)
Spacer(modifier = Modifier.width(16.dp))

View File

@@ -41,8 +41,11 @@ import com.rosetta.messenger.crypto.CryptoManager
import com.rosetta.messenger.data.AccountManager
import com.rosetta.messenger.data.DecryptedAccount
import com.rosetta.messenger.data.EncryptedAccount
import com.rosetta.messenger.database.RosettaDatabase
import com.rosetta.messenger.network.ProtocolManager
import com.rosetta.messenger.network.ProtocolState
import com.rosetta.messenger.repository.AvatarRepository
import com.rosetta.messenger.ui.components.AvatarImage
import com.rosetta.messenger.ui.chats.getAvatarColor
import com.rosetta.messenger.ui.chats.getAvatarText
import com.rosetta.messenger.ui.chats.utils.getInitials
@@ -387,22 +390,16 @@ fun UnlockScreen(
) {
// Avatar
if (selectedAccount != null) {
val avatarColors =
getAvatarColor(selectedAccount!!.publicKey, isDarkTheme)
Box(
modifier =
Modifier.size(48.dp)
.clip(CircleShape)
.background(avatarColors.backgroundColor),
contentAlignment = Alignment.Center
) {
Text(
text = getInitials(selectedAccount!!.name),
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
color = avatarColors.textColor
)
val database = RosettaDatabase.getDatabase(context)
val avatarRepository = remember(selectedAccount!!.publicKey) {
AvatarRepository(context, database.avatarDao(), selectedAccount!!.publicKey)
}
AvatarImage(
publicKey = selectedAccount!!.publicKey,
avatarRepository = avatarRepository,
size = 48.dp,
isDarkTheme = isDarkTheme
)
}
Spacer(modifier = Modifier.width(12.dp))
@@ -572,25 +569,16 @@ fun UnlockScreen(
verticalAlignment = Alignment.CenterVertically
) {
// Avatar
val avatarColors =
getAvatarColor(account.publicKey, isDarkTheme)
Box(
modifier =
Modifier.size(40.dp)
.clip(CircleShape)
.background(
avatarColors
.backgroundColor
),
contentAlignment = Alignment.Center
) {
Text(
text = getInitials(account.name),
fontSize = 14.sp,
fontWeight = FontWeight.Bold,
color = avatarColors.textColor
)
val database = RosettaDatabase.getDatabase(context)
val avatarRepository = remember(account.publicKey) {
AvatarRepository(context, database.avatarDao(), account.publicKey)
}
AvatarImage(
publicKey = account.publicKey,
avatarRepository = avatarRepository,
size = 40.dp,
isDarkTheme = isDarkTheme
)
Spacer(modifier = Modifier.width(12.dp))