Show member labels in quotes.

This commit is contained in:
jeffrey-signal
2026-02-11 15:52:38 -05:00
committed by Michelle Tang
parent e384a37fab
commit cb05608422
16 changed files with 279 additions and 95 deletions

View File

@@ -25,6 +25,9 @@ import androidx.compose.ui.unit.dp
import org.signal.core.ui.compose.DayNightPreviews
import org.signal.core.ui.compose.Previews
private val defaultModifier = Modifier.padding(horizontal = 12.dp, vertical = 2.dp)
private val defaultTextStyle: @Composable () -> TextStyle = { MaterialTheme.typography.bodyLarge }
/**
* Displays member label text with an optional emoji.
*/
@@ -33,8 +36,8 @@ fun MemberLabelPill(
emoji: String?,
text: String,
tintColor: Color,
modifier: Modifier = Modifier.padding(horizontal = 12.dp, vertical = 2.dp),
textStyle: TextStyle = MaterialTheme.typography.bodyLarge
modifier: Modifier = defaultModifier,
textStyle: TextStyle = defaultTextStyle()
) {
val isDark = isSystemInDarkTheme()
val backgroundColor = tintColor.copy(alpha = if (isDark) 0.32f else 0.10f)
@@ -45,6 +48,28 @@ fun MemberLabelPill(
Color.Black.copy(alpha = 0.30f).compositeOver(tintColor)
}
MemberLabelPill(
emoji = emoji,
text = text,
textColor = textColor,
backgroundColor = backgroundColor,
modifier = modifier,
textStyle = textStyle
)
}
/**
* Displays member label text with an optional emoji.
*/
@Composable
fun MemberLabelPill(
emoji: String?,
text: String,
textColor: Color,
backgroundColor: Color,
modifier: Modifier = defaultModifier,
textStyle: TextStyle = defaultTextStyle()
) {
Row(
modifier = Modifier
.background(

View File

@@ -17,22 +17,83 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import org.signal.core.ui.compose.DayNightPreviews
import org.signal.core.ui.compose.Previews
private val defaultLabelModifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp)
private val defaultLabelTextStyle: @Composable () -> TextStyle = { MaterialTheme.typography.bodySmall }
/**
* Displays a sender name with an optional member label pill.
* Displays a sender name with an optional member label pill with label colors derived from [senderColor].
*/
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun SenderNameWithLabel(
senderName: String,
senderColor: Color,
label: MemberLabel?,
memberLabel: MemberLabel?,
modifier: Modifier = Modifier
) {
SenderNameWithLabel(
senderName = senderName,
senderColor = senderColor,
memberLabel = memberLabel,
modifier = modifier,
labelSlot = { label ->
MemberLabelPill(
emoji = label.emoji,
text = label.text,
tintColor = senderColor,
modifier = defaultLabelModifier,
textStyle = defaultLabelTextStyle()
)
}
)
}
/**
* Displays a sender name with an optional member label pill with explicit label colors.
*/
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun SenderNameWithLabel(
senderName: String,
senderColor: Color,
memberLabel: MemberLabel?,
labelTextColor: Color,
labelBackgroundColor: Color,
modifier: Modifier = Modifier
) {
SenderNameWithLabel(
senderName = senderName,
senderColor = senderColor,
memberLabel = memberLabel,
modifier = modifier,
labelSlot = { label ->
MemberLabelPill(
emoji = label.emoji,
text = label.text,
textColor = labelTextColor,
backgroundColor = labelBackgroundColor,
modifier = defaultLabelModifier,
textStyle = defaultLabelTextStyle()
)
}
)
}
@OptIn(ExperimentalLayoutApi::class)
@Composable
private fun SenderNameWithLabel(
senderName: String,
senderColor: Color,
memberLabel: MemberLabel?,
modifier: Modifier = Modifier,
labelSlot: @Composable (MemberLabel) -> Unit
) {
FlowRow(
modifier = modifier,
@@ -49,14 +110,8 @@ fun SenderNameWithLabel(
overflow = TextOverflow.Ellipsis
)
if (label != null) {
MemberLabelPill(
emoji = label.emoji,
text = label.text,
tintColor = senderColor,
textStyle = MaterialTheme.typography.labelSmall,
modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp)
)
if (memberLabel != null) {
labelSlot(memberLabel)
}
}
}
@@ -68,7 +123,7 @@ private fun SenderNameWithLabelPreview() = Previews.Preview {
SenderNameWithLabel(
senderName = "Foo Bar",
senderColor = Color(0xFF7C4DFF),
label = MemberLabel(emoji = "\uD83D\uDC36", text = "Vet Coordinator")
memberLabel = MemberLabel(emoji = "\uD83D\uDC36", text = "Vet Coordinator")
)
}
}
@@ -80,7 +135,7 @@ private fun SenderNameWithLabelLongLabelPreview() = Previews.Preview {
SenderNameWithLabel(
senderName = "Foo Bar",
senderColor = Color(0xFF7C4DFF),
label = MemberLabel(emoji = "🧠", text = "Zero-Knowledge Know-It-All")
memberLabel = MemberLabel(emoji = "🧠", text = "Zero-Knowledge Know-It-It-All")
)
}
}
@@ -92,7 +147,7 @@ private fun SenderNameWithLabelLongNamePreview() = Previews.Preview {
SenderNameWithLabel(
senderName = "Cassandra NullPointer-Exception",
senderColor = Color(0xFF7C4DFF),
label = MemberLabel(emoji = "🧠", text = "Vet Coordinator")
memberLabel = MemberLabel(emoji = "🧠", text = "Vet Coordinator")
)
}
}
@@ -104,7 +159,21 @@ private fun SenderNameWithLabelNoLabelPreview() = Previews.Preview {
SenderNameWithLabel(
senderName = "Sam",
senderColor = Color(0xFF4CAF50),
label = null
memberLabel = null
)
}
}
@DayNightPreviews
@Composable
private fun SenderNameWithLabelExplicitColorsPreview() = Previews.Preview {
Box(modifier = Modifier.width(200.dp)) {
SenderNameWithLabel(
senderName = "Foo Bar",
senderColor = MaterialTheme.colorScheme.onSurface,
memberLabel = MemberLabel(emoji = "\uD83D\uDC36", text = "Vet Coordinator"),
labelTextColor = MaterialTheme.colorScheme.onSurface,
labelBackgroundColor = MaterialTheme.colorScheme.surfaceVariant
)
}
}