From 64187388940ffdee9d946a2b552076513d9c91bf Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Thu, 4 Jan 2024 17:08:40 +0200 Subject: [PATCH] Show buttons depending on flow result --- .../SelectSignUpTypeDataSource.kt | 4 +- .../sign_up_type/SelectSignUpTypeFragment.kt | 27 ++++++++ .../sign_up_type/SelectSignUpTypeViewModel.kt | 13 +++- .../layout/fragment_select_sign_up_type.xml | 65 +++++++++++-------- 4 files changed, 79 insertions(+), 30 deletions(-) diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt index 5e5a0abaf..d723b78c2 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt @@ -47,11 +47,11 @@ class SelectSignUpTypeDataSource @Inject constructor( } // Must start with org.futo.subscriptions.free_forever - private fun getFreeSignupStages(flows: List<List<Stage>>): List<Stage>? = + fun getFreeSignupStages(flows: List<List<Stage>>): List<Stage>? = flows.firstOrNull { (it.firstOrNull() as? Stage.Other)?.type == REGISTRATION_FREE_TYPE } // Must start with org.futo.subscription.google_play - private fun getSubscriptionSignupStages(flows: List<List<Stage>>): List<Stage>? = + fun getSubscriptionSignupStages(flows: List<List<Stage>>): List<Stage>? = flows.firstOrNull { (it.firstOrNull() as? Stage.Other)?.type == REGISTRATION_SUBSCRIPTION_TYPE } } \ No newline at end of file diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt index 21b158251..7c1ca617f 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt @@ -12,7 +12,10 @@ import org.futo.circles.auth.R import org.futo.circles.auth.databinding.FragmentSelectSignUpTypeBinding import org.futo.circles.core.base.CirclesAppConfig import org.futo.circles.core.base.fragment.HasLoadingState +import org.futo.circles.core.extensions.gone import org.futo.circles.core.extensions.observeResponse +import org.futo.circles.core.extensions.setIsVisible +import org.futo.circles.core.extensions.showError @AndroidEntryPoint class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type), @@ -33,6 +36,7 @@ class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type) private fun setupViews() { with(binding) { serverDomainGroup.setOnCheckedChangeListener { _, _ -> + setFlowsLoading(true) viewModel.loadSignupFlowsForDomain(getDomain()) } CirclesAppConfig.serverDomains.forEach { domain -> @@ -57,6 +61,29 @@ class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type) private fun setupObservers() { viewModel.startSignUpEventLiveData.observeResponse(this) + viewModel.signupFlowsLiveData.observeResponse(this, + success = { + val hasSubscriptionFlow = viewModel.hasSubscriptionFlow(it) + val hasFreeFlow = viewModel.hasFreeFlow(it) + with(binding) { + btnSubscription.setIsVisible(hasSubscriptionFlow) + btnFree.setIsVisible(hasFreeFlow) + tvOr.setIsVisible(hasFreeFlow && hasSubscriptionFlow) + } + }, + error = { message -> + showError(message) + binding.lButtonsContainer.gone() + }, + onRequestInvoked = { setFlowsLoading(false) } + ) + } + + private fun setFlowsLoading(isLoading: Boolean) { + with(binding) { + lButtonsContainer.setIsVisible(!isLoading) + flowProgress.setIsVisible(isLoading) + } } private fun getDomain() = diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt index 89d7513d4..677f8727c 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt @@ -5,6 +5,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import org.futo.circles.core.base.SingleEventLiveData import org.futo.circles.core.extensions.Response import org.futo.circles.core.extensions.launchBg +import org.matrix.android.sdk.api.auth.registration.Stage import javax.inject.Inject @HiltViewModel @@ -13,6 +14,7 @@ class SelectSignUpTypeViewModel @Inject constructor( ) : ViewModel() { val startSignUpEventLiveData = SingleEventLiveData<Response<Unit?>>() + val signupFlowsLiveData = SingleEventLiveData<Response<List<List<Stage>>>>() fun startSignUp(isSubscription: Boolean) { launchBg { @@ -26,7 +28,16 @@ class SelectSignUpTypeViewModel @Inject constructor( } fun loadSignupFlowsForDomain(domain: String) { - launchBg { dataSource.getAuthFlowsFor(domain) } + launchBg { + val result = dataSource.getAuthFlowsFor(domain) + signupFlowsLiveData.postValue(result) + } } + fun hasSubscriptionFlow(flows: List<List<Stage>>): Boolean = + dataSource.getSubscriptionSignupStages(flows) != null + + fun hasFreeFlow(flows: List<List<Stage>>): Boolean = + dataSource.getFreeSignupStages(flows) != null + } \ No newline at end of file diff --git a/auth/src/main/res/layout/fragment_select_sign_up_type.xml b/auth/src/main/res/layout/fragment_select_sign_up_type.xml index c79ca4f15..c6e1fef7a 100644 --- a/auth/src/main/res/layout/fragment_select_sign_up_type.xml +++ b/auth/src/main/res/layout/fragment_select_sign_up_type.xml @@ -1,6 +1,7 @@ <?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="24dp" @@ -45,43 +46,53 @@ app:layout_constraintTop_toBottomOf="@id/tvServerTitle" /> - <org.futo.circles.core.view.LoadingButton - android:id="@+id/btnFree" + <LinearLayout + android:id="@+id/lButtonsContainer" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="24dp" - android:text="@string/sign_up_for_free" + android:orientation="vertical" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/serverDomainGroup" /> + app:layout_constraintTop_toBottomOf="@id/serverDomainGroup" + tools:visibility="visible"> - <TextView - android:id="@+id/tvOr" - style="@style/headline" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:gravity="center" - android:text="@string/or" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/btnFree" /> + <org.futo.circles.core.view.LoadingButton + android:id="@+id/btnFree" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:text="@string/sign_up_for_free" /> - <org.futo.circles.core.view.LoadingButton - android:id="@+id/btnSubscription" - android:layout_width="0dp" + <TextView + android:id="@+id/tvOr" + style="@style/headline" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:gravity="center" + android:text="@string/or" /> + + <org.futo.circles.core.view.LoadingButton + android:id="@+id/btnSubscription" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:text="@string/sign_up_with_subscription" /> + + </LinearLayout> + + <ProgressBar + android:id="@+id/flowProgress" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/sign_up_with_subscription" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/tvOr" /> - - <androidx.constraintlayout.widget.Group - android:id="@+id/groupFree" - android:layout_width="0dp" - android:layout_height="0dp" - app:constraint_referenced_ids="tvOr,btnFree" /> + app:layout_constraintTop_toBottomOf="@id/serverDomainGroup" + tools:visibility="visible" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file -- GitLab