mirror of
https://github.com/thunderbird/thunderbird-android.git
synced 2024-09-19 19:52:14 +02:00
Change auto discovery layout to support small screens
This commit is contained in:
parent
9871c40dde
commit
6d791153aa
9
config/detekt/detekt-baseline-feature-account-setup.xml
Normal file
9
config/detekt/detekt-baseline-feature-account-setup.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" ?>
|
||||
<SmellBaseline>
|
||||
<ManuallySuppressedIssues></ManuallySuppressedIssues>
|
||||
<CurrentIssues>
|
||||
<ID>ViewModelForwarding:AccountAutoDiscoveryContent.kt$AccountOAuthView( onOAuthResult = { result -> 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>
|
@ -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(),
|
||||
)
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user