Cleanup
This commit is contained in:
parent
0b881c3d47
commit
05e3256da4
28 changed files with 99 additions and 92 deletions
|
|
@ -33,9 +33,9 @@ import dagger.assisted.Assisted
|
|||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.anvilannotations.ContributesNode
|
||||
import io.element.android.features.login.impl.accountprovider.AccountProviderNode
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.features.login.impl.changeaccountprovider.ChangeAccountProviderNode
|
||||
import io.element.android.features.login.impl.changeaccountprovider.form.ChangeAccountProviderFormNode
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.changeserver.ChangeServerNode
|
||||
import io.element.android.features.login.impl.datasource.AccountProviderDataSource
|
||||
import io.element.android.features.login.impl.loginpassword.LoginPasswordNode
|
||||
|
|
@ -155,7 +155,7 @@ class LoginFlowNode @AssistedInject constructor(
|
|||
}
|
||||
NavTarget.ChangeAccountProvider -> {
|
||||
val callback = object : ChangeAccountProviderNode.Callback {
|
||||
override fun onAccountProviderItemClicked(data: AccountProviderItem) {
|
||||
override fun onAccountProviderClicked(data: AccountProvider) {
|
||||
accountProviderDataSource.userSelection(data)
|
||||
// Go back to the Account Provider screen
|
||||
backstack.singleTop(NavTarget.AccountProvider)
|
||||
|
|
@ -170,7 +170,7 @@ class LoginFlowNode @AssistedInject constructor(
|
|||
}
|
||||
NavTarget.ChangeAccountProviderForm -> {
|
||||
val callback = object : ChangeAccountProviderFormNode.Callback {
|
||||
override fun onAccountProviderItemClicked(data: AccountProviderItem) {
|
||||
override fun onAccountProviderClicked(data: AccountProvider) {
|
||||
accountProviderDataSource.userSelection(data)
|
||||
// Go back to the Account Provider screen
|
||||
backstack.singleTop(NavTarget.AccountProvider)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
|||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.features.login.impl.changeserver.ChangeServerError
|
||||
import io.element.android.features.login.impl.error.ChangeServerError
|
||||
import io.element.android.features.login.impl.datasource.AccountProviderDataSource
|
||||
import io.element.android.features.login.impl.util.LoginConstants
|
||||
import io.element.android.libraries.architecture.Async
|
||||
|
|
@ -35,7 +35,6 @@ import io.element.android.libraries.architecture.Presenter
|
|||
import io.element.android.libraries.architecture.execute
|
||||
import io.element.android.libraries.core.data.tryOrNull
|
||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
||||
import io.element.android.libraries.matrix.api.auth.MatrixHomeServerDetails
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import java.net.URL
|
||||
|
|
@ -59,13 +58,6 @@ class AccountProviderPresenter @AssistedInject constructor(
|
|||
override fun present(): AccountProviderState {
|
||||
val accountProvider by accountProviderDataSource.flow().collectAsState()
|
||||
val currentHomeServerDetails = authenticationService.getHomeserverDetails().collectAsState().value
|
||||
val getHomeServerDetailsAction: MutableState<Async<MatrixHomeServerDetails>> = remember {
|
||||
if (currentHomeServerDetails != null) {
|
||||
mutableStateOf(Async.Success(currentHomeServerDetails))
|
||||
} else {
|
||||
mutableStateOf(Async.Uninitialized)
|
||||
}
|
||||
}
|
||||
val localCoroutineScope = rememberCoroutineScope()
|
||||
|
||||
val homeserver = rememberSaveable {
|
||||
|
|
@ -85,8 +77,7 @@ class AccountProviderPresenter @AssistedInject constructor(
|
|||
}
|
||||
|
||||
return AccountProviderState(
|
||||
homeserver = accountProvider.title,
|
||||
isMatrix = accountProvider.isMatrixOrg,
|
||||
accountProvider = accountProvider,
|
||||
isAccountCreation = params.isAccountCreation,
|
||||
loginFlow = loginFlowAction.value,
|
||||
eventSink = ::handleEvents
|
||||
|
|
|
|||
|
|
@ -16,18 +16,18 @@
|
|||
|
||||
package io.element.android.features.login.impl.accountprovider
|
||||
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.matrix.api.auth.OidcDetails
|
||||
|
||||
// Do not use default value, so no member get forgotten in the presenters.
|
||||
data class AccountProviderState(
|
||||
val homeserver: String,
|
||||
val isMatrix: Boolean,
|
||||
val accountProvider: AccountProvider,
|
||||
val isAccountCreation: Boolean,
|
||||
val loginFlow: Async<LoginFlow>,
|
||||
val eventSink: (AccountProviderEvents) -> Unit
|
||||
) {
|
||||
val submitEnabled: Boolean get() = homeserver.isNotEmpty() && (loginFlow is Async.Uninitialized || loginFlow is Async.Loading)
|
||||
val submitEnabled: Boolean get() = accountProvider.title.isNotEmpty() && (loginFlow is Async.Uninitialized || loginFlow is Async.Loading)
|
||||
}
|
||||
|
||||
sealed interface LoginFlow {
|
||||
|
|
|
|||
|
|
@ -17,19 +17,19 @@
|
|||
package io.element.android.features.login.impl.accountprovider
|
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import io.element.android.features.login.impl.accountprovider.item.anAccountProvider
|
||||
import io.element.android.libraries.architecture.Async
|
||||
|
||||
open class AccountProviderStateProvider : PreviewParameterProvider<AccountProviderState> {
|
||||
override val values: Sequence<AccountProviderState>
|
||||
get() = sequenceOf(
|
||||
aAccountProviderState(),
|
||||
anAccountProviderState(),
|
||||
// Add other state here
|
||||
)
|
||||
}
|
||||
|
||||
fun aAccountProviderState() = AccountProviderState(
|
||||
homeserver = "matrix.org",
|
||||
isMatrix = true,
|
||||
fun anAccountProviderState() = AccountProviderState(
|
||||
accountProvider = anAccountProvider(),
|
||||
isAccountCreation = false,
|
||||
loginFlow = Async.Uninitialized,
|
||||
eventSink = {}
|
||||
|
|
|
|||
|
|
@ -30,14 +30,13 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import io.element.android.features.login.impl.R
|
||||
import io.element.android.features.login.impl.changeserver.ChangeServerError
|
||||
import io.element.android.features.login.impl.error.ChangeServerError
|
||||
import io.element.android.features.login.impl.changeserver.SlidingSyncNotSupportedDialog
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule
|
||||
import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule
|
||||
import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage
|
||||
import io.element.android.libraries.designsystem.components.async.AsyncFailure
|
||||
import io.element.android.libraries.designsystem.components.async.AsyncLoading
|
||||
import io.element.android.libraries.designsystem.components.button.ButtonWithProgress
|
||||
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||
|
|
@ -78,7 +77,7 @@ fun AccountProviderView(
|
|||
} else {
|
||||
R.string.screen_account_provider_signin_title
|
||||
},
|
||||
state.homeserver
|
||||
state.accountProvider.title
|
||||
),
|
||||
subTitle = stringResource(
|
||||
id = if (state.isAccountCreation) {
|
||||
|
|
@ -123,7 +122,7 @@ fun AccountProviderView(
|
|||
}
|
||||
)
|
||||
}
|
||||
is Async.Loading -> AsyncLoading()
|
||||
is Async.Loading -> Unit // The Continue button shows the loading state
|
||||
is Async.Success -> {
|
||||
when (val loginFlowState = state.loginFlow.state) {
|
||||
is LoginFlow.OidcFlow -> onOidcDetails(loginFlowState.oidcDetails)
|
||||
|
|
|
|||
|
|
@ -14,9 +14,9 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package io.element.android.features.login.impl.changeaccountprovider.item
|
||||
package io.element.android.features.login.impl.accountprovider.item
|
||||
|
||||
data class AccountProviderItem constructor(
|
||||
data class AccountProvider constructor(
|
||||
val title: String,
|
||||
val subtitle: String? = null,
|
||||
val isPublic: Boolean = false,
|
||||
|
|
@ -14,21 +14,21 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package io.element.android.features.login.impl.changeaccountprovider.item
|
||||
package io.element.android.features.login.impl.accountprovider.item
|
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
|
||||
open class ChangeAccountProviderItemProvider : PreviewParameterProvider<AccountProviderItem> {
|
||||
override val values: Sequence<AccountProviderItem>
|
||||
open class AccountProviderProvider : PreviewParameterProvider<AccountProvider> {
|
||||
override val values: Sequence<AccountProvider>
|
||||
get() = sequenceOf(
|
||||
aChangeAccountProviderItem(),
|
||||
aChangeAccountProviderItem().copy(subtitle = null),
|
||||
aChangeAccountProviderItem().copy(title = "Other", subtitle = null, isPublic = false, isMatrixOrg = false),
|
||||
anAccountProvider(),
|
||||
anAccountProvider().copy(subtitle = null),
|
||||
anAccountProvider().copy(title = "Other", subtitle = null, isPublic = false, isMatrixOrg = false),
|
||||
// Add other state here
|
||||
)
|
||||
}
|
||||
|
||||
fun aChangeAccountProviderItem() = AccountProviderItem(
|
||||
fun anAccountProvider() = AccountProvider(
|
||||
title = "matrix.org",
|
||||
subtitle = "Matrix.org is an open network for secure, decentralized communication.",
|
||||
isPublic = true,
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package io.element.android.features.login.impl.changeaccountprovider.item
|
||||
package io.element.android.features.login.impl.accountprovider.item
|
||||
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Column
|
||||
|
|
@ -48,8 +48,8 @@ import io.element.android.libraries.designsystem.theme.components.Text
|
|||
* https://www.figma.com/file/o9p34zmiuEpZRyvZXJZAYL/FTUE?type=design&node-id=604-60817
|
||||
*/
|
||||
@Composable
|
||||
fun ChangeAccountProviderItemView(
|
||||
item: AccountProviderItem,
|
||||
fun AccountProviderView(
|
||||
item: AccountProvider,
|
||||
modifier: Modifier = Modifier,
|
||||
onClick: () -> Unit,
|
||||
) {
|
||||
|
|
@ -115,17 +115,17 @@ fun ChangeAccountProviderItemView(
|
|||
|
||||
@Preview
|
||||
@Composable
|
||||
fun ChangeAccountProviderViewLightPreview(@PreviewParameter(ChangeAccountProviderItemProvider::class) item: AccountProviderItem) =
|
||||
fun AccountProviderViewLightPreview(@PreviewParameter(AccountProviderProvider::class) item: AccountProvider) =
|
||||
ElementPreviewLight { ContentToPreview(item) }
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun ChangeAccountProviderViewDarkPreview(@PreviewParameter(ChangeAccountProviderItemProvider::class) item: AccountProviderItem) =
|
||||
fun AccountProviderViewDarkPreview(@PreviewParameter(AccountProviderProvider::class) item: AccountProvider) =
|
||||
ElementPreviewDark { ContentToPreview(item) }
|
||||
|
||||
@Composable
|
||||
private fun ContentToPreview(item: AccountProviderItem) {
|
||||
ChangeAccountProviderItemView(
|
||||
private fun ContentToPreview(item: AccountProvider) {
|
||||
AccountProviderView(
|
||||
item = item,
|
||||
onClick = { }
|
||||
)
|
||||
|
|
@ -25,7 +25,7 @@ import com.bumble.appyx.core.plugin.plugins
|
|||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.anvilannotations.ContributesNode
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.libraries.di.AppScope
|
||||
|
||||
@ContributesNode(AppScope::class)
|
||||
|
|
@ -36,12 +36,12 @@ class ChangeAccountProviderNode @AssistedInject constructor(
|
|||
) : Node(buildContext, plugins = plugins) {
|
||||
|
||||
interface Callback : Plugin {
|
||||
fun onAccountProviderItemClicked(data: AccountProviderItem)
|
||||
fun onAccountProviderClicked(data: AccountProvider)
|
||||
fun onOtherClicked()
|
||||
}
|
||||
|
||||
private fun onAccountProviderItemClicked(data: AccountProviderItem) {
|
||||
plugins<Callback>().forEach { it.onAccountProviderItemClicked(data) }
|
||||
private fun onAccountProviderClicked(data: AccountProvider) {
|
||||
plugins<Callback>().forEach { it.onAccountProviderClicked(data) }
|
||||
}
|
||||
|
||||
private fun onOtherClicked() {
|
||||
|
|
@ -55,7 +55,7 @@ class ChangeAccountProviderNode @AssistedInject constructor(
|
|||
state = state,
|
||||
modifier = modifier,
|
||||
onBackPressed = ::navigateUp,
|
||||
onAccountProviderItemClicked = ::onAccountProviderItemClicked,
|
||||
onAccountProviderClicked = ::onAccountProviderClicked,
|
||||
onOtherProviderClicked = ::onOtherClicked,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
package io.element.android.features.login.impl.changeaccountprovider
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import javax.inject.Inject
|
||||
|
||||
|
|
@ -28,8 +28,8 @@ class ChangeAccountProviderPresenter @Inject constructor(
|
|||
override fun present(): ChangeAccountProviderState {
|
||||
return ChangeAccountProviderState(
|
||||
// Just matrix.org by default for now
|
||||
accountProviderItems = listOf(
|
||||
AccountProviderItem(
|
||||
accountProviders = listOf(
|
||||
AccountProvider(
|
||||
title = "matrix.org",
|
||||
subtitle = null,
|
||||
isPublic = true,
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
package io.element.android.features.login.impl.changeaccountprovider
|
||||
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
|
||||
// Do not use default value, so no member get forgotten in the presenters.
|
||||
data class ChangeAccountProviderState constructor(
|
||||
val accountProviderItems: List<AccountProviderItem>,
|
||||
val accountProviders: List<AccountProvider>,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
package io.element.android.features.login.impl.changeaccountprovider
|
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.accountprovider.item.anAccountProvider
|
||||
|
||||
open class ChangeAccountProviderStateProvider : PreviewParameterProvider<ChangeAccountProviderState> {
|
||||
override val values: Sequence<ChangeAccountProviderState>
|
||||
|
|
@ -28,12 +28,7 @@ open class ChangeAccountProviderStateProvider : PreviewParameterProvider<ChangeA
|
|||
}
|
||||
|
||||
fun aChangeAccountProviderState() = ChangeAccountProviderState(
|
||||
accountProviderItems = listOf(
|
||||
AccountProviderItem(
|
||||
title = "matrix.org",
|
||||
subtitle = null,
|
||||
isPublic = true,
|
||||
isMatrixOrg = true,
|
||||
)
|
||||
accountProviders = listOf(
|
||||
anAccountProvider()
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import io.element.android.features.login.impl.R
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.ChangeAccountProviderItemView
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProviderView
|
||||
import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule
|
||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
|
||||
|
|
@ -57,7 +57,7 @@ fun ChangeAccountProviderView(
|
|||
state: ChangeAccountProviderState,
|
||||
modifier: Modifier = Modifier,
|
||||
onBackPressed: () -> Unit,
|
||||
onAccountProviderItemClicked: (AccountProviderItem) -> Unit = {},
|
||||
onAccountProviderClicked: (AccountProvider) -> Unit = {},
|
||||
onOtherProviderClicked: () -> Unit = {},
|
||||
) {
|
||||
val scrollState = rememberScrollState()
|
||||
|
|
@ -92,7 +92,7 @@ fun ChangeAccountProviderView(
|
|||
subTitle = stringResource(id = R.string.screen_change_account_provider_subtitle),
|
||||
)
|
||||
|
||||
state.accountProviderItems.forEach { item ->
|
||||
state.accountProviders.forEach { item ->
|
||||
val alteredItem = if (item.isMatrixOrg) {
|
||||
// Set the subtitle from the resource
|
||||
item.copy(
|
||||
|
|
@ -101,16 +101,16 @@ fun ChangeAccountProviderView(
|
|||
} else {
|
||||
item
|
||||
}
|
||||
ChangeAccountProviderItemView(
|
||||
AccountProviderView(
|
||||
item = alteredItem,
|
||||
onClick = {
|
||||
onAccountProviderItemClicked(alteredItem)
|
||||
onAccountProviderClicked(alteredItem)
|
||||
}
|
||||
)
|
||||
}
|
||||
// Other
|
||||
ChangeAccountProviderItemView(
|
||||
item = AccountProviderItem(
|
||||
AccountProviderView(
|
||||
item = AccountProvider(
|
||||
title = stringResource(id = R.string.screen_change_account_provider_other),
|
||||
),
|
||||
onClick = onOtherProviderClicked
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import com.bumble.appyx.core.plugin.plugins
|
|||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.anvilannotations.ContributesNode
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.libraries.di.AppScope
|
||||
|
||||
@ContributesNode(AppScope::class)
|
||||
|
|
@ -36,11 +36,11 @@ class ChangeAccountProviderFormNode @AssistedInject constructor(
|
|||
) : Node(buildContext, plugins = plugins) {
|
||||
|
||||
interface Callback : Plugin {
|
||||
fun onAccountProviderItemClicked(data: AccountProviderItem)
|
||||
fun onAccountProviderClicked(data: AccountProvider)
|
||||
}
|
||||
|
||||
private fun onAccountProviderItemClicked(data: AccountProviderItem) {
|
||||
plugins<Callback>().forEach { it.onAccountProviderItemClicked(data) }
|
||||
private fun onAccountProviderClicked(data: AccountProvider) {
|
||||
plugins<Callback>().forEach { it.onAccountProviderClicked(data) }
|
||||
}
|
||||
|
||||
@Composable
|
||||
|
|
@ -50,7 +50,7 @@ class ChangeAccountProviderFormNode @AssistedInject constructor(
|
|||
state = state,
|
||||
modifier = modifier,
|
||||
onBackPressed = ::navigateUp,
|
||||
onProviderClicked = ::onAccountProviderItemClicked
|
||||
onAccountProviderClicked = ::onAccountProviderClicked
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,8 +50,8 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import io.element.android.features.login.impl.R
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.ChangeAccountProviderItemView
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProviderView
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule
|
||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
||||
|
|
@ -72,7 +72,7 @@ fun ChangeAccountProviderFormView(
|
|||
state: ChangeAccountProviderFormState,
|
||||
modifier: Modifier = Modifier,
|
||||
onBackPressed: () -> Unit,
|
||||
onProviderClicked: (AccountProviderItem) -> Unit = {},
|
||||
onAccountProviderClicked: (AccountProvider) -> Unit = {},
|
||||
) {
|
||||
val eventSink = state.eventSink
|
||||
val scrollState = rememberScrollState()
|
||||
|
|
@ -161,16 +161,16 @@ fun ChangeAccountProviderFormView(
|
|||
is Async.Success -> {
|
||||
state.userInputResult.state.forEach { homeserverData ->
|
||||
val isMatrixOrg = homeserverData.homeserverUrl == "https://matrix.org"
|
||||
val item = AccountProviderItem(
|
||||
val item = AccountProvider(
|
||||
title = homeserverData.homeserverUrl.removePrefix("http://").removePrefix("https://"),
|
||||
subtitle = if (isMatrixOrg) stringResource(id = R.string.screen_change_account_provider_matrix_org_subtitle) else null,
|
||||
isPublic = isMatrixOrg, // There is no need to know for other servers right now
|
||||
isMatrixOrg = isMatrixOrg,
|
||||
)
|
||||
ChangeAccountProviderItemView(
|
||||
AccountProviderView(
|
||||
item = item,
|
||||
onClick = {
|
||||
onProviderClicked(item)
|
||||
onAccountProviderClicked(item)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@ import io.element.android.features.login.impl.util.LoginConstants
|
|||
import io.element.android.libraries.core.data.tryOrNull
|
||||
import io.element.android.libraries.di.AppScope
|
||||
|
||||
/**
|
||||
* Not used anymore.
|
||||
*/
|
||||
@ContributesNode(AppScope::class)
|
||||
class ChangeServerNode @AssistedInject constructor(
|
||||
@Assisted buildContext: BuildContext,
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import androidx.compose.runtime.mutableStateOf
|
|||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import io.element.android.features.login.impl.error.ChangeServerError
|
||||
import io.element.android.features.login.impl.util.LoginConstants
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ package io.element.android.features.login.impl.changeserver
|
|||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import io.element.android.features.login.impl.R
|
||||
import io.element.android.features.login.impl.error.ChangeServerError
|
||||
import io.element.android.libraries.architecture.Async
|
||||
|
||||
open class ChangeServerStateProvider : PreviewParameterProvider<ChangeServerState> {
|
||||
|
|
@ -30,7 +31,8 @@ open class ChangeServerStateProvider : PreviewParameterProvider<ChangeServerStat
|
|||
homeserver = "invalid.org",
|
||||
changeServerAction = Async.Failure(ChangeServerError.InlineErrorMessage(R.string.screen_change_server_error_invalid_homeserver))
|
||||
),
|
||||
aChangeServerState().copy(homeserver = "invalid.org", changeServerAction = Async.Failure(ChangeServerError.SlidingSyncAlert)),
|
||||
aChangeServerState().copy(homeserver = "invalid.org", changeServerAction = Async.Failure(
|
||||
ChangeServerError.SlidingSyncAlert)),
|
||||
aChangeServerState().copy(homeserver = "matrix.org", changeServerAction = Async.Success(Unit)),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import io.element.android.features.login.impl.R
|
||||
import io.element.android.features.login.impl.error.ChangeServerError
|
||||
import io.element.android.features.login.impl.util.LoginConstants
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.designsystem.ElementTextStyles
|
||||
|
|
|
|||
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
package io.element.android.features.login.impl.datasource
|
||||
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.util.defaultAccountProviderItem
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.features.login.impl.util.defaultAccountProvider
|
||||
import io.element.android.libraries.di.AppScope
|
||||
import io.element.android.libraries.di.SingleIn
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
|
|
@ -28,15 +28,15 @@ import javax.inject.Inject
|
|||
@SingleIn(AppScope::class)
|
||||
class AccountProviderDataSource @Inject constructor(
|
||||
) {
|
||||
private val accountProvider: MutableStateFlow<AccountProviderItem> = MutableStateFlow(
|
||||
defaultAccountProviderItem
|
||||
private val accountProvider: MutableStateFlow<AccountProvider> = MutableStateFlow(
|
||||
defaultAccountProvider
|
||||
)
|
||||
|
||||
fun flow(): StateFlow<AccountProviderItem> {
|
||||
fun flow(): StateFlow<AccountProvider> {
|
||||
return accountProvider.asStateFlow()
|
||||
}
|
||||
|
||||
fun userSelection(data: AccountProviderItem) {
|
||||
fun userSelection(data: AccountProvider) {
|
||||
accountProvider.tryEmit(data)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package io.element.android.features.login.impl.changeserver
|
||||
package io.element.android.features.login.impl.error
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.runtime.Composable
|
||||
|
|
@ -16,12 +16,14 @@
|
|||
|
||||
package io.element.android.features.login.impl.error
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
import io.element.android.features.login.impl.R
|
||||
import io.element.android.libraries.matrix.api.auth.AuthErrorCode
|
||||
import io.element.android.libraries.matrix.api.auth.AuthenticationException
|
||||
import io.element.android.libraries.matrix.api.auth.errorCode
|
||||
import io.element.android.libraries.ui.strings.R.string as StringR
|
||||
|
||||
@StringRes
|
||||
fun loginError(
|
||||
throwable: Throwable
|
||||
): Int {
|
||||
|
|
|
|||
|
|
@ -18,10 +18,13 @@ package io.element.android.features.login.impl.loginpassword
|
|||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.MutableState
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import io.element.android.features.login.impl.datasource.AccountProviderDataSource
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
||||
|
|
@ -32,6 +35,7 @@ import javax.inject.Inject
|
|||
|
||||
class LoginPasswordPresenter @Inject constructor(
|
||||
private val authenticationService: MatrixAuthenticationService,
|
||||
private val accountProviderDataSource: AccountProviderDataSource,
|
||||
) : Presenter<LoginPasswordState> {
|
||||
|
||||
@Composable
|
||||
|
|
@ -44,6 +48,7 @@ class LoginPasswordPresenter @Inject constructor(
|
|||
val formState = rememberSaveable {
|
||||
mutableStateOf(LoginFormState.Default)
|
||||
}
|
||||
val accountProvider by accountProviderDataSource.flow().collectAsState()
|
||||
|
||||
fun handleEvents(event: LoginPasswordEvents) {
|
||||
when (event) {
|
||||
|
|
@ -61,6 +66,7 @@ class LoginPasswordPresenter @Inject constructor(
|
|||
}
|
||||
|
||||
return LoginPasswordState(
|
||||
accountProvider = accountProvider,
|
||||
formState = formState.value,
|
||||
loginAction = loginAction.value,
|
||||
eventSink = ::handleEvents
|
||||
|
|
|
|||
|
|
@ -17,11 +17,13 @@
|
|||
package io.element.android.features.login.impl.loginpassword
|
||||
|
||||
import android.os.Parcelable
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
import io.element.android.libraries.architecture.Async
|
||||
import io.element.android.libraries.matrix.api.core.SessionId
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
data class LoginPasswordState(
|
||||
val accountProvider: AccountProvider,
|
||||
val formState: LoginFormState,
|
||||
val loginAction: Async<SessionId>,
|
||||
val eventSink: (LoginPasswordEvents) -> Unit
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
package io.element.android.features.login.impl.loginpassword
|
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import io.element.android.features.login.impl.accountprovider.item.anAccountProvider
|
||||
import io.element.android.libraries.architecture.Async
|
||||
|
||||
open class LoginPasswordStateProvider : PreviewParameterProvider<LoginPasswordState> {
|
||||
|
|
@ -31,6 +32,7 @@ open class LoginPasswordStateProvider : PreviewParameterProvider<LoginPasswordSt
|
|||
}
|
||||
|
||||
fun aLoginPasswordState() = LoginPasswordState(
|
||||
accountProvider = anAccountProvider(),
|
||||
formState = LoginFormState.Default,
|
||||
loginAction = Async.Uninitialized,
|
||||
eventSink = {}
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ fun LoginPasswordView(
|
|||
}
|
||||
|
||||
Scaffold(
|
||||
modifier = modifier,
|
||||
topBar = {
|
||||
TopAppBar(
|
||||
title = {},
|
||||
|
|
@ -108,7 +109,7 @@ fun LoginPasswordView(
|
|||
}
|
||||
) { padding ->
|
||||
Box(
|
||||
modifier = modifier
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.imePadding()
|
||||
.padding(padding)
|
||||
|
|
@ -121,14 +122,13 @@ fun LoginPasswordView(
|
|||
.verticalScroll(state = scrollState)
|
||||
.padding(horizontal = 16.dp),
|
||||
) {
|
||||
Spacer(Modifier.height(16.dp))
|
||||
// Title
|
||||
IconTitleSubtitleMolecule(
|
||||
modifier = Modifier.padding(top = 60.dp),
|
||||
modifier = Modifier.padding(top = 20.dp),
|
||||
iconImageVector = Icons.Filled.AccountCircle,
|
||||
title = stringResource(
|
||||
id = R.string.screen_account_provider_signin_title,
|
||||
"state.homeserver" // TODO
|
||||
state.accountProvider.title
|
||||
),
|
||||
subTitle = stringResource(id = R.string.screen_login_form_header)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -28,6 +28,9 @@ import io.element.android.anvilannotations.ContributesNode
|
|||
import io.element.android.libraries.di.AppScope
|
||||
import io.element.android.libraries.matrix.api.auth.OidcDetails
|
||||
|
||||
/**
|
||||
* Not used anymore.
|
||||
*/
|
||||
@ContributesNode(AppScope::class)
|
||||
class LoginRootNode @AssistedInject constructor(
|
||||
@Assisted buildContext: BuildContext,
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
package io.element.android.features.login.impl.util
|
||||
|
||||
import io.element.android.features.login.impl.changeaccountprovider.item.AccountProviderItem
|
||||
import io.element.android.features.login.impl.accountprovider.item.AccountProvider
|
||||
|
||||
object LoginConstants {
|
||||
const val MATRIX_ORG_URL = "matrix.org"
|
||||
|
|
@ -25,7 +25,7 @@ object LoginConstants {
|
|||
const val SLIDING_SYNC_READ_MORE_URL = "https://github.com/matrix-org/sliding-sync/blob/main/docs/Landing.md"
|
||||
}
|
||||
|
||||
val defaultAccountProviderItem = AccountProviderItem(
|
||||
val defaultAccountProvider = AccountProvider(
|
||||
title = LoginConstants.DEFAULT_HOMESERVER_URL,
|
||||
subtitle = null,
|
||||
isPublic = LoginConstants.DEFAULT_HOMESERVER_URL == LoginConstants.MATRIX_ORG_URL,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue