Loading feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatarPreview.kt +26 −0 Original line number Diff line number Diff line Loading @@ -15,3 +15,29 @@ internal fun AccountAvatarPreview() { ) } } @Composable @Preview(showBackground = true) internal fun AccountAvatarWithUnreadCountPreview() { PreviewWithThemes { AccountAvatar( account = DISPLAY_ACCOUNT.copy( unreadMessageCount = 12, ), onClick = {}, ) } } @Composable @Preview(showBackground = true) internal fun AccountAvatarWithUnreadCountMaxedPreview() { PreviewWithThemes { AccountAvatar( account = DISPLAY_ACCOUNT.copy( unreadMessageCount = 100, ), onClick = {}, ) } } feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatar.kt +56 −14 Original line number Diff line number Diff line Loading @@ -9,11 +9,14 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.designsystem.atom.Surface import app.k9mail.core.ui.compose.designsystem.atom.text.TextLabelSmall import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount import app.k9mail.feature.navigation.drawer.ui.common.labelForCount @Composable internal fun AccountAvatar( Loading @@ -22,20 +25,25 @@ internal fun AccountAvatar( modifier: Modifier = Modifier, ) { val accountColor = calculateAccountColor(account.account.chipColor) val accountColorRoles = ColorRoles.from(accountColor) Box( modifier = modifier, contentAlignment = Alignment.BottomEnd, ) { Surface( modifier = modifier modifier = Modifier .size(MainTheme.sizes.iconAvatar) .border(2.dp, accountColor, CircleShape) .padding(2.dp), .padding(2.dp) .clickable(onClick = { onClick(account) }), color = accountColor.copy(alpha = 0.3f), shape = CircleShape, ) { Box( contentAlignment = Alignment.Center, modifier = Modifier .border(2.dp, MainTheme.colors.surfaceContainerLowest, CircleShape) .clickable(onClick = { onClick(account) }), .border(2.dp, MainTheme.colors.surfaceContainerLowest, CircleShape), ) { Placeholder( email = account.account.email, Loading @@ -43,6 +51,11 @@ internal fun AccountAvatar( // TODO: Add image loading } } UnreadBadge( unreadCount = account.unreadMessageCount, accountColorRoles = accountColorRoles, ) } } @Composable Loading @@ -56,6 +69,35 @@ private fun Placeholder( ) } @Composable private fun UnreadBadge( unreadCount: Int, accountColorRoles: ColorRoles, modifier: Modifier = Modifier, ) { if (unreadCount > 0) { val resources = LocalContext.current.resources Surface( color = accountColorRoles.accent, shape = CircleShape, modifier = modifier, ) { TextLabelSmall( text = labelForCount( count = unreadCount, resources = resources, ), color = accountColorRoles.onAccent, modifier = Modifier.padding( horizontal = 3.dp, vertical = 2.dp, ), ) } } } private fun extractDomainInitials(email: String): String { return email.split("@")[1].take(2) } feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/CalculateAccountColor.kt +24 −0 Original line number Diff line number Diff line Loading @@ -2,8 +2,11 @@ package app.k9mail.feature.navigation.drawer.ui.account import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.core.ui.compose.theme2.toHarmonizedColor import com.google.android.material.color.MaterialColors @Composable internal fun calculateAccountColor(accountColor: Int): Color { Loading @@ -13,3 +16,24 @@ internal fun calculateAccountColor(accountColor: Int): Color { Color(accountColor).toHarmonizedColor(MainTheme.colors.surface) } } data class ColorRoles( val accent: Color, val onAccent: Color, val accentContainer: Color, val onAccentContainer: Color, ) { companion object { @Composable fun from(color: Color): ColorRoles { val context = LocalContext.current val colorRoles = MaterialColors.getColorRoles(context, color.toArgb()) return ColorRoles( accent = Color(colorRoles.accent), onAccent = Color(colorRoles.onAccent), accentContainer = Color(colorRoles.accentContainer), onAccentContainer = Color(colorRoles.onAccentContainer), ) } } } feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/common/LabelForCount.kt 0 → 100644 +22 −0 Original line number Diff line number Diff line package app.k9mail.feature.navigation.drawer.ui.common import android.content.res.Resources import app.k9mail.feature.navigation.drawer.R @Suppress("MagicNumber") internal fun labelForCount( count: Int, resources: Resources, ) = when { count in 1..99 -> "$count" count in 100..1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_99, ) count > 1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_1_000, ) else -> "" } feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItemBadge.kt +1 −20 Original line number Diff line number Diff line package app.k9mail.feature.navigation.drawer.ui.folder import android.content.res.Resources import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.runtime.Composable Loading @@ -10,7 +9,7 @@ import androidx.compose.ui.platform.LocalContext import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerItemBadge import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.feature.navigation.drawer.R import app.k9mail.feature.navigation.drawer.ui.common.labelForCount @Composable internal fun FolderListItemBadge( Loading Loading @@ -87,21 +86,3 @@ private fun FolderCountAndStarredBadge( } } } @Suppress("MagicNumber") private fun labelForCount( count: Int, resources: Resources, ) = when { count in 1..99 -> "$count" count in 100..1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_99, ) count > 1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_1_000, ) else -> "" } Loading
feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatarPreview.kt +26 −0 Original line number Diff line number Diff line Loading @@ -15,3 +15,29 @@ internal fun AccountAvatarPreview() { ) } } @Composable @Preview(showBackground = true) internal fun AccountAvatarWithUnreadCountPreview() { PreviewWithThemes { AccountAvatar( account = DISPLAY_ACCOUNT.copy( unreadMessageCount = 12, ), onClick = {}, ) } } @Composable @Preview(showBackground = true) internal fun AccountAvatarWithUnreadCountMaxedPreview() { PreviewWithThemes { AccountAvatar( account = DISPLAY_ACCOUNT.copy( unreadMessageCount = 100, ), onClick = {}, ) } }
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatar.kt +56 −14 Original line number Diff line number Diff line Loading @@ -9,11 +9,14 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.designsystem.atom.Surface import app.k9mail.core.ui.compose.designsystem.atom.text.TextLabelSmall import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount import app.k9mail.feature.navigation.drawer.ui.common.labelForCount @Composable internal fun AccountAvatar( Loading @@ -22,20 +25,25 @@ internal fun AccountAvatar( modifier: Modifier = Modifier, ) { val accountColor = calculateAccountColor(account.account.chipColor) val accountColorRoles = ColorRoles.from(accountColor) Box( modifier = modifier, contentAlignment = Alignment.BottomEnd, ) { Surface( modifier = modifier modifier = Modifier .size(MainTheme.sizes.iconAvatar) .border(2.dp, accountColor, CircleShape) .padding(2.dp), .padding(2.dp) .clickable(onClick = { onClick(account) }), color = accountColor.copy(alpha = 0.3f), shape = CircleShape, ) { Box( contentAlignment = Alignment.Center, modifier = Modifier .border(2.dp, MainTheme.colors.surfaceContainerLowest, CircleShape) .clickable(onClick = { onClick(account) }), .border(2.dp, MainTheme.colors.surfaceContainerLowest, CircleShape), ) { Placeholder( email = account.account.email, Loading @@ -43,6 +51,11 @@ internal fun AccountAvatar( // TODO: Add image loading } } UnreadBadge( unreadCount = account.unreadMessageCount, accountColorRoles = accountColorRoles, ) } } @Composable Loading @@ -56,6 +69,35 @@ private fun Placeholder( ) } @Composable private fun UnreadBadge( unreadCount: Int, accountColorRoles: ColorRoles, modifier: Modifier = Modifier, ) { if (unreadCount > 0) { val resources = LocalContext.current.resources Surface( color = accountColorRoles.accent, shape = CircleShape, modifier = modifier, ) { TextLabelSmall( text = labelForCount( count = unreadCount, resources = resources, ), color = accountColorRoles.onAccent, modifier = Modifier.padding( horizontal = 3.dp, vertical = 2.dp, ), ) } } } private fun extractDomainInitials(email: String): String { return email.split("@")[1].take(2) }
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/CalculateAccountColor.kt +24 −0 Original line number Diff line number Diff line Loading @@ -2,8 +2,11 @@ package app.k9mail.feature.navigation.drawer.ui.account import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.core.ui.compose.theme2.toHarmonizedColor import com.google.android.material.color.MaterialColors @Composable internal fun calculateAccountColor(accountColor: Int): Color { Loading @@ -13,3 +16,24 @@ internal fun calculateAccountColor(accountColor: Int): Color { Color(accountColor).toHarmonizedColor(MainTheme.colors.surface) } } data class ColorRoles( val accent: Color, val onAccent: Color, val accentContainer: Color, val onAccentContainer: Color, ) { companion object { @Composable fun from(color: Color): ColorRoles { val context = LocalContext.current val colorRoles = MaterialColors.getColorRoles(context, color.toArgb()) return ColorRoles( accent = Color(colorRoles.accent), onAccent = Color(colorRoles.onAccent), accentContainer = Color(colorRoles.accentContainer), onAccentContainer = Color(colorRoles.onAccentContainer), ) } } }
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/common/LabelForCount.kt 0 → 100644 +22 −0 Original line number Diff line number Diff line package app.k9mail.feature.navigation.drawer.ui.common import android.content.res.Resources import app.k9mail.feature.navigation.drawer.R @Suppress("MagicNumber") internal fun labelForCount( count: Int, resources: Resources, ) = when { count in 1..99 -> "$count" count in 100..1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_99, ) count > 1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_1_000, ) else -> "" }
feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItemBadge.kt +1 −20 Original line number Diff line number Diff line package app.k9mail.feature.navigation.drawer.ui.folder import android.content.res.Resources import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.runtime.Composable Loading @@ -10,7 +9,7 @@ import androidx.compose.ui.platform.LocalContext import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerItemBadge import app.k9mail.core.ui.compose.theme2.MainTheme import app.k9mail.feature.navigation.drawer.R import app.k9mail.feature.navigation.drawer.ui.common.labelForCount @Composable internal fun FolderListItemBadge( Loading Loading @@ -87,21 +86,3 @@ private fun FolderCountAndStarredBadge( } } } @Suppress("MagicNumber") private fun labelForCount( count: Int, resources: Resources, ) = when { count in 1..99 -> "$count" count in 100..1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_99, ) count > 1000 -> resources.getString( R.string.navigation_drawer_folder_item_badge_count_greater_than_1_000, ) else -> "" }