diff --git a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt index 13fe8b10e5..a94d4ac385 100644 --- a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt +++ b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt @@ -1,6 +1,7 @@ package app.k9mail.feature.account.edit.ui.server.settings import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import androidx.navigation.NavController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -8,9 +9,10 @@ import androidx.navigation.compose.rememberNavController import app.k9mail.feature.account.edit.ui.server.settings.modify.ModifyIncomingServerSettingsViewModel import app.k9mail.feature.account.edit.ui.server.settings.save.SaveIncomingServerSettingsViewModel import app.k9mail.feature.account.edit.ui.server.settings.save.SaveServerSettingsScreen +import app.k9mail.feature.account.server.settings.R import app.k9mail.feature.account.server.settings.ui.incoming.IncomingServerSettingsScreen import app.k9mail.feature.account.server.validation.ui.IncomingServerValidationViewModel -import app.k9mail.feature.account.server.validation.ui.ServerValidationScreen +import app.k9mail.feature.account.server.validation.ui.SettingsServerValidationScreen import org.koin.androidx.compose.koinViewModel import org.koin.core.parameter.parametersOf @@ -48,7 +50,8 @@ fun EditIncomingServerSettingsNavHost( ) } composable(route = NESTED_NAVIGATION_ROUTE_VALIDATE) { - ServerValidationScreen( + SettingsServerValidationScreen( + title = stringResource(id = R.string.account_server_settings_incoming_top_bar_title), onBack = { navController.popBackStack() }, onNext = { navController.navigateToSave() }, viewModel = koinViewModel { diff --git a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt index 32879979e5..af721fa3d4 100644 --- a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt +++ b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt @@ -1,6 +1,7 @@ package app.k9mail.feature.account.edit.ui.server.settings import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource import androidx.navigation.NavController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -8,9 +9,10 @@ import androidx.navigation.compose.rememberNavController import app.k9mail.feature.account.edit.ui.server.settings.modify.ModifyOutgoingServerSettingsViewModel import app.k9mail.feature.account.edit.ui.server.settings.save.SaveOutgoingServerSettingsViewModel import app.k9mail.feature.account.edit.ui.server.settings.save.SaveServerSettingsScreen +import app.k9mail.feature.account.server.settings.R import app.k9mail.feature.account.server.settings.ui.outgoing.OutgoingServerSettingsScreen import app.k9mail.feature.account.server.validation.ui.OutgoingServerValidationViewModel -import app.k9mail.feature.account.server.validation.ui.ServerValidationScreen +import app.k9mail.feature.account.server.validation.ui.SettingsServerValidationScreen import org.koin.androidx.compose.koinViewModel import org.koin.core.parameter.parametersOf @@ -48,7 +50,8 @@ fun EditOutgoingServerSettingsNavHost( ) } composable(route = NESTED_NAVIGATION_ROUTE_VALIDATE) { - ServerValidationScreen( + SettingsServerValidationScreen( + title = stringResource(id = R.string.account_server_settings_outgoing_top_bar_title), onBack = { navController.popBackStack() }, onNext = { navController.navigateToSave() }, viewModel = koinViewModel { diff --git a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreen.kt b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationAppTitleScreen.kt similarity index 93% rename from feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreen.kt rename to feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationAppTitleScreen.kt index 68a05587ec..6162b771ed 100644 --- a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreen.kt +++ b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationAppTitleScreen.kt @@ -17,7 +17,7 @@ import app.k9mail.feature.account.server.validation.ui.fake.FakeIncomingServerVa import app.k9mail.feature.account.server.validation.ui.fake.FakeOutgoingServerValidationViewModel @Composable -internal fun ServerValidationMainScreen( +internal fun ServerValidationAppTitleScreen( viewModel: ViewModel, modifier: Modifier = Modifier, ) { @@ -52,7 +52,7 @@ internal fun ServerValidationMainScreen( @PreviewDevices internal fun IncomingServerValidationScreenK9Preview() { K9Theme { - ServerValidationMainScreen( + ServerValidationAppTitleScreen( viewModel = FakeIncomingServerValidationViewModel( oAuthViewModel = PreviewAccountOAuthViewModel(), ), @@ -64,7 +64,7 @@ internal fun IncomingServerValidationScreenK9Preview() { @PreviewDevices internal fun IncomingServerValidationScreenThunderbirdPreview() { ThunderbirdTheme { - ServerValidationMainScreen( + ServerValidationAppTitleScreen( viewModel = FakeIncomingServerValidationViewModel( oAuthViewModel = PreviewAccountOAuthViewModel(), ), @@ -76,7 +76,7 @@ internal fun IncomingServerValidationScreenThunderbirdPreview() { @PreviewDevices internal fun AccountOutgoingValidationScreenK9Preview() { K9Theme { - ServerValidationMainScreen( + ServerValidationAppTitleScreen( viewModel = FakeOutgoingServerValidationViewModel( oAuthViewModel = PreviewAccountOAuthViewModel(), ), @@ -88,7 +88,7 @@ internal fun AccountOutgoingValidationScreenK9Preview() { @PreviewDevices internal fun AccountOutgoingValidationScreenThunderbirdPreview() { ThunderbirdTheme { - ServerValidationMainScreen( + ServerValidationAppTitleScreen( viewModel = FakeOutgoingServerValidationViewModel( oAuthViewModel = PreviewAccountOAuthViewModel(), ), diff --git a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreen.kt b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationContainerScreen.kt similarity index 91% rename from feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreen.kt rename to feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationContainerScreen.kt index de7026c86a..933c6242cc 100644 --- a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreen.kt +++ b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationContainerScreen.kt @@ -12,11 +12,12 @@ import app.k9mail.feature.account.server.validation.ui.ServerValidationContract. @Suppress("ViewModelForwarding") @Composable -fun ServerValidationScreen( +internal fun ServerValidationContainerScreen( onNext: () -> Unit, onBack: () -> Unit, viewModel: ViewModel, modifier: Modifier = Modifier, + content: @Composable (modifier: Modifier) -> Unit, ) { val (state, dispatch) = viewModel.observe { effect -> when (effect) { @@ -40,9 +41,6 @@ fun ServerValidationScreen( modifier = modifier, ) } else { - ServerValidationMainScreen( - viewModel = viewModel, - modifier = modifier, - ) + content(modifier) } } diff --git a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationToolbarScreen.kt b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationToolbarScreen.kt new file mode 100644 index 0000000000..6609a85a98 --- /dev/null +++ b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationToolbarScreen.kt @@ -0,0 +1,64 @@ +package app.k9mail.feature.account.server.validation.ui + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import app.k9mail.core.ui.compose.common.annotation.PreviewDevices +import app.k9mail.core.ui.compose.common.mvi.observeWithoutEffect +import app.k9mail.core.ui.compose.designsystem.template.Scaffold +import app.k9mail.core.ui.compose.theme.K9Theme +import app.k9mail.feature.account.common.ui.AccountTopAppBarWithBackButton +import app.k9mail.feature.account.common.ui.WizardNavigationBar +import app.k9mail.feature.account.common.ui.WizardNavigationBarState +import app.k9mail.feature.account.oauth.ui.preview.PreviewAccountOAuthViewModel +import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Event +import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.ViewModel +import app.k9mail.feature.account.server.validation.ui.fake.FakeIncomingServerValidationViewModel + +@Composable +internal fun ServerValidationToolbarScreen( + title: String, + viewModel: ViewModel, + modifier: Modifier = Modifier, +) { + val (state, dispatch) = viewModel.observeWithoutEffect() + + Scaffold( + topBar = { + AccountTopAppBarWithBackButton( + title = title, + onBackClicked = { dispatch(Event.OnBackClicked) }, + ) + }, + bottomBar = { + WizardNavigationBar( + onNextClick = {}, + onBackClick = { dispatch(Event.OnBackClicked) }, + state = WizardNavigationBarState( + showNext = false, + ), + ) + }, + modifier = modifier, + ) { innerPadding -> + ServerValidationContent( + onEvent = { dispatch(it) }, + state = state.value, + isIncomingValidation = viewModel.isIncomingValidation, + oAuthViewModel = viewModel.oAuthViewModel, + contentPadding = innerPadding, + ) + } +} + +@Composable +@PreviewDevices +internal fun IncomingServerValidationToolbarScreenK9Preview() { + K9Theme { + ServerValidationToolbarScreen( + title = "Incoming server settings", + viewModel = FakeIncomingServerValidationViewModel( + oAuthViewModel = PreviewAccountOAuthViewModel(), + ), + ) + } +} diff --git a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/SettingsServerValidationScreen.kt b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/SettingsServerValidationScreen.kt new file mode 100644 index 0000000000..6764d8f792 --- /dev/null +++ b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/SettingsServerValidationScreen.kt @@ -0,0 +1,27 @@ +package app.k9mail.feature.account.server.validation.ui + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Suppress("ViewModelForwarding") +@Composable +fun SettingsServerValidationScreen( + title: String, + onNext: () -> Unit, + onBack: () -> Unit, + viewModel: ServerValidationContract.ViewModel, + modifier: Modifier = Modifier, +) { + ServerValidationContainerScreen( + onNext = onNext, + onBack = onBack, + viewModel = viewModel, + modifier = modifier, + ) { contentModifier -> + ServerValidationToolbarScreen( + title = title, + viewModel = viewModel, + modifier = contentModifier, + ) + } +} diff --git a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/SetupServerValidationScreen.kt b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/SetupServerValidationScreen.kt new file mode 100644 index 0000000000..e1bbf5f9ad --- /dev/null +++ b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/SetupServerValidationScreen.kt @@ -0,0 +1,25 @@ +package app.k9mail.feature.account.server.validation.ui + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Suppress("ViewModelForwarding") +@Composable +fun SetupServerValidationScreen( + onNext: () -> Unit, + onBack: () -> Unit, + viewModel: ServerValidationContract.ViewModel, + modifier: Modifier = Modifier, +) { + ServerValidationContainerScreen( + onNext = onNext, + onBack = onBack, + viewModel = viewModel, + modifier = modifier, + ) { contentModifier -> + ServerValidationAppTitleScreen( + viewModel = viewModel, + modifier = contentModifier, + ) + } +} diff --git a/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenKtTest.kt b/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/SetupServerValidationScreenKtTest.kt similarity index 93% rename from feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenKtTest.kt rename to feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/SetupServerValidationScreenKtTest.kt index a4828a420e..f27f025338 100644 --- a/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenKtTest.kt +++ b/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/SetupServerValidationScreenKtTest.kt @@ -11,7 +11,7 @@ import assertk.assertions.isEqualTo import kotlinx.coroutines.test.runTest import org.junit.Test -class ServerValidationScreenKtTest : ComposeTest() { +class SetupServerValidationScreenKtTest : ComposeTest() { @Test fun `should delegate navigation effects`() = runTest { @@ -22,7 +22,7 @@ class ServerValidationScreenKtTest : ComposeTest() { setContent { ThunderbirdTheme { - ServerValidationScreen( + SetupServerValidationScreen( onNext = { onNextCounter++ }, onBack = { onBackCounter++ }, viewModel = viewModel, diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt index f493cb0780..be4537dffb 100644 --- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt +++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt @@ -15,7 +15,7 @@ import app.k9mail.feature.account.server.settings.ui.outgoing.OutgoingServerSett import app.k9mail.feature.account.server.settings.ui.outgoing.OutgoingServerSettingsViewModel import app.k9mail.feature.account.server.validation.ui.IncomingServerValidationViewModel import app.k9mail.feature.account.server.validation.ui.OutgoingServerValidationViewModel -import app.k9mail.feature.account.server.validation.ui.ServerValidationScreen +import app.k9mail.feature.account.server.validation.ui.SetupServerValidationScreen import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryScreen import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryViewModel import app.k9mail.feature.account.setup.ui.createaccount.CreateAccountScreen @@ -80,7 +80,7 @@ fun AccountSetupNavHost( } composable(route = NESTED_NAVIGATION_INCOMING_SERVER_VALIDATION) { - ServerValidationScreen( + SetupServerValidationScreen( onNext = { if (isAutomaticConfig) { navController.navigate(NESTED_NAVIGATION_OUTGOING_SERVER_VALIDATION) { @@ -106,7 +106,7 @@ fun AccountSetupNavHost( } composable(route = NESTED_NAVIGATION_OUTGOING_SERVER_VALIDATION) { - ServerValidationScreen( + SetupServerValidationScreen( onNext = { navController.navigate( if (hasSpecialFolders) {