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

Unverified Commit 740da39f authored by Rafael Tonholo's avatar Rafael Tonholo
Browse files

chore(archive): move Preview functions to `debug` folder

parent 54977069
Loading
Loading
Loading
Loading
+63 −39
Original line number Diff line number Diff line
package app.k9mail.core.ui.compose.designsystem

import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Arrangement
@@ -11,41 +12,80 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.movableContentOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import app.k9mail.core.ui.compose.theme2.MainTheme

/**
 * A Composable function that displays a preview of the content in both Thunderbird and K-9 Mail themes.
 *
 * It uses the current system theme (light or dark) for both previews.
 *
 * @param modifier The modifier to be applied to the layout.
 * @param useRow Whether to display the previews in a row or column. Defaults to `false` (column).
 * @param useScrim Whether to display a scrim behind the content. Defaults to `false`.
 * @param scrimAlpha The alpha value for the scrim. Defaults to `0.8f`.
 * @param scrimPadding The padding for the scrim. Defaults to `MainTheme.spacings.triple`.
 * @param arrangement The arrangement for the previews. Defaults to `Arrangement.spacedBy(MainTheme.spacings.triple)`.
 * @param content The content to be displayed in the previews.
 *
 * @see app.k9mail.core.ui.compose.theme2.default.defaultThemeSpacings for MainTheme.spacings
 */
