Repo created

This commit is contained in:
Fr4nz D13trich 2025-11-24 18:55:42 +01:00
parent a629de6271
commit 3cef7c5092
2161 changed files with 246605 additions and 2 deletions

View file

@ -0,0 +1,12 @@
plugins {
id(ThunderbirdPlugins.Library.androidCompose)
}
android {
namespace = "net.thunderbird.feature.onboarding"
resourcePrefix = "onboarding_"
}
dependencies {
implementation(projects.core.ui.compose.designsystem)
}

View file

@ -0,0 +1,171 @@
package net.thunderbird.feature.onboarding
import androidx.compose.foundation.Image
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.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import app.k9mail.core.ui.compose.common.DevicePreviews
import app.k9mail.core.ui.compose.designsystem.atom.Background
import app.k9mail.core.ui.compose.designsystem.atom.button.Button
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonText
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBody1
import app.k9mail.core.ui.compose.designsystem.atom.text.TextHeadline2
import app.k9mail.core.ui.compose.designsystem.template.LazyColumnWithFooter
import app.k9mail.core.ui.compose.designsystem.template.ResponsiveContent
import app.k9mail.core.ui.compose.theme.K9Theme
import app.k9mail.core.ui.compose.theme.MainTheme
import app.k9mail.core.ui.compose.theme.ThunderbirdTheme
@Composable
internal fun OnboardingContent(
onStartClick: () -> Unit,
onImportClick: () -> Unit,
modifier: Modifier = Modifier,
) {
ResponsiveContent {
Background(
modifier = modifier,
) {
LazyColumnWithFooter(
modifier = Modifier
.fillMaxHeight()
.padding(MainTheme.spacings.double),
footer = {
WelcomeFooter(
modifier = Modifier
.fillMaxWidth()
.padding(top = MainTheme.spacings.triple),
onStartClick = onStartClick,
onImportClick = onImportClick,
)
},
verticalArrangement = Arrangement.spacedBy(MainTheme.sizes.large, Alignment.CenterVertically),
) {
item {
WelcomeLogo(
modifier = Modifier.fillMaxWidth(),
)
}
item {
WelcomeTitle(
modifier = Modifier.fillMaxWidth(),
)
}
item {
WelcomeMessage(
modifier = Modifier.fillMaxWidth(),
)
}
}
}
}
}
@Composable
private fun WelcomeLogo(
modifier: Modifier = Modifier,
) {
Column(
modifier = Modifier.then(modifier),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Box(
modifier = Modifier
.size(MainTheme.sizes.huge)
.clip(shape = RoundedCornerShape(percent = 50))
.background(color = MainTheme.colors.surface),
) {
Image(
painter = painterResource(id = MainTheme.images.logo),
contentDescription = null,
modifier = Modifier.size(MainTheme.sizes.huge),
)
}
}
}
@Composable
private fun WelcomeTitle(
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier,
horizontalAlignment = Alignment.CenterHorizontally,
) {
TextHeadline2(
text = stringResource(id = R.string.onboarding_welcome_title),
)
}
}
@Composable
private fun WelcomeMessage(
modifier: Modifier = Modifier,
) {
Column(
modifier = Modifier
.padding(start = MainTheme.spacings.quadruple, end = MainTheme.spacings.quadruple)
.then(modifier),
horizontalAlignment = Alignment.CenterHorizontally,
) {
TextBody1(
text = stringResource(id = R.string.onboarding_welcome_message),
)
}
}
@Composable
private fun WelcomeFooter(
onStartClick: () -> Unit,
onImportClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier,
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Button(
text = stringResource(id = R.string.onboarding_welcome_start_button),
onClick = onStartClick,
)
ButtonText(
text = stringResource(id = R.string.onboarding_welcome_import_button),
onClick = onImportClick,
)
}
}
@Composable
@DevicePreviews
internal fun OnboardingContentK9Preview() {
K9Theme {
OnboardingContent(
onStartClick = {},
onImportClick = {},
)
}
}
@Composable
@DevicePreviews
internal fun OnboardingContentThunderbirdPreview() {
ThunderbirdTheme {
OnboardingContent(
onStartClick = {},
onImportClick = {},
)
}
}

View file

@ -0,0 +1,24 @@
package net.thunderbird.feature.onboarding
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
@Composable
fun OnboardingScreen(
onStartClick: () -> Unit,
onImportClick: () -> Unit,
) {
OnboardingContent(
onStartClick = onStartClick,
onImportClick = onImportClick,
)
}
@Preview
@Composable
internal fun OnboardingScreenPreview() {
OnboardingScreen(
onStartClick = {},
onImportClick = {},
)
}

View file

@ -0,0 +1,27 @@
package net.thunderbird.feature.onboarding.navigation
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.compose.composable
import net.thunderbird.feature.onboarding.OnboardingScreen
const val NAVIGATION_ROUTE_ONBOARDING = "onboarding"
fun NavController.navigateToOnboarding(
navOptions: NavOptions? = null,
) {
navigate(NAVIGATION_ROUTE_ONBOARDING, navOptions)
}
fun NavGraphBuilder.onboardingScreen(
onStartClick: () -> Unit,
onImportClick: () -> Unit,
) {
composable(route = NAVIGATION_ROUTE_ONBOARDING) {
OnboardingScreen(
onStartClick = onStartClick,
onImportClick = onImportClick,
)
}
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="onboarding_welcome_title">K-9 Mail</string>
<string name="onboarding_welcome_message">Welcome to K-9 Mail, the Android email client designed for enhanced security, easy customization, and seamless management of all your email accounts.</string>
<string name="onboarding_welcome_start_button">Start</string>
<string name="onboarding_welcome_import_button">Import settings</string>
</resources>