From 0037515c35d6dede76fb235e9edfb850bde6b5eb Mon Sep 17 00:00:00 2001
From: Taras <tarassmakula@gmail.com>
Date: Thu, 4 Aug 2022 16:27:53 +0300
Subject: [PATCH] Change logic for signup stages

---
 .../java/org/futo/circles/core/Constants.kt   |  3 ++-
 .../feature/sign_up/SignUpDataSource.kt       | 23 +++++++++++++++----
 .../circles/feature/sign_up/SignUpFragment.kt |  1 +
 .../SelectSignUpTypeDataSource.kt             |  3 ++-
 app/src/main/res/values/strings.xml           |  1 +
 5 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/app/src/main/java/org/futo/circles/core/Constants.kt b/app/src/main/java/org/futo/circles/core/Constants.kt
index b6c5ad8b0..eaff532c2 100644
--- a/app/src/main/java/org/futo/circles/core/Constants.kt
+++ b/app/src/main/java/org/futo/circles/core/Constants.kt
@@ -2,7 +2,8 @@ package org.futo.circles.core
 
 const val FILE_PROVIDER_AUTHORITY_PREFIX = ".provider"
 
-const val REGISTRATION_TOKEN_KEY_PREFIX = "login.registration_token"
+const val REGISTRATION_TOKEN_KEY_PREFIX = "registration_token"
+const val REGISTRATION_SUBSCRIPTION_KEY_PREFIX = "subscription.google"
 
 const val TERMS_URL_EXTENSION = "_matrix/consent"
 const val VALIDATION_TOKEN_SUBMIT_URL_PREFIX = "_matrix/identity/api/v1/validate/email/submitToken"
diff --git a/app/src/main/java/org/futo/circles/feature/sign_up/SignUpDataSource.kt b/app/src/main/java/org/futo/circles/feature/sign_up/SignUpDataSource.kt
index e237053c9..231bbd8bc 100644
--- a/app/src/main/java/org/futo/circles/feature/sign_up/SignUpDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/sign_up/SignUpDataSource.kt
@@ -6,6 +6,7 @@ import kotlinx.coroutines.async
 import kotlinx.coroutines.awaitAll
 import kotlinx.coroutines.coroutineScope
 import org.futo.circles.R
+import org.futo.circles.core.REGISTRATION_SUBSCRIPTION_KEY_PREFIX
 import org.futo.circles.core.REGISTRATION_TOKEN_KEY_PREFIX
 import org.futo.circles.core.SingleEventLiveData
 import org.futo.circles.core.matrix.pass_phrase.create.CreatePassPhraseDataSource
@@ -18,7 +19,7 @@ import org.matrix.android.sdk.api.auth.registration.RegistrationResult
 import org.matrix.android.sdk.api.auth.registration.Stage
 import org.matrix.android.sdk.api.session.Session
 
-enum class NavigationEvents { TokenValidation, AcceptTerm, ValidateEmail }
+enum class NavigationEvents { TokenValidation, Subscription, AcceptTerm, ValidateEmail }
 
 class SignUpDataSource(
     private val context: Context,
@@ -37,6 +38,8 @@ class SignUpDataSource(
         private set
 
     var currentHomeServerUrl: String = ""
+        private set
+
     private var passphrase: String = ""
     private var userName: String = ""
 
@@ -44,7 +47,8 @@ class SignUpDataSource(
         stages: List<Stage>,
         name: String,
         password: String,
-        homeServerUrl: String
+        homeServerUrl: String,
+        isSubscription: Boolean
     ) {
         currentStage = null
         stagesToComplete.clear()
@@ -52,7 +56,7 @@ class SignUpDataSource(
         passphrase = password
         currentHomeServerUrl = homeServerUrl
 
-        stagesToComplete.addAll(stages.filter { it.mandatory })
+        setupStages(stages, isSubscription)
         navigateToNextStage()
     }
 
@@ -66,6 +70,16 @@ class SignUpDataSource(
         subtitleLiveData.postValue("")
     }
 
+    private fun setupStages(stages: List<Stage>, isSubscription: Boolean) {
+        val otherStages = stages.filterIsInstance<Stage.Other>()
+        val firstStage = otherStages.firstOrNull {
+            if (isSubscription) it.type.endsWith(REGISTRATION_SUBSCRIPTION_KEY_PREFIX)
+            else it.type.endsWith(REGISTRATION_TOKEN_KEY_PREFIX)
+        } ?: throw IllegalArgumentException(context.getString(R.string.wrong_signup_config))
+        stagesToComplete.add(firstStage)
+        stagesToComplete.addAll(stages.filter { it.mandatory })
+    }
+
     private suspend fun finishRegistration(session: Session) = createResult {
         MatrixInstanceProvider.matrix.authenticationService().reset()
         MatrixSessionProvider.awaitForSessionStart(session)
@@ -103,11 +117,11 @@ class SignUpDataSource(
 
     private fun handleStageOther(type: String): NavigationEvents =
         if (type.endsWith(REGISTRATION_TOKEN_KEY_PREFIX)) NavigationEvents.TokenValidation
+        else if (type.endsWith(REGISTRATION_SUBSCRIPTION_KEY_PREFIX)) NavigationEvents.Subscription
         else throw IllegalArgumentException(
             context.getString(R.string.not_supported_stage_format, type)
         )
 
-
     private fun updatePageSubtitle() {
         val size = stagesToComplete.size
         val number = getCurrentStageIndex() + 1
@@ -115,5 +129,4 @@ class SignUpDataSource(
         subtitleLiveData.postValue(subtitle)
     }
 
-
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/sign_up/SignUpFragment.kt b/app/src/main/java/org/futo/circles/feature/sign_up/SignUpFragment.kt
index 4138c3306..ffa334408 100644
--- a/app/src/main/java/org/futo/circles/feature/sign_up/SignUpFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/sign_up/SignUpFragment.kt
@@ -57,6 +57,7 @@ class SignUpFragment : Fragment(R.layout.sign_up_fragment), BackPressOwner {
     private fun handleNavigation(event: NavigationEvents) {
         val directionId = when (event) {
             NavigationEvents.TokenValidation -> R.id.to_validateToken
+            NavigationEvents.Subscription -> R.id.to_subscriptions
             NavigationEvents.AcceptTerm -> R.id.to_acceptTerms
             NavigationEvents.ValidateEmail -> R.id.to_validateEmail
         }
diff --git a/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt b/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
index 44c53bec3..63752002b 100644
--- a/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
@@ -44,7 +44,8 @@ class SelectSignUpTypeDataSource(
                         it.flowResult.missingStages,
                         name,
                         password,
-                        homeServerUrl
+                        homeServerUrl,
+                        isSubscription
                     )
                 }
         }
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cce116fba..3e098c36a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -238,6 +238,7 @@
     <string name="enable_cross_signing_message">Confirm auth to enable cross signing</string>
     <string name="device_media">Device media</string>
     <string name="subscriptions">Subscriptions</string>
+    <string name="wrong_signup_config">Wrong signup config!</string>
 
     <string-array name="report_categories">
         <item>@string/crude_language</item>
-- 
GitLab