0
0
mirror of https://github.com/thunderbird/thunderbird-android.git synced 2024-09-20 04:02:14 +02:00

Change auto discovery layout to support small screens

This commit is contained in:
Wolf-Martell Montwé 2024-01-22 17:32:38 +01:00
parent 9871c40dde
commit 6d791153aa
No known key found for this signature in database
GPG Key ID: 6D45B21512ACBF72
3 changed files with 152 additions and 65 deletions

View File

@ -0,0 +1,9 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ViewModelForwarding:AccountAutoDiscoveryContent.kt$AccountOAuthView( onOAuthResult = { result -&gt; onEvent(Event.OnOAuthResult(result)) }, viewModel = oAuthViewModel, isEnabled = isAutoDiscoverySettingsTrusted || isConfigurationApproved, )</ID>
<ID>ViewModelForwarding:AccountAutoDiscoveryContent.kt$AutoDiscoveryContent( state = state, onEvent = onEvent, oAuthViewModel = oAuthViewModel, )</ID>
<ID>ViewModelForwarding:AccountAutoDiscoveryContent.kt$ContentView( state = state, onEvent = onEvent, oAuthViewModel = oAuthViewModel, resources = resources, )</ID>
</CurrentIssues>
</SmellBaseline>

View File

@ -1,84 +1,186 @@
package app.k9mail.feature.account.setup.ui.autodiscovery
import androidx.compose.foundation.layout.Arrangement
import android.content.res.Resources
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
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.platform.testTag
import androidx.compose.ui.res.stringResource
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.atom.Background
import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingErrorView
import app.k9mail.core.ui.compose.designsystem.molecule.ErrorView
import app.k9mail.core.ui.compose.designsystem.molecule.LoadingView
import app.k9mail.core.ui.compose.designsystem.molecule.input.EmailAddressInput
import app.k9mail.core.ui.compose.designsystem.molecule.input.PasswordInput
import app.k9mail.core.ui.compose.designsystem.template.ResponsiveWidthContainer
import app.k9mail.core.ui.compose.theme.K9Theme
import app.k9mail.core.ui.compose.theme.MainTheme
import app.k9mail.core.ui.compose.theme.ThunderbirdTheme
import app.k9mail.feature.account.common.ui.AppTitleTopHeader
import app.k9mail.feature.account.common.ui.WizardNavigationBar
import app.k9mail.feature.account.common.ui.WizardNavigationBarState
import app.k9mail.feature.account.common.ui.loadingerror.rememberContentLoadingErrorViewState
import app.k9mail.feature.account.oauth.ui.AccountOAuthContract
import app.k9mail.feature.account.oauth.ui.AccountOAuthView
import app.k9mail.feature.account.oauth.ui.preview.PreviewAccountOAuthViewModel
import app.k9mail.feature.account.setup.R
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.Event
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.State
import app.k9mail.feature.account.setup.ui.autodiscovery.item.contentItems
import app.k9mail.feature.account.setup.ui.autodiscovery.view.AutoDiscoveryResultApprovalView
import app.k9mail.feature.account.setup.ui.autodiscovery.view.AutoDiscoveryResultView
@Composable
internal fun AccountAutoDiscoveryContent(
state: State,
onEvent: (Event) -> Unit,
oAuthViewModel: AccountOAuthContract.ViewModel,
contentPadding: PaddingValues,
modifier: Modifier = Modifier,
) {
ResponsiveWidthContainer(
Background(
modifier = Modifier
.fillMaxSize()
.testTag("AccountAutoDiscoveryContent")
.padding(contentPadding)
.fillMaxWidth()
.then(modifier),
) {
val resources = LocalContext.current.resources
val scrollState = rememberScrollState()
ContentLoadingErrorView(
state = rememberContentLoadingErrorViewState(state),
loading = {
LoadingView(
message = stringResource(id = R.string.account_setup_auto_discovery_loading_message),
modifier = Modifier.fillMaxSize(),
)
},
error = {
ErrorView(
title = stringResource(id = R.string.account_setup_auto_discovery_loading_error),
message = state.error?.toResourceString(resources),
onRetry = { onEvent(Event.OnRetryClicked) },
modifier = Modifier.fillMaxSize(),
)
},
) {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.imePadding(),
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double, Alignment.CenterVertically),
ResponsiveWidthContainer {
Column(
modifier = Modifier.fillMaxSize(),
) {
contentItems(
state = state,
onEvent = onEvent,
oAuthViewModel = oAuthViewModel,
Column(
modifier = Modifier
.weight(1f)
.verticalScroll(scrollState)
.imePadding(),
) {
AppTitleTopHeader(
title = stringResource(id = R.string.account_setup_title),
)
Spacer(modifier = Modifier.weight(1f))
AutoDiscoveryContent(
state = state,
onEvent = onEvent,
oAuthViewModel = oAuthViewModel,
)
Spacer(modifier = Modifier.weight(1f))
}
WizardNavigationBar(
onNextClick = { onEvent(Event.OnNextClicked) },
onBackClick = { onEvent(Event.OnBackClicked) },
state = WizardNavigationBarState(showNext = state.isNextButtonVisible),
)
}
}
}
}
@Composable
internal fun AutoDiscoveryContent(
state: State,
onEvent: (Event) -> Unit,
oAuthViewModel: AccountOAuthContract.ViewModel,
modifier: Modifier = Modifier,
) {
val resources = LocalContext.current.resources
ContentLoadingErrorView(
state = rememberContentLoadingErrorViewState(state),
loading = {
LoadingView(
message = stringResource(id = R.string.account_setup_auto_discovery_loading_message),
modifier = Modifier.fillMaxSize(),
)
},
error = {
ErrorView(
title = stringResource(id = R.string.account_setup_auto_discovery_loading_error),
message = state.error?.toResourceString(resources),
onRetry = { onEvent(Event.OnRetryClicked) },
modifier = Modifier.fillMaxSize(),
)
},
content = {
ContentView(
state = state,
onEvent = onEvent,
oAuthViewModel = oAuthViewModel,
resources = resources,
)
},
modifier = Modifier
.fillMaxSize()
.then(modifier),
)
}
@Composable
internal fun ContentView(
state: State,
onEvent: (Event) -> Unit,
oAuthViewModel: AccountOAuthContract.ViewModel,
resources: Resources,
modifier: Modifier = Modifier,
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(MainTheme.spacings.quadruple)
.then(modifier),
) {
if (state.configStep != AccountAutoDiscoveryContract.ConfigStep.EMAIL_ADDRESS) {
AutoDiscoveryResultView(
settings = state.autoDiscoverySettings,
onEditConfigurationClick = { onEvent(Event.OnEditConfigurationClicked) },
)
if (state.autoDiscoverySettings != null && state.autoDiscoverySettings.isTrusted.not()) {
AutoDiscoveryResultApprovalView(
approvalState = state.configurationApproved,
onApprovalChange = { onEvent(Event.ResultApprovalChanged(it)) },
)
}
Spacer(modifier = Modifier.height(MainTheme.spacings.double))
}
EmailAddressInput(
emailAddress = state.emailAddress.value,
errorMessage = state.emailAddress.error?.toResourceString(resources),
onEmailAddressChange = { onEvent(Event.EmailAddressChanged(it)) },
contentPadding = PaddingValues(),
)
if (state.configStep == AccountAutoDiscoveryContract.ConfigStep.PASSWORD) {
Spacer(modifier = Modifier.height(MainTheme.spacings.double))
PasswordInput(
password = state.password.value,
errorMessage = state.password.error?.toResourceString(resources),
onPasswordChange = { onEvent(Event.PasswordChanged(it)) },
contentPadding = PaddingValues(),
)
} else if (state.configStep == AccountAutoDiscoveryContract.ConfigStep.OAUTH) {
val isAutoDiscoverySettingsTrusted = state.autoDiscoverySettings?.isTrusted ?: false
val isConfigurationApproved = state.configurationApproved.value ?: false
Spacer(modifier = Modifier.height(MainTheme.spacings.double))
AccountOAuthView(
onOAuthResult = { result -> onEvent(Event.OnOAuthResult(result)) },
viewModel = oAuthViewModel,
isEnabled = isAutoDiscoverySettingsTrusted || isConfigurationApproved,
)
}
}
}
@Composable
@PreviewDevices
internal fun AccountAutoDiscoveryContentK9Preview() {
@ -86,7 +188,6 @@ internal fun AccountAutoDiscoveryContentK9Preview() {
AccountAutoDiscoveryContent(
state = State(),
onEvent = {},
contentPadding = PaddingValues(),
oAuthViewModel = PreviewAccountOAuthViewModel(),
)
}
@ -99,7 +200,6 @@ internal fun AccountAutoDiscoveryContentThunderbirdPreview() {
AccountAutoDiscoveryContent(
state = State(),
onEvent = {},
contentPadding = PaddingValues(),
oAuthViewModel = PreviewAccountOAuthViewModel(),
)
}

View File

@ -3,19 +3,13 @@ package app.k9mail.feature.account.setup.ui.autodiscovery
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import app.k9mail.autodiscovery.api.AutoDiscoveryResult
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.core.ui.compose.theme.K9Theme
import app.k9mail.core.ui.compose.theme.ThunderbirdTheme
import app.k9mail.feature.account.common.ui.AppTitleTopHeader
import app.k9mail.feature.account.common.ui.WizardNavigationBar
import app.k9mail.feature.account.common.ui.WizardNavigationBarState
import app.k9mail.feature.account.common.ui.preview.PreviewAccountStateRepository
import app.k9mail.feature.account.oauth.ui.preview.PreviewAccountOAuthViewModel
import app.k9mail.feature.account.setup.R
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.AutoDiscoveryUiResult
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.Effect
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.Event
@ -39,28 +33,12 @@ internal fun AccountAutoDiscoveryScreen(
dispatch(Event.OnBackClicked)
}
Scaffold(
topBar = {
AppTitleTopHeader(
title = stringResource(id = R.string.account_setup_title),
)
},
bottomBar = {
WizardNavigationBar(
onNextClick = { dispatch(Event.OnNextClicked) },
onBackClick = { dispatch(Event.OnBackClicked) },
state = WizardNavigationBarState(showNext = state.value.isNextButtonVisible),
)
},
AccountAutoDiscoveryContent(
state = state.value,
onEvent = { dispatch(it) },
oAuthViewModel = viewModel.oAuthViewModel,
modifier = modifier,
) { innerPadding ->
AccountAutoDiscoveryContent(
state = state.value,
onEvent = { dispatch(it) },
oAuthViewModel = viewModel.oAuthViewModel,
contentPadding = innerPadding,
)
}
)
}
@Composable