From 1d3e6f2372d9692eda7d65adeeacd132029cb16f Mon Sep 17 00:00:00 2001
From: Taras <tarassmakula@gmail.com>
Date: Thu, 29 Sep 2022 19:31:07 +0300
Subject: [PATCH] Added getAllRegistrationFlows to registration wizard

---
 .../auth/registration/RegistrationWizard.kt   |  3 ++
 .../registration/DefaultRegistrationWizard.kt | 41 ++++++++++++++++++-
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
index 84cbcd52..30ef23fa 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
@@ -125,4 +125,7 @@ interface RegistrationWizard {
      * called successfully.
      */
     fun isRegistrationStarted(): Boolean
+
+    //Added to support few registration flows
+    suspend fun getAllRegistrationFlows(): List<List<Stage>>
 }
\ No newline at end of file
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
index dac75cfd..3077f895 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
@@ -20,7 +20,12 @@ import kotlinx.coroutines.delay
 import org.matrix.android.sdk.api.auth.LoginType
 import org.matrix.android.sdk.api.auth.data.Credentials
 import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
-import org.matrix.android.sdk.api.auth.registration.*
+import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
+import org.matrix.android.sdk.api.auth.registration.RegistrationAvailability
+import org.matrix.android.sdk.api.auth.registration.RegistrationResult
+import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
+import org.matrix.android.sdk.api.auth.registration.Stage
+import org.matrix.android.sdk.api.auth.registration.toFlowResult
 import org.matrix.android.sdk.api.failure.Failure
 import org.matrix.android.sdk.api.failure.Failure.RegistrationFlowError
 import org.matrix.android.sdk.api.util.JsonDict
@@ -265,4 +270,38 @@ internal class DefaultRegistrationWizard(
     override suspend fun registrationAvailable(userName: String): RegistrationAvailability {
         return registerAvailableTask.execute(RegisterAvailableTask.Params(userName))
     }
+
+    //Added to support few registration flows
+    override suspend fun getAllRegistrationFlows(): List<List<Stage>> {
+        try {
+            registerTask.execute(RegisterTask.Params(RegistrationParams()))
+        } catch (exception: Throwable) {
+            return if (exception is RegistrationFlowError) {
+                pendingSessionData =
+                        pendingSessionData.copy(currentSession = exception.registrationFlowResponse.session)
+                                .also { pendingSessionStore.savePendingSessionData(it) }
+                val flowResponse = exception.registrationFlowResponse
+                val missingStages = flowResponse.toFlowResult().missingStages
+
+                val flowsWithStages = flowResponse.flows?.mapNotNull { it.stages }?.map { flow ->
+                    flow.mapNotNull { type -> missingStages.findStageForType(type) }
+                } ?: emptyList()
+
+                flowsWithStages
+            } else {
+                emptyList()
+            }
+        }
+        return emptyList()
+    }
+
+    //Added to support few registration flows
+    private fun List<Stage>.findStageForType(type: String): Stage? = when (type) {
+        LoginFlowTypes.RECAPTCHA      -> firstOrNull { it is Stage.ReCaptcha }
+        LoginFlowTypes.DUMMY          -> firstOrNull { it is Stage.Dummy }
+        LoginFlowTypes.TERMS          -> firstOrNull { it is Stage.Terms }
+        LoginFlowTypes.EMAIL_IDENTITY -> firstOrNull { it is Stage.Email }
+        LoginFlowTypes.MSISDN         -> firstOrNull { it is Stage.Msisdn }
+        else                          -> firstOrNull { (it as? Stage.Other)?.type == type }
+    }
 }
\ No newline at end of file
-- 
GitLab