diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt index 7b51395bf5..f0d0c61d58 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt @@ -20,6 +20,10 @@ import im.vector.matrix.android.internal.auth.data.LoginFlowResponse // Either a LoginFlowResponse, or an error if the homeserver is outdated sealed class LoginFlowResult { - data class Success(val loginFlowResponse: LoginFlowResponse) : LoginFlowResult() + data class Success( + val loginFlowResponse: LoginFlowResponse, + val isLoginAndRegistrationSupported: Boolean + ) : LoginFlowResult() + object OutdatedHomeserver : LoginFlowResult() } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/Versions.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/Versions.kt index 52ceffa9f6..498d7e7c06 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/Versions.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/Versions.kt @@ -47,13 +47,13 @@ data class Versions( ) // MatrixClientServerAPIVersion -private const val r0_0_1 = "r0_0_1" -private const val r0_1_0 = "r0_1_0" -private const val r0_2_0 = "r0_2_0" -private const val r0_3_0 = "r0_3_0" -private const val r0_4_0 = "r0_4_0" -private const val r0_5_0 = "r0_5_0" -private const val r0_6_0 = "r0_6_0" +private const val r0_0_1 = "r0.0.1" +private const val r0_1_0 = "r0.1.0" +private const val r0_2_0 = "r0.2.0" +private const val r0_3_0 = "r0.3.0" +private const val r0_4_0 = "r0.4.0" +private const val r0_5_0 = "r0.5.0" +private const val r0_6_0 = "r0.6.0" // MatrixVersionsFeature private const val FEATURE_LAZY_LOAD_MEMBERS = "m.lazy_load_members" @@ -67,7 +67,13 @@ private const val FEATURE_SEPARATE_ADD_AND_BIND = "m.separate_add_and_bind" */ fun Versions.isSupportedBySdk(): Boolean { return supportLazyLoadMembers() - && !doesServerRequireIdentityServerParam() +} + +/** + * Return true if the SDK supports this homeserver version for login and registration + */ +fun Versions.isLoginAndRegistrationSupportedBySdk(): Boolean { + return !doesServerRequireIdentityServerParam() && doesServerAcceptIdentityAccessToken() && doesServerSeparatesAddAndBind() } 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 3a28f5238e..e5f0b29035 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 @@ -102,7 +102,7 @@ internal class DefaultAuthenticationService @Inject constructor(@Unauthenticated val loginFlowResponse = executeRequest { apiCall = authAPI.getLoginFlows() } - LoginFlowResult.Success(loginFlowResponse) + LoginFlowResult.Success(loginFlowResponse, versions.isLoginAndRegistrationSupportedBySdk()) } else { // Not supported LoginFlowResult.OutdatedHomeserver 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 9eddf4dea4..5e4421b90d 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 @@ -545,24 +545,32 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi else -> LoginMode.Unsupported(data.loginFlowResponse.flows.mapNotNull { it.type }.toList()) } - setState { - copy( - asyncHomeServerLoginFlowRequest = Success(loginMode) - ) + if (loginMode == LoginMode.Password && !data.isLoginAndRegistrationSupported) { + notSupported() + } else { + setState { + copy( + asyncHomeServerLoginFlowRequest = Success(loginMode) + ) + } } } is LoginFlowResult.OutdatedHomeserver -> { - // Notify the UI - _viewEvents.post(LoginViewEvents.OutdatedHomeserver) - - setState { - copy( - asyncHomeServerLoginFlowRequest = Uninitialized - ) - } + notSupported() } } } + + private fun notSupported() { + // Notify the UI + _viewEvents.post(LoginViewEvents.OutdatedHomeserver) + + setState { + copy( + asyncHomeServerLoginFlowRequest = Uninitialized + ) + } + } }) } }