Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit c413650e authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

Add drawer account unread count

parent e04d98f5
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -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 = {},
        )
    }
}
+56 −14
Original line number Diff line number Diff line
@@ -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(
@@ -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,
@@ -43,6 +51,11 @@ internal fun AccountAvatar(
                // TODO: Add image loading
            }
        }
        UnreadBadge(
            unreadCount = account.unreadMessageCount,
            accountColorRoles = accountColorRoles,
        )
    }
}

@Composable
@@ -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)
}
+24 −0
Original line number Diff line number Diff line
@@ -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 {
@@ -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),
            )
        }
    }
}
+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 -> ""
}
+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
@@ -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(
@@ -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 -> ""
}