diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt index 8f0564cf33..67a28d1569 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt @@ -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) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderPresenter.kt index b20a69fcae..9302ed7a48 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderPresenter.kt @@ -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> = 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 diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderState.kt index fd6a7914fb..625ef0070d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderState.kt @@ -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, 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 { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderStateProvider.kt index 9d68942dae..56584c1935 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderStateProvider.kt @@ -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 { override val values: Sequence 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 = {} diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderView.kt index 3548504802..6c8b1df60e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/AccountProviderView.kt @@ -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) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/AccountProviderItem.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProvider.kt similarity index 86% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/AccountProviderItem.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProvider.kt index 22c8079c48..6f8adff403 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/AccountProviderItem.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProvider.kt @@ -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, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/ChangeAccountProviderItemProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProviderProvider.kt similarity index 64% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/ChangeAccountProviderItemProvider.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProviderProvider.kt index 523b4143d3..c931c3e801 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/ChangeAccountProviderItemProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProviderProvider.kt @@ -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 { - override val values: Sequence +open class AccountProviderProvider : PreviewParameterProvider { + override val values: Sequence 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, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/ChangeAccountProviderItemView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProviderView.kt similarity index 90% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/ChangeAccountProviderItemView.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProviderView.kt index 867666e59c..eb2f67947e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/item/ChangeAccountProviderItemView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/accountprovider/item/AccountProviderView.kt @@ -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 = { } ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderNode.kt index e54d4347d2..aafaee818d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderNode.kt @@ -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().forEach { it.onAccountProviderItemClicked(data) } + private fun onAccountProviderClicked(data: AccountProvider) { + plugins().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, ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderPresenter.kt index 8749fbec06..055541ca09 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderPresenter.kt @@ -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, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderState.kt index 62c756ad07..89a286518e 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderState.kt @@ -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, + val accountProviders: List, ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderStateProvider.kt index 7707c66945..627f11c742 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/ChangeAccountProviderStateProvider.kt @@ -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 { override val values: Sequence @@ -28,12 +28,7 @@ open class ChangeAccountProviderStateProvider : PreviewParameterProvider 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 diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormNode.kt index 28e48f7263..8786497e60 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormNode.kt @@ -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().forEach { it.onAccountProviderItemClicked(data) } + private fun onAccountProviderClicked(data: AccountProvider) { + plugins().forEach { it.onAccountProviderClicked(data) } } @Composable @@ -50,7 +50,7 @@ class ChangeAccountProviderFormNode @AssistedInject constructor( state = state, modifier = modifier, onBackPressed = ::navigateUp, - onProviderClicked = ::onAccountProviderItemClicked + onAccountProviderClicked = ::onAccountProviderClicked ) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormView.kt index 54ddd5f10e..9e00d9c47d 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeaccountprovider/form/ChangeAccountProviderFormView.kt @@ -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) } ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerNode.kt index 11952ce5a8..5ac13ed409 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerNode.kt @@ -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, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt index f2e688812c..81a19e5021 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt @@ -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 diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt index 3e6eeef05a..9e938ce15b 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerStateProvider.kt @@ -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 { @@ -30,7 +31,8 @@ open class ChangeServerStateProvider : PreviewParameterProvider = MutableStateFlow( - defaultAccountProviderItem + private val accountProvider: MutableStateFlow = MutableStateFlow( + defaultAccountProvider ) - fun flow(): StateFlow { + fun flow(): StateFlow { return accountProvider.asStateFlow() } - fun userSelection(data: AccountProviderItem) { + fun userSelection(data: AccountProvider) { accountProvider.tryEmit(data) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerError.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt similarity index 95% rename from features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerError.kt rename to features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt index 954f4f10dc..9976089f52 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerError.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt @@ -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 diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt index 68b0a70db4..86820645ae 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt @@ -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 { diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordPresenter.kt index af495eb106..96f749a89c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordPresenter.kt @@ -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 { @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 diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordState.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordState.kt index eac406a1c4..07bb7d1c51 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordState.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordState.kt @@ -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, val eventSink: (LoginPasswordEvents) -> Unit diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordStateProvider.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordStateProvider.kt index deb7e86acc..f53cfb168a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordStateProvider.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/loginpassword/LoginPasswordStateProvider.kt @@ -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 { @@ -31,6 +32,7 @@ open class LoginPasswordStateProvider : PreviewParameterProvider 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) ) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootNode.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootNode.kt index 787f5d0b48..1de7477555 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootNode.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/root/LoginRootNode.kt @@ -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, diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/util/LoginConstants.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/util/LoginConstants.kt index 06ffcb94f4..10f69c3d1a 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/util/LoginConstants.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/util/LoginConstants.kt @@ -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,