From 47f64829bd534d1396ed86c59d15ac7f43f5b611 Mon Sep 17 00:00:00 2001
From: Taras <tarassmakula@gmail.com>
Date: Wed, 22 Jun 2022 18:07:55 +0300
Subject: [PATCH] Add server location to signup

---
 .../SelectSignUpTypeDataSource.kt             | 42 +++++++---
 .../sign_up_type/SelectSignUpTypeFragment.kt  | 16 +++-
 .../sign_up_type/SelectSignUpTypeViewModel.kt |  4 +-
 .../layout/select_sign_up_type_fragment.xml   | 77 ++++++++++++++++---
 4 files changed, 114 insertions(+), 25 deletions(-)

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 d4b82c6a7..e62c13d91 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
@@ -1,10 +1,13 @@
 package org.futo.circles.feature.sign_up.sign_up_type
 
 import android.content.Context
+import android.net.Uri
 import org.futo.circles.R
+import org.futo.circles.core.HomeServerUtils
 import org.futo.circles.extensions.createResult
 import org.futo.circles.feature.sign_up.SignUpDataSource
 import org.futo.circles.provider.MatrixInstanceProvider
+import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
 import org.matrix.android.sdk.api.auth.registration.RegistrationResult
 
 class SelectSignUpTypeDataSource(
@@ -14,22 +17,37 @@ class SelectSignUpTypeDataSource(
 
     private val authService by lazy { MatrixInstanceProvider.matrix.authenticationService() }
 
-    private val registrationWizard by lazy { authService.getRegistrationWizard() }
-
     fun clearSubtitle() {
         signUpDataSource.clearSubtitle()
     }
 
-    suspend fun startNewRegistration(name: String, password: String) = createResult {
-        authService.cancelPendingLoginOrRegistration()
-        (registrationWizard.createAccount(
-            name, password,
-            context.getString(R.string.initial_device_name, context.getString(R.string.app_name))
-        )
-                as? RegistrationResult.FlowResponse)
-            ?.let {
-                signUpDataSource.startSignUpStages(it.flowResult.missingStages, password)
-            }
+    suspend fun startNewRegistration(name: String, password: String, domain: String) =
+        createResult {
+            val homeServerUrl = HomeServerUtils.getHomeServerUrlFromDomain(domain)
+            authService.cancelPendingLoginOrRegistration()
+            authService.getLoginFlow(buildHomeServerConfig(homeServerUrl))
+            (authService.getRegistrationWizard().createAccount(
+                name, password,
+                context.getString(
+                    R.string.initial_device_name,
+                    context.getString(R.string.app_name)
+                )
+            )
+                    as? RegistrationResult.FlowResponse)
+                ?.let {
+                    signUpDataSource.startSignUpStages(
+                        it.flowResult.missingStages,
+                        password,
+                        homeServerUrl
+                    )
+                }
+        }
+
+    private fun buildHomeServerConfig(url: String): HomeServerConnectionConfig {
+        return HomeServerConnectionConfig
+            .Builder()
+            .withHomeServerUri(Uri.parse(url))
+            .build()
     }
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt b/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
index 1b5fa5c9e..ddadd218d 100644
--- a/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
+++ b/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
@@ -6,6 +6,8 @@ import androidx.core.widget.doAfterTextChanged
 import androidx.fragment.app.Fragment
 import by.kirich1409.viewbindingdelegate.viewBinding
 import org.futo.circles.R
+import org.futo.circles.core.EU_SERVER_DOMAIN
+import org.futo.circles.core.US_SERVER_DOMAIN
 import org.futo.circles.core.fragment.HasLoadingState
 import org.futo.circles.databinding.SelectSignUpTypeFragmentBinding
 import org.futo.circles.extensions.getText
@@ -34,8 +36,20 @@ class SelectSignUpTypeFragment : Fragment(R.layout.select_sign_up_type_fragment)
             tilPassword.editText?.doAfterTextChanged { setTokenButtonEnabled() }
             btnToken.setOnClickListener {
                 startLoading(btnToken)
-                viewModel.startSignUp(tilUserName.getText(), tilPassword.getText())
+                viewModel.startSignUp(
+                    tilUserName.getText(),
+                    tilPassword.getText(),
+                    tvServerDomain.text.toString()
+                )
             }
+            serverLocationGroup.setOnCheckedChangeListener { _, checkedId ->
+                tvServerDomain.text = when (checkedId) {
+                    btnUS.id -> US_SERVER_DOMAIN
+                    btnEU.id -> EU_SERVER_DOMAIN
+                    else -> US_SERVER_DOMAIN
+                }
+            }
+            serverLocationGroup.check(btnUS.id)
         }
     }
 
diff --git a/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt b/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
index 1c197b9f7..e9874360b 100644
--- a/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
+++ b/app/src/main/java/org/futo/circles/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
@@ -11,10 +11,10 @@ class SelectSignUpTypeViewModel(
 
     val startSignUpEventLiveData = SingleEventLiveData<Response<Unit?>>()
 
-    fun startSignUp(name: String, password: String) {
+    fun startSignUp(name: String, password: String, serverDomain: String) {
         launchBg {
             startSignUpEventLiveData.postValue(
-                dataSource.startNewRegistration(name, password)
+                dataSource.startNewRegistration(name, password, serverDomain)
             )
         }
     }
diff --git a/app/src/main/res/layout/select_sign_up_type_fragment.xml b/app/src/main/res/layout/select_sign_up_type_fragment.xml
index 4968ecb59..36df53e2a 100644
--- a/app/src/main/res/layout/select_sign_up_type_fragment.xml
+++ b/app/src/main/res/layout/select_sign_up_type_fragment.xml
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:paddingHorizontal="36dp"
-    android:paddingVertical="16dp">
+    android:paddingHorizontal="24dp"
+    android:paddingVertical="8dp">
 
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/guidelineLogo"
@@ -22,17 +23,59 @@
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
 
+
+    <TextView
+        android:id="@+id/tvServerLocationTitle"
+        style="@style/headline"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="8dp"
+        android:text="@string/server_location"
+        app:layout_constraintBottom_toBottomOf="@id/serverLocationGroup"
+        app:layout_constraintEnd_toStartOf="@+id/serverLocationGroup"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="@id/serverLocationGroup" />
+
+    <RadioGroup
+        android:id="@+id/serverLocationGroup"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@id/tvServerLocationTitle"
+        app:layout_constraintTop_toBottomOf="@id/guidelineLogo">
+
+        <com.google.android.material.radiobutton.MaterialRadioButton
+            android:id="@+id/btnUS"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingHorizontal="8dp"
+            android:text="@string/us"
+            android:textAppearance="@style/headline" />
+
+        <com.google.android.material.radiobutton.MaterialRadioButton
+            android:id="@+id/btnEU"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingHorizontal="8dp"
+            android:text="@string/eu"
+            android:textAppearance="@style/headline" />
+
+    </RadioGroup>
+
     <com.google.android.material.textfield.TextInputLayout
         android:id="@+id/tilUserName"
         style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="16dp"
+        android:layout_marginEnd="4dp"
         android:hint="@string/username"
         app:layout_constraintBottom_toTopOf="@id/tilPassword"
-        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/tvServerDomain"
+        app:layout_constraintHorizontal_weight="0.6"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/guidelineLogo">
+        app:layout_constraintTop_toBottomOf="@id/serverLocationGroup">
 
         <com.google.android.material.textfield.TextInputEditText
             android:layout_width="match_parent"
@@ -44,6 +87,20 @@
 
     </com.google.android.material.textfield.TextInputLayout>
 
+    <TextView
+        android:id="@+id/tvServerDomain"
+        style="@style/footNote"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:ellipsize="end"
+        android:lines="1"
+        app:layout_constraintBottom_toBottomOf="@id/tilUserName"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_weight="0.4"
+        app:layout_constraintStart_toEndOf="@id/tilUserName"
+        app:layout_constraintTop_toTopOf="@id/tilUserName"
+        tools:text="eu.kombucha.social" />
+
     <com.google.android.material.textfield.TextInputLayout
         android:id="@+id/tilPassword"
         style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
@@ -68,7 +125,7 @@
 
     <TextView
         android:id="@+id/tvTokenTitle"
-        style="@style/title2"
+        style="@style/headline"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:gravity="center"
@@ -77,7 +134,7 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@id/tilPassword"
-        app:layout_constraintVertical_bias="0.3"
+        app:layout_constraintVertical_bias="0.2"
         app:layout_constraintVertical_chainStyle="packed" />
 
     <org.futo.circles.view.LoadingButton
@@ -97,8 +154,8 @@
         style="@style/headline"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginTop="24dp"
-        android:layout_marginBottom="24dp"
+        android:layout_marginTop="8dp"
+        android:layout_marginBottom="8dp"
         android:gravity="center"
         android:text="@string/or"
         app:layout_constraintBottom_toTopOf="@id/tvSubscriptionTitle"
@@ -109,7 +166,7 @@
 
     <TextView
         android:id="@+id/tvSubscriptionTitle"
-        style="@style/title2"
+        style="@style/headline"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:gravity="center"
-- 
GitLab