From 49f7ce3554a4cc99947d24d14612beb3016102e4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 21 Nov 2019 22:46:37 +0100 Subject: [PATCH] Login screens: better API --- .../android/api/auth/AuthenticationService.kt | 12 ++-- .../auth/DefaultAuthenticationService.kt | 55 +++++++++++++------ .../riotx/features/login/LoginViewModel.kt | 39 ++++--------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/AuthenticationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/AuthenticationService.kt index 5083172124..752ef6390f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/AuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/AuthenticationService.kt @@ -32,20 +32,20 @@ import im.vector.matrix.android.internal.auth.data.LoginFlowResponse interface AuthenticationService { /** - * Request the supported login flows for this homeserver + * Request the supported login flows for this homeserver. + * This is the first method to call to be able to get a wizard to login or the create an account */ fun getLoginFlow(homeServerConnectionConfig: HomeServerConnectionConfig, callback: MatrixCallback): Cancelable /** - * Return an LoginWizard - * @param homeServerConnectionConfig this param is used to request the Homeserver + * Return a LoginWizard, to login to the homeserver */ - fun createLoginWizard(homeServerConnectionConfig: HomeServerConnectionConfig): LoginWizard + fun createLoginWizard(): LoginWizard /** - * Return a RegistrationWizard, to create an matrix account on a homeserver + * Return a RegistrationWizard, to create an matrix account on the homeserver */ - fun getOrCreateRegistrationWizard(homeServerConnectionConfig: HomeServerConnectionConfig): RegistrationWizard + fun getOrCreateRegistrationWizard(): RegistrationWizard /** * Check if there is an authenticated [Session]. diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt index 8229336e91..60b51d1858 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt @@ -50,6 +50,8 @@ internal class DefaultAuthenticationService @Inject constructor(@Unauthenticated private val sessionManager: SessionManager ) : AuthenticationService { + private var currentHomeServerConnectionConfig: HomeServerConnectionConfig? = null + override fun hasAuthenticatedSessions(): Boolean { return sessionParamsStore.getLast() != null } @@ -66,11 +68,22 @@ internal class DefaultAuthenticationService @Inject constructor(@Unauthenticated } override fun getLoginFlow(homeServerConnectionConfig: HomeServerConnectionConfig, callback: MatrixCallback): Cancelable { + currentHomeServerConnectionConfig = null + val job = GlobalScope.launch(coroutineDispatchers.main) { val result = runCatching { getLoginFlowInternal(homeServerConnectionConfig) } - result.foldToCallback(callback) + result.fold( + { + // The homeserver exists, keep the config + currentHomeServerConnectionConfig = homeServerConnectionConfig + callback.onSuccess(it) + }, + { + callback.onFailure(it) + } + ) } return CancelableCoroutine(job) } @@ -83,25 +96,31 @@ internal class DefaultAuthenticationService @Inject constructor(@Unauthenticated } } - override fun getOrCreateRegistrationWizard(homeServerConnectionConfig: HomeServerConnectionConfig): RegistrationWizard { - // TODO Persist the wizard? - return DefaultRegistrationWizard(homeServerConnectionConfig, - okHttpClient, - retrofitFactory, - coroutineDispatchers, - sessionParamsStore, - sessionManager) + override fun getOrCreateRegistrationWizard(): RegistrationWizard { + currentHomeServerConnectionConfig?.let { + // TODO Persist the wizard? + return DefaultRegistrationWizard( + it, + okHttpClient, + retrofitFactory, + coroutineDispatchers, + sessionParamsStore, + sessionManager + ) + } ?: error("Please call getLoginFlow() with success first") } - override fun createLoginWizard(homeServerConnectionConfig: HomeServerConnectionConfig): LoginWizard { - return DefaultLoginWizard( - homeServerConnectionConfig, - coroutineDispatchers, - sessionParamsStore, - sessionManager, - retrofitFactory, - okHttpClient - ) + override fun createLoginWizard(): LoginWizard { + currentHomeServerConnectionConfig?.let { + return DefaultLoginWizard( + it, + coroutineDispatchers, + sessionParamsStore, + sessionManager, + retrofitFactory, + okHttpClient + ) + } ?: error("Please call getLoginFlow() with success first") } override fun createSessionFromSso(homeServerConnectionConfig: HomeServerConnectionConfig, diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt index 8e2ed99c29..9b38a0f61b 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt @@ -21,9 +21,9 @@ import com.airbnb.mvrx.* import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.MatrixCallback -import im.vector.matrix.android.api.auth.login.LoginWizard import im.vector.matrix.android.api.auth.AuthenticationService import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig +import im.vector.matrix.android.api.auth.login.LoginWizard import im.vector.matrix.android.api.auth.registration.FlowResult import im.vector.matrix.android.api.auth.registration.RegistrationResult import im.vector.matrix.android.api.auth.registration.RegistrationWizard @@ -421,38 +421,19 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi } private fun startRegistrationFlow() { - val homeServerConnectionConfigFinal = homeServerConnectionConfig - - if (homeServerConnectionConfigFinal == null) { - // Notify the user - _viewEvents.post(LoginViewEvents.RegistrationError(Throwable("Bad configuration"))) - setState { - copy( - asyncRegistration = Uninitialized - ) - } - } else { - setState { - copy( - asyncRegistration = Loading() - ) - } - - registrationWizard = authenticationService.getOrCreateRegistrationWizard(homeServerConnectionConfigFinal) - - currentTask = registrationWizard?.getRegistrationFlow(registrationCallback) + setState { + copy( + asyncRegistration = Loading() + ) } + + registrationWizard = authenticationService.getOrCreateRegistrationWizard() + + currentTask = registrationWizard?.getRegistrationFlow(registrationCallback) } private fun startAuthenticationFlow() { - val homeServerConnectionConfigFinal = homeServerConnectionConfig - - if (homeServerConnectionConfigFinal == null) { - // Notify the user - _viewEvents.post(LoginViewEvents.RegistrationError(Throwable("Bad configuration"))) - } else { - loginWizard = authenticationService.createLoginWizard(homeServerConnectionConfigFinal) - } + loginWizard = authenticationService.createLoginWizard() } private fun onFlowResponse(flowResult: FlowResult) {