@Composable
fun PreviewWithThemeLightDark(
    modifier: Modifier = Modifier,
    useRow: Boolean = false,
    useScrim: Boolean = false,
    scrimAlpha: Float = 0.8f,
    scrimPadding: PaddingValues = PaddingValues(24.dp),
    arrangement: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(24.dp),
    scrimPadding: PaddingValues = PaddingValues(MainTheme.spacings.triple),
    arrangement: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(MainTheme.spacings.triple),
    content: @Composable () -> Unit,
) {
    val movableContent = remember {
        movableContentOf {
            PreviewWithTheme(
            ThemePreview(
                themeType = PreviewThemeType.THUNDERBIRD,
                isDarkTheme = isSystemInDarkTheme(),
            ) {
                PreviewSurface {
                    if (useScrim) {
                        Box(
                            modifier = Modifier
                                .background(MainTheme.colors.scrim.copy(alpha = scrimAlpha))
                                .padding(scrimPadding),
                useScrim = useScrim,
                scrimAlpha = scrimAlpha,
                scrimPadding = scrimPadding,
                content = content,
            )
            ThemePreview(
                themeType = PreviewThemeType.K9MAIL,
                useScrim = useScrim,
                scrimAlpha = scrimAlpha,
                scrimPadding = scrimPadding,
                content = content,
            )
        }
    }

    if (useRow) {
        Row(
            horizontalArrangement = arrangement,
            modifier = modifier,
        ) {
                            content()
            movableContent()
        }
    } else {
                        content()
        Column(
            verticalArrangement = arrangement,
            modifier = modifier,
        ) {
            movableContent()
        }
                    PreviewHeader(themeName = PreviewThemeType.THUNDERBIRD.name)
    }
}

@Composable
private fun ThemePreview(
    themeType: PreviewThemeType,
    useScrim: Boolean,
    scrimAlpha: Float,
    scrimPadding: PaddingValues,
    content: @Composable (() -> Unit),
) {
    val movableContent = remember { movableContentOf { content() } }
    PreviewWithTheme(
                themeType = PreviewThemeType.K9MAIL,
        themeType = themeType,
        isDarkTheme = isSystemInDarkTheme(),
    ) {
        PreviewSurface {
@@ -54,29 +94,13 @@ fun PreviewWithThemeLightDark(
                    modifier = Modifier
                        .background(MainTheme.colors.scrim.copy(alpha = scrimAlpha))
                        .padding(scrimPadding),
                        ) {
                            content()
                        }
                    } else {
                        content()
                    }
                    PreviewHeader(themeName = PreviewThemeType.K9MAIL.name)
                }
            }
        }
    }

    if (useRow) {
        Row(
            horizontalArrangement = arrangement,
                ) {
                    movableContent()
                }
            } else {
        Column(
            verticalArrangement = arrangement,
        ) {
                movableContent()
            }
            PreviewHeader(themeName = themeType.name)
        }
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ private fun PreviewWithThunderbirdTheme(
}

@Composable
fun PreviewHeader(
internal fun PreviewHeader(
    themeName: String,
) {
    Surface(
@@ -117,7 +117,7 @@ fun PreviewHeader(
}

@Composable
fun PreviewSurface(
internal fun PreviewSurface(
    content: @Composable () -> Unit,
) {
    Surface(
+147 −0
Original line number Diff line number Diff line
package app.k9mail.core.ui.compose.designsystem.organism

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape
import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium
import app.k9mail.core.ui.compose.designsystem.atom.text.TextHeadlineSmall
import app.k9mail.core.ui.compose.theme2.MainTheme

@PreviewLightDarkLandscape
@Composable
private fun BasicDialogPreview() {
    PreviewWithThemeLightDark(
        useRow = true,
        useScrim = true,
        scrimPadding = PaddingValues(MainTheme.spacings.quadruple),
        arrangement = Arrangement.spacedBy(MainTheme.spacings.triple),
    ) {
        BasicDialogContent(
            headline = {
                Column(
                    horizontalAlignment = Alignment.CenterHorizontally,
                    verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    modifier = Modifier.fillMaxWidth(),
                ) {
                    Icon(imageVector = Icons.Default.Refresh, contentDescription = null)
                    TextHeadlineSmall(text = "Reset settings?")
                }
            },
            supportingText = {
                TextBodyMedium(
                    text = "This will reset your app preferences back to their default settings. " +
                        "The following accounts will also be signed out:",
                    color = MainTheme.colors.onSurfaceVariant,
                )
            },
            content = {
                Column(
                    verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(
                            start = MainTheme.spacings.triple,
                            end = MainTheme.spacings.triple,
                        ),
                ) {
                    Row(
                        verticalAlignment = Alignment.CenterVertically,
                        horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    ) {
                        Box(
                            modifier = Modifier
                                .size(MainTheme.sizes.iconAvatar)
                                .background(color = MainTheme.colors.primary, shape = CircleShape),
                        )
                        Text(text = "Account 1")
                    }
                    Row(
                        verticalAlignment = Alignment.CenterVertically,
                        horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    ) {
                        Box(
                            modifier = Modifier
                                .size(MainTheme.sizes.iconAvatar)
                                .background(color = MainTheme.colors.primary, shape = CircleShape),
                        )
                        Text(text = "Account 2")
                    }
                    Row(
                        verticalAlignment = Alignment.CenterVertically,
                        horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    ) {
                        Box(
                            modifier = Modifier
                                .size(MainTheme.sizes.iconAvatar)
                                .background(color = MainTheme.colors.primary, shape = CircleShape),
                        )
                        Text(text = "Account 3")
                    }
                }
            },
            buttons = {
                TextButton(onClick = {}) {
                    Text(text = "Cancel")
                }
                TextButton(onClick = {}) {
                    Text(text = "Accept")
                }
            },
            showDividers = true,
            modifier = Modifier.width(300.dp),
        )
    }
}

@PreviewLightDarkLandscape
@Composable
private fun PreviewOnlySupportingText() {
    PreviewWithThemeLightDark(
        useRow = true,
        useScrim = true,
        scrimPadding = PaddingValues(MainTheme.spacings.quadruple),
        arrangement = Arrangement.spacedBy(MainTheme.spacings.triple),
    ) {
        BasicDialogContent(
            headline = {
                TextHeadlineSmall(text = "Email can not be archived")
            },
            supportingText = {
                TextBodyMedium(
                    text = "Configure archive folder now",
                    color = MainTheme.colors.onSurfaceVariant,
                )
            },
            content = null,
            buttons = {
                TextButton(onClick = {}) {
                    Text(text = "Skip for now")
                }
                TextButton(onClick = {}) {
                    Text(text = "Set archive folder")
                }
            },
            showDividers = false,
            modifier = Modifier.width(300.dp),
        )
    }
}
+3 −136
Original line number Diff line number Diff line
package app.k9mail.core.ui.compose.designsystem.organism

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -8,25 +7,13 @@ import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
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.unit.dp
import androidx.compose.ui.window.DialogProperties
import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape
import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark
import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal
import app.k9mail.core.ui.compose.designsystem.atom.Surface
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium
@@ -66,12 +53,12 @@ fun BasicDialog(

@Composable
fun BasicDialog(
    headlineText: String,
    supportingText: String?,
    onDismissRequest: () -> Unit,
    content: (@Composable () -> Unit)?,
    buttons: @Composable RowScope.() -> Unit,
    modifier: Modifier = Modifier,
    headlineText: String,
    supportingText: String?,
    contentPadding: PaddingValues = BasicDialogDefaults.contentPadding,
    showDividers: Boolean = BasicDialogDefaults.showDividers,
    dividerColor: Color = BasicDialogDefaults.dividerColor,
@@ -99,7 +86,7 @@ fun BasicDialog(
}

@Composable
private fun BasicDialogContent(
internal fun BasicDialogContent(
    content: (@Composable () -> Unit)?,
    buttons: @Composable RowScope.() -> Unit,
    modifier: Modifier = Modifier,
@@ -175,123 +162,3 @@ object BasicDialogDefaults {
            bottom = MainTheme.spacings.double,
        )
}

@PreviewLightDarkLandscape
@Composable
private fun Preview() {
    PreviewWithThemeLightDark(
        useRow = true,
        useScrim = true,
        scrimPadding = PaddingValues(32.dp),
        arrangement = Arrangement.spacedBy(24.dp),
    ) {
        BasicDialogContent(
            headline = {
                Column(
                    horizontalAlignment = Alignment.CenterHorizontally,
                    verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    modifier = Modifier.fillMaxWidth(),
                ) {
                    Icon(imageVector = Icons.Default.Refresh, contentDescription = null)
                    TextHeadlineSmall(text = "Reset settings?")
                }
            },
            supportingText = {
                TextBodyMedium(
                    text = "This will reset your app preferences back to their default settings. " +
                        "The following accounts will also be signed out:",
                    color = MainTheme.colors.onSurfaceVariant,
                )
            },
            content = {
                Column(
                    verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(
                            start = MainTheme.spacings.triple,
                            end = MainTheme.spacings.triple,
                        ),
                ) {
                    Row(
                        verticalAlignment = Alignment.CenterVertically,
                        horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    ) {
                        Box(
                            modifier = Modifier
                                .size(48.dp)
                                .background(color = MainTheme.colors.primary, shape = CircleShape),
                        )
                        Text(text = "Account 1")
                    }
                    Row(
                        verticalAlignment = Alignment.CenterVertically,
                        horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    ) {
                        Box(
                            modifier = Modifier
                                .size(48.dp)
                                .background(color = MainTheme.colors.primary, shape = CircleShape),
                        )
                        Text(text = "Account 2")
                    }
                    Row(
                        verticalAlignment = Alignment.CenterVertically,
                        horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
                    ) {
                        Box(
                            modifier = Modifier
                                .size(48.dp)
                                .background(color = MainTheme.colors.primary, shape = CircleShape),
                        )
                        Text(text = "Account 3")
                    }
                }
            },
            buttons = {
                TextButton(onClick = {}) {
                    Text(text = "Cancel")
                }
                TextButton(onClick = {}) {
                    Text(text = "Accept")
                }
            },
            showDividers = true,
            modifier = Modifier.width(300.dp),
        )
    }
}

@PreviewLightDarkLandscape
@Composable
private fun PreviewOnlySupportingText() {
    PreviewWithThemeLightDark(
        useRow = true,
        useScrim = true,
        scrimPadding = PaddingValues(32.dp),
        arrangement = Arrangement.spacedBy(24.dp),
    ) {
        BasicDialogContent(
            headline = {
                TextHeadlineSmall(text = "Email can not be archived")
            },
            supportingText = {
                TextBodyMedium(
                    text = "Configure archive folder now",
                    color = MainTheme.colors.onSurfaceVariant,
                )
            },
            content = null,
            buttons = {
                TextButton(onClick = {}) {
                    Text(text = "Skip for now")
                }
                TextButton(onClick = {}) {
                    Text(text = "Set archive folder")
                }
            },
            showDividers = false,
            modifier = Modifier.width(300.dp),
        )
    }
}
+94 −0
Original line number Diff line number Diff line
package net.thunderbird.feature.mail.message.list.ui.dialog

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
import androidx.compose.ui.unit.dp
import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape
import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark
import app.k9mail.core.ui.compose.designsystem.atom.Surface
import app.k9mail.core.ui.compose.theme2.MainTheme
import net.thunderbird.feature.mail.folder.api.FolderType
import net.thunderbird.feature.mail.folder.api.RemoteFolder
import net.thunderbird.feature.mail.message.list.ui.dialog.SetupArchiveFolderDialogContract.State

private class ChooseArchiveFolderDialogContentParamsCol :
    CollectionPreviewParameterProvider<State.ChooseArchiveFolder>(
        setOf(
            State.ChooseArchiveFolder(
                isLoadingFolders = true,
            ),
            State.ChooseArchiveFolder(
                isLoadingFolders = false,
                folders = listOf(
                    RemoteFolder(
                        id = 1,
                        serverId = "1",
                        name = "[Gmail]/All Mail",
                        type = FolderType.REGULAR,
                    ),
                    RemoteFolder(id = 2, serverId = "2", name = "[Gmail]/Draft", type = FolderType.REGULAR),
                    RemoteFolder(
                        id = 3,
                        serverId = "3",
                        name = "[Gmail]/Sent Mail",
                        type = FolderType.REGULAR,
                    ),
                    RemoteFolder(id = 3, serverId = "3", name = "[Gmail]/Spam", type = FolderType.REGULAR),
                    RemoteFolder(id = 3, serverId = "3", name = "[Gmail]/Trash", type = FolderType.REGULAR),
                    RemoteFolder(
                        id = 3,
                        serverId = "3",
                        name = "[Gmail]/Another Folder",
                        type = FolderType.REGULAR,
                    ),
                ),
            ),
            State.ChooseArchiveFolder(
                isLoadingFolders = false,
                errorMessage = "Error message",
            ),
        ),
    )

@PreviewLightDarkLandscape
@Composable
private fun ChooseArchiveFolderDialogContentPreview(
    @PreviewParameter(ChooseArchiveFolderDialogContentParamsCol::class) state: State.ChooseArchiveFolder,
) {
    PreviewWithThemeLightDark(
        useRow = true,
        useScrim = true,
        scrimPadding = PaddingValues(32.dp),
        arrangement = Arrangement.spacedBy(24.dp),
    ) {
        Surface(
            shape = MainTheme.shapes.extraLarge,
            modifier = Modifier.width(300.dp),
        ) {
            Column {
                ChooseArchiveFolderDialogContent(
                    state = state,
                    onFolderSelect = {},
                )
                Row(
                    modifier = Modifier.fillMaxWidth(),
                    horizontalArrangement = Arrangement.End,
                ) {
                    ChooseArchiveFolderDialogButtons(
                        state = state,
                        onCreateNewFolderClick = {},
                        onDoneClick = {},
                    )
                }
            }
        }
    }
}
Loading