From 12ae35f5ac04ceed29bd80c6e8f5521ecf6ced42 Mon Sep 17 00:00:00 2001
From: Adam Brown <adampsbrown@gmail.com>
Date: Mon, 28 Mar 2022 12:46:59 +0100
Subject: [PATCH] reordering methods to match usage - also ports the Sso
 listener to a functional interface

---
 .../features/login/SocialLoginButtonsView.kt  |  2 +-
 .../FtueAuthCombinedSignUpFragment.kt         | 94 +++++++++----------
 2 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt b/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt
index f40cad9ec5..515c8e9d39 100644
--- a/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt
+++ b/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt
@@ -30,7 +30,7 @@ import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider
 class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
     LinearLayout(context, attrs, defStyle) {
 
-    interface InteractionListener {
+    fun interface InteractionListener {
         fun onProviderSelected(id: String?)
     }
 
diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedSignUpFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedSignUpFragment.kt
index f2df34220b..6ad98298ea 100644
--- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedSignUpFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedSignUpFragment.kt
@@ -46,6 +46,7 @@ import im.vector.app.features.onboarding.OnboardingViewState
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.onEach
+import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider
 import org.matrix.android.sdk.api.failure.isInvalidPassword
 import org.matrix.android.sdk.api.failure.isInvalidUsername
 import org.matrix.android.sdk.api.failure.isLoginEmailUnknown
@@ -76,20 +77,25 @@ class FtueAuthCombinedSignUpFragment @Inject constructor() : AbstractSSOFtueAuth
         }
     }
 
-    private fun setupAutoFill() {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            views.createAccountInput.setAutofillHints(HintConstants.AUTOFILL_HINT_NEW_USERNAME)
-            views.createAccountPasswordInput.setAutofillHints(HintConstants.AUTOFILL_HINT_NEW_PASSWORD)
-        }
+    private fun setupSubmitButton() {
+        views.createAccountSubmit.setOnClickListener { submit() }
+        observeInputFields()
+                .onEach {
+                    views.createAccountPasswordInput.error = null
+                    views.createAccountInput.error = null
+                    views.createAccountSubmit.isEnabled = it
+                }
+                .launchIn(viewLifecycleOwner.lifecycleScope)
     }
 
-    private fun setupSocialLoginButtons() {
-        views.ssoButtons.mode = SocialLoginButtonsView.Mode.MODE_SIGN_UP
-    }
+    private fun observeInputFields() = combine(
+            views.createAccountInput.hasContentFlow { it.trim() },
+            views.createAccountPasswordInput.hasContentFlow(),
+            transform = { isLoginNotEmpty, isPasswordNotEmpty -> isLoginNotEmpty && isPasswordNotEmpty }
+    )
 
     private fun submit() {
         withState(viewModel) { state ->
-
             cleanupUi()
 
             val login = views.createAccountInput.content()
@@ -122,43 +128,6 @@ class FtueAuthCombinedSignUpFragment @Inject constructor() : AbstractSSOFtueAuth
         views.createAccountPasswordInput.error = null
     }
 
-    private fun setupUi(state: OnboardingViewState) {
-        if (state.loginMode is LoginMode.SsoAndPassword) {
-            views.ssoGroup.isVisible = state.loginMode.ssoIdentityProviders?.isNotEmpty() == true
-            views.ssoButtons.ssoIdentityProviders = state.loginMode.ssoIdentityProviders?.sorted()
-            views.ssoButtons.listener = object : SocialLoginButtonsView.InteractionListener {
-                override fun onProviderSelected(id: String?) {
-                    viewModel.getSsoUrl(
-                            redirectUrl = SSORedirectRouterActivity.VECTOR_REDIRECT_URL,
-                            deviceId = state.deviceId,
-                            providerId = id
-                    )
-                            ?.let { openInCustomTab(it) }
-                }
-            }
-        } else {
-            views.ssoGroup.isVisible = false
-            views.ssoButtons.ssoIdentityProviders = null
-        }
-    }
-
-    private fun setupSubmitButton() {
-        views.createAccountSubmit.setOnClickListener { submit() }
-        observeInputFields()
-                .onEach {
-                    views.createAccountPasswordInput.error = null
-                    views.createAccountInput.error = null
-                    views.createAccountSubmit.isEnabled = it
-                }
-                .launchIn(viewLifecycleOwner.lifecycleScope)
-    }
-
-    private fun observeInputFields() = combine(
-            views.createAccountInput.hasContentFlow { it.trim() },
-            views.createAccountPasswordInput.hasContentFlow(),
-            transform = { isLoginNotEmpty, isPasswordNotEmpty -> isLoginNotEmpty && isPasswordNotEmpty }
-    )
-
     override fun resetViewModel() {
         viewModel.handle(OnboardingAction.ResetAuthenticationAttempt)
     }
@@ -195,13 +164,44 @@ class FtueAuthCombinedSignUpFragment @Inject constructor() : AbstractSSOFtueAuth
     override fun updateWithState(state: OnboardingViewState) {
         setupUi(state)
         setupAutoFill()
-        setupSocialLoginButtons()
 
         if (state.isLoading) {
             // Ensure password is hidden
             views.createAccountPasswordInput.editText().hidePassword()
         }
     }
+
+    private fun setupUi(state: OnboardingViewState) {
+        when (state.loginMode) {
+            is LoginMode.SsoAndPassword -> renderSsoProviders(state.deviceId, state.loginMode.ssoIdentityProviders)
+            else                        -> hideSsoProviders()
+        }
+    }
+
+    private fun renderSsoProviders(deviceId: String?, ssoProviders: List<SsoIdentityProvider>?) {
+        views.ssoButtons.mode = SocialLoginButtonsView.Mode.MODE_SIGN_UP
+        views.ssoButtons.ssoIdentityProviders = ssoProviders?.sorted()
+        views.ssoButtons.listener = SocialLoginButtonsView.InteractionListener { id ->
+            views.ssoGroup.isVisible = ssoProviders?.isNotEmpty() == true
+            viewModel.getSsoUrl(
+                    redirectUrl = SSORedirectRouterActivity.VECTOR_REDIRECT_URL,
+                    deviceId = deviceId,
+                    providerId = id
+            )?.let { openInCustomTab(it) }
+        }
+    }
+
+    private fun hideSsoProviders() {
+        views.ssoGroup.isVisible = false
+        views.ssoButtons.ssoIdentityProviders = null
+    }
+
+    private fun setupAutoFill() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            views.createAccountInput.setAutofillHints(HintConstants.AUTOFILL_HINT_NEW_USERNAME)
+            views.createAccountPasswordInput.setAutofillHints(HintConstants.AUTOFILL_HINT_NEW_PASSWORD)
+        }
+    }
 }
 
 private fun OnboardingViewState.isNumericOnlyUserIdForbidden() = serverType == ServerType.MatrixOrg