Fix 'unverified session' flow displayed when creating account (#4467)
* Fix 'unverified session' after creating an account: when creating an account, wait until the session is verified before marking the authentication flow as completed.
This commit is contained in:
parent
bb97015e59
commit
e1309b1705
2 changed files with 15 additions and 0 deletions
|
|
@ -19,16 +19,22 @@ import dagger.assisted.AssistedInject
|
||||||
import io.element.android.features.login.impl.DefaultLoginUserStory
|
import io.element.android.features.login.impl.DefaultLoginUserStory
|
||||||
import io.element.android.libraries.architecture.AsyncAction
|
import io.element.android.libraries.architecture.AsyncAction
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
|
import io.element.android.libraries.core.data.tryOrNull
|
||||||
import io.element.android.libraries.core.extensions.flatMap
|
import io.element.android.libraries.core.extensions.flatMap
|
||||||
import io.element.android.libraries.core.meta.BuildMeta
|
import io.element.android.libraries.core.meta.BuildMeta
|
||||||
|
import io.element.android.libraries.matrix.api.MatrixClientProvider
|
||||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
||||||
import io.element.android.libraries.matrix.api.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withTimeout
|
||||||
|
import kotlin.time.Duration.Companion.seconds
|
||||||
|
|
||||||
class CreateAccountPresenter @AssistedInject constructor(
|
class CreateAccountPresenter @AssistedInject constructor(
|
||||||
@Assisted private val url: String,
|
@Assisted private val url: String,
|
||||||
private val authenticationService: MatrixAuthenticationService,
|
private val authenticationService: MatrixAuthenticationService,
|
||||||
|
private val clientProvider: MatrixClientProvider,
|
||||||
private val defaultLoginUserStory: DefaultLoginUserStory,
|
private val defaultLoginUserStory: DefaultLoginUserStory,
|
||||||
private val messageParser: MessageParser,
|
private val messageParser: MessageParser,
|
||||||
private val buildMeta: BuildMeta,
|
private val buildMeta: BuildMeta,
|
||||||
|
|
@ -73,6 +79,12 @@ class CreateAccountPresenter @AssistedInject constructor(
|
||||||
}.flatMap { externalSession ->
|
}.flatMap { externalSession ->
|
||||||
authenticationService.importCreatedSession(externalSession)
|
authenticationService.importCreatedSession(externalSession)
|
||||||
}.onSuccess { sessionId ->
|
}.onSuccess { sessionId ->
|
||||||
|
tryOrNull {
|
||||||
|
// Wait until the session is verified
|
||||||
|
val client = clientProvider.getOrRestore(sessionId).getOrThrow()
|
||||||
|
val sessionVerificationService = client.sessionVerificationService()
|
||||||
|
withTimeout(10.seconds) { sessionVerificationService.sessionVerifiedStatus.first { it.isVerified() } }
|
||||||
|
}
|
||||||
// We will not navigate to the WaitList screen, so the login user story is done
|
// We will not navigate to the WaitList screen, so the login user story is done
|
||||||
defaultLoginUserStory.setLoginFlowIsDone(true)
|
defaultLoginUserStory.setLoginFlowIsDone(true)
|
||||||
loggedInState.value = AsyncAction.Success(sessionId)
|
loggedInState.value = AsyncAction.Success(sessionId)
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
|
||||||
import io.element.android.libraries.matrix.api.auth.external.ExternalSession
|
import io.element.android.libraries.matrix.api.auth.external.ExternalSession
|
||||||
import io.element.android.libraries.matrix.test.AN_EXCEPTION
|
import io.element.android.libraries.matrix.test.AN_EXCEPTION
|
||||||
import io.element.android.libraries.matrix.test.A_SESSION_ID
|
import io.element.android.libraries.matrix.test.A_SESSION_ID
|
||||||
|
import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
|
||||||
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
|
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
|
||||||
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
||||||
import io.element.android.tests.testutils.WarmUpRule
|
import io.element.android.tests.testutils.WarmUpRule
|
||||||
|
|
@ -135,11 +136,13 @@ class CreateAccountPresenterTest {
|
||||||
defaultLoginUserStory: DefaultLoginUserStory = DefaultLoginUserStory(),
|
defaultLoginUserStory: DefaultLoginUserStory = DefaultLoginUserStory(),
|
||||||
messageParser: MessageParser = FakeMessageParser(),
|
messageParser: MessageParser = FakeMessageParser(),
|
||||||
buildMeta: BuildMeta = aBuildMeta(),
|
buildMeta: BuildMeta = aBuildMeta(),
|
||||||
|
clientProvider: FakeMatrixClientProvider = FakeMatrixClientProvider(),
|
||||||
) = CreateAccountPresenter(
|
) = CreateAccountPresenter(
|
||||||
url = url,
|
url = url,
|
||||||
authenticationService = authenticationService,
|
authenticationService = authenticationService,
|
||||||
defaultLoginUserStory = defaultLoginUserStory,
|
defaultLoginUserStory = defaultLoginUserStory,
|
||||||
messageParser = messageParser,
|
messageParser = messageParser,
|
||||||
buildMeta = buildMeta,
|
buildMeta = buildMeta,
|
||||||
|
clientProvider = clientProvider,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue