diff --git a/app/src/main/java/org/futo/circles/App.kt b/app/src/main/java/org/futo/circles/App.kt index 1baa30e0051aca6e0b2704aa0b495792aa1f3685..71156c948e7173c4f6907f921fb4c30eb0fe5ccf 100644 --- a/app/src/main/java/org/futo/circles/App.kt +++ b/app/src/main/java/org/futo/circles/App.kt @@ -46,8 +46,12 @@ class App : Application() { BuildConfig.FLAVOR ) .appName(getString(R.string.app_name)) - .euDomain(getString(if (BuildConfig.DEBUG) R.string.debug_eu_domain else R.string.release_eu_domain)) - .usDomain(getString(if (BuildConfig.DEBUG) R.string.debug_us_domain else R.string.release_us_domain)) + .serverDomains( + applicationContext.resources.getStringArray( + if (BuildConfig.DEBUG) R.array.debug_domains + else R.array.release_domains + ).toList() + ) .init() MatrixSessionProvider.initSession( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 265530ea73f1a1db179ee46ca30f612a65332e54..068dd88563eeb1db52f80932c6b70974d41bf50a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,8 +1,4 @@ <resources> - <string name="debug_eu_domain" translatable="false">matrix.org</string> - <string name="debug_us_domain" translatable="false">nl.circles-dev.net</string> - <string name="release_eu_domain" translatable="false">eu.circu.li</string> - <string name="release_us_domain" translatable="false">circu.li</string> <string name="app_name">Circles</string> <string name="futo">FUTO</string> <string name="circles">Circles</string> @@ -221,6 +217,16 @@ <string name="invite_to_connect">Invite to connect</string> <string name="empty_media_storage_info">0 MB used</string> + <string-array name="debug_domains"> + <item>nl.circles-dev.net</item> + <item>matrix.org</item> + </string-array> + + <string-array name="release_domains"> + <item>circu.li</item> + <item>eu.circu.li</item> + </string-array> + <string-array name="report_categories"> <item>@string/crude_language</item> <item>@string/copyright_violation</item> diff --git a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt index ec5d06f5d8ea1f4b295b3741a4d1a28c557d4cdb..e1ea34e4acf8ac6f20b42ff02e34cb00300a1437 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LogInFragment.kt @@ -39,7 +39,7 @@ class LogInFragment : Fragment(R.layout.fragment_log_in), HasLoadingState { ArrayAdapter( requireContext(), android.R.layout.simple_dropdown_item_1line, - listOf(CirclesAppConfig.usServerDomain, CirclesAppConfig.euServerDomain) + CirclesAppConfig.serverDomains ) } @@ -71,11 +71,11 @@ class LogInFragment : Fragment(R.layout.fragment_log_in), HasLoadingState { setAdapter(autocompleteAdapter) onFocusChangeListener = OnFocusChangeListener { _, hasFocus -> tilDomain.hint = - if (!hasFocus && tvDomain.text.isEmpty()) CirclesAppConfig.usServerDomain + if (!hasFocus && tvDomain.text.isEmpty()) CirclesAppConfig.serverDomains.first() else getString(R.string.domain) } } - tilDomain.hint = CirclesAppConfig.usServerDomain + tilDomain.hint = CirclesAppConfig.serverDomains.first() binding.rvSwitchUsers.apply { adapter = switchUsersAdapter addItemDecoration( @@ -121,5 +121,5 @@ class LogInFragment : Fragment(R.layout.fragment_log_in), HasLoadingState { } private fun getDomain() = binding.tvDomain.text.toString().takeIf { it.isNotEmpty() } - ?: CirclesAppConfig.usServerDomain + ?: CirclesAppConfig.serverDomains.first() } \ No newline at end of file diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt index f918bc02a6b7587260b81a1ff073addc076793cd..a7f1fbc005478f38f97d62386f344f551cff2c25 100644 --- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt +++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/SignUpDataSource.kt @@ -4,6 +4,7 @@ import android.content.Context import androidx.lifecycle.MutableLiveData import dagger.hilt.android.qualifiers.ApplicationContext import org.futo.circles.auth.R +import org.futo.circles.auth.base.BaseLoginStagesDataSource import org.futo.circles.auth.bsspeke.BSSpekeClientProvider import org.futo.circles.auth.feature.pass_phrase.create.CreatePassPhraseDataSource import org.futo.circles.core.base.SingleEventLiveData @@ -43,7 +44,7 @@ class SignUpDataSource @Inject constructor( var domain: String = "" private set - fun startSignUpStages( + suspend fun startSignUpStages( stages: List<Stage>, serverDomain: String ) { @@ -51,7 +52,14 @@ class SignUpDataSource @Inject constructor( stagesToComplete.clear() domain = serverDomain stagesToComplete.addAll(stages) - navigateToNextStage() + if ((stages.firstOrNull() as? Stage.Other)?.type == REGISTRATION_FREE_TYPE) + skipFreeSubscriptionDummyStage() + else navigateToNextStage() + } + + private suspend fun skipFreeSubscriptionDummyStage() { + setNextStage() + performRegistrationStage(mapOf(BaseLoginStagesDataSource.TYPE_PARAM_KEY to REGISTRATION_FREE_TYPE)) } suspend fun performRegistrationStage( @@ -143,6 +151,7 @@ class SignUpDataSource @Inject constructor( } companion object { + const val REGISTRATION_FREE_TYPE = "org.futo.subscriptions.free_forever" const val REGISTRATION_TOKEN_TYPE = "m.login.registration_token" const val REGISTRATION_SUBSCRIPTION_TYPE = "org.futo.subscription.google_play" const val REGISTRATION_EMAIL_REQUEST_TOKEN_TYPE = "m.enroll.email.request_token" 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 e4fcd63c850fc6c298217eb8e7d1812389062548..d723b78c2fc78a53f6cae26f9945c299b57ad5e4 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 @@ -4,9 +4,12 @@ import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext import org.futo.circles.auth.R import org.futo.circles.auth.feature.sign_up.SignUpDataSource +import org.futo.circles.auth.feature.sign_up.SignUpDataSource.Companion.REGISTRATION_FREE_TYPE +import org.futo.circles.auth.feature.sign_up.SignUpDataSource.Companion.REGISTRATION_SUBSCRIPTION_TYPE import org.futo.circles.core.extensions.createResult import org.futo.circles.core.provider.MatrixInstanceProvider import org.futo.circles.core.utils.HomeServerUtils.buildHomeServerConfigFromDomain +import org.matrix.android.sdk.api.auth.registration.Stage import javax.inject.Inject class SelectSignUpTypeDataSource @Inject constructor( @@ -14,19 +17,41 @@ class SelectSignUpTypeDataSource @Inject constructor( private val signUpDataSource: SignUpDataSource ) { + private var registrationFlowsForDomain: Pair<String, List<List<Stage>>>? = null + fun clearSubtitle() { signUpDataSource.clearSubtitle() } - suspend fun startNewRegistration(domain: String) = createResult { + suspend fun getAuthFlowsFor(domain: String) = createResult { + registrationFlowsForDomain = null val authService = MatrixInstanceProvider.matrix.authenticationService().apply { cancelPendingLoginOrRegistration() initiateAuth(buildHomeServerConfigFromDomain(domain)) } - val stages = authService.getRegistrationWizard().getAllRegistrationFlows().firstOrNull() - ?: throw IllegalArgumentException(context.getString(R.string.wrong_signup_config)) + authService.getRegistrationWizard().getAllRegistrationFlows().also { + registrationFlowsForDomain = domain to it + } + } + + suspend fun startNewRegistration(isSubscription: Boolean) = createResult { + val (domain, flows) = registrationFlowsForDomain ?: throw IllegalArgumentException( + context.getString(R.string.wrong_signup_config) + ) + val stages = if (isSubscription) getSubscriptionSignupStages(flows) + else getFreeSignupStages(flows) + + stages ?: throw IllegalArgumentException(context.getString(R.string.wrong_signup_config)) signUpDataSource.startSignUpStages(stages, domain) } + // Must start with org.futo.subscriptions.free_forever + 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 + 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 47eefff35c557e61587fd8d5a6506dd5ade389fd..7c1ca617f958d823a1d579ec0285233bd8257585 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 @@ -1,17 +1,21 @@ package org.futo.circles.auth.feature.sign_up.sign_up_type import android.os.Bundle -import android.text.Html import android.view.View +import androidx.core.view.children import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import by.kirich1409.viewbindingdelegate.viewBinding +import com.google.android.material.radiobutton.MaterialRadioButton import dagger.hilt.android.AndroidEntryPoint 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), @@ -31,29 +35,59 @@ class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type) private fun setupViews() { with(binding) { - btnEU.text = Html.fromHtml( - getString(R.string.eu_server_format, CirclesAppConfig.euServerDomain), - Html.FROM_HTML_MODE_COMPACT - ) - btnUS.text = - Html.fromHtml( - getString(R.string.us_server_format, CirclesAppConfig.usServerDomain), - Html.FROM_HTML_MODE_COMPACT + serverDomainGroup.setOnCheckedChangeListener { _, _ -> + setFlowsLoading(true) + viewModel.loadSignupFlowsForDomain(getDomain()) + } + CirclesAppConfig.serverDomains.forEach { domain -> + serverDomainGroup.addView( + MaterialRadioButton(requireContext()).apply { + text = domain + textSize = 20f + } ) - btnSignup.setOnClickListener { - startLoading(btnSignup) - viewModel.startSignUp(getDomain()) + } + serverDomainGroup.check(serverDomainGroup.children.first().id) + btnSubscription.setOnClickListener { + startLoading(btnSubscription) + viewModel.startSignUp(true) + } + btnFree.setOnClickListener { + startLoading(btnFree) + viewModel.startSignUp(false) } } } 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 getDomain() = when (binding.serverLocationGroup.checkedRadioButtonId) { - binding.btnUS.id -> CirclesAppConfig.usServerDomain - binding.btnEU.id -> CirclesAppConfig.euServerDomain - else -> CirclesAppConfig.usServerDomain + private fun setFlowsLoading(isLoading: Boolean) { + with(binding) { + lButtonsContainer.setIsVisible(!isLoading) + flowProgress.setIsVisible(isLoading) + } } + + private fun getDomain() = + binding.serverDomainGroup + .findViewById<MaterialRadioButton>(binding.serverDomainGroup.checkedRadioButtonId).text.toString() + } \ No newline at end of file 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 79e0b26ff764e47fd0bc86f83ccf57ea16a4f243..677f8727cb2fc6f241b355066bfe02e445b74472 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,10 +14,12 @@ class SelectSignUpTypeViewModel @Inject constructor( ) : ViewModel() { val startSignUpEventLiveData = SingleEventLiveData<Response<Unit?>>() + val signupFlowsLiveData = SingleEventLiveData<Response<List<List<Stage>>>>() - fun startSignUp(serverDomain: String) { + fun startSignUp(isSubscription: Boolean) { launchBg { - startSignUpEventLiveData.postValue(dataSource.startNewRegistration(serverDomain)) + val result = dataSource.startNewRegistration(isSubscription) + startSignUpEventLiveData.postValue(result) } } @@ -24,4 +27,17 @@ class SelectSignUpTypeViewModel @Inject constructor( dataSource.clearSubtitle() } + fun loadSignupFlowsForDomain(domain: String) { + 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 41faa2fff30ec1154dd456d232dd39a6bb8bc5b7..c6e1fef7a6e78dd825d0682b64452a51c5f488f0 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 @@ -26,53 +26,73 @@ <TextView - android:id="@+id/tvServerLocationTitle" + android:id="@+id/tvServerTitle" style="@style/headline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="@string/server_location" + android:text="@string/server" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/guidelineLogo" /> <RadioGroup - android:id="@+id/serverLocationGroup" + android:id="@+id/serverDomainGroup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/tvServerLocationTitle"> + app:layout_constraintTop_toBottomOf="@id/tvServerTitle" /> - <com.google.android.material.radiobutton.MaterialRadioButton - android:id="@+id/btnUS" - android:layout_width="wrap_content" + + <LinearLayout + android:id="@+id/lButtonsContainer" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="24dp" + android:orientation="vertical" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/serverDomainGroup" + tools:visibility="visible"> + + <org.futo.circles.core.view.LoadingButton + android:id="@+id/btnFree" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:checked="true" - android:paddingHorizontal="8dp" - android:textSize="17sp" - tools:text="US some.server.domain" /> + android:layout_marginBottom="16dp" + android:text="@string/sign_up_for_free" /> - <com.google.android.material.radiobutton.MaterialRadioButton - android:id="@+id/btnEU" + <TextView + android:id="@+id/tvOr" + style="@style/headline" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingHorizontal="8dp" - android:textSize="17sp" - tools:text="EU - (some.server.domain)" /> + android:layout_gravity="center_horizontal" + android:gravity="center" + android:text="@string/or" /> - </RadioGroup> + <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> - <org.futo.circles.core.view.LoadingButton - android:id="@+id/btnSignup" - android:layout_width="0dp" + <ProgressBar + android:id="@+id/flowProgress" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="24dp" - 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/serverLocationGroup" /> + app:layout_constraintTop_toBottomOf="@id/serverDomainGroup" + tools:visibility="visible" /> + </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml index cd4e34c606e1a9c908c84899bdf50f35a3e91941..c661570422a4009a705d37889441f2eb30af82e1 100644 --- a/auth/src/main/res/values/strings.xml +++ b/auth/src/main/res/values/strings.xml @@ -14,8 +14,6 @@ <string name="us_server_format"><![CDATA[<b>US</b> - (%s)]]></string> <string name="eu_server_format"><![CDATA[<b>EU</b> - (%s)]]></string> <string name="sign_up_using_active_subscription">Sign Up using your active subscription</string> - <string name="choose_a_subscription">Choose a subscription</string> - <string name="create_a_subscription">Create a subscription</string> <string name="sign_up">Sign Up</string> <string name="not_supported_stage_format">Not supported stage %s</string> <string name="sign_up_stage_subtitle_format">Stage %1$d of %2$d</string> @@ -61,8 +59,9 @@ <string name="enter_your_password">Enter your password</string> <string name="password">Password</string> <string name="repeat_password">Repeat password</string> - <string name="server_location">Server Location</string> + <string name="server">Server</string> <string name="sign_up_with_subscription">Sign up with subscription</string> + <string name="sign_up_for_free">Sign up for free</string> <string name="or">Or</string> <string name="setup_profile">Setup profile</string> <string name="upload_a_profile_photo">Upload a profile photo</string> diff --git a/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt b/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt index e5337064d96c32a3261a87d680c9ec22a38df27e..feb74f9e4d7d5f7241e3461032d1d9de90ee9be1 100644 --- a/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt +++ b/core/src/main/java/org/futo/circles/core/base/CirclesAppConfig.kt @@ -14,10 +14,7 @@ object CirclesAppConfig { var appName = "" private set - var usServerDomain = "" - private set - - var euServerDomain = "" + var serverDomains = emptyList<String>() private set var isMediaBackupEnabled = false @@ -32,9 +29,8 @@ object CirclesAppConfig { private var version: String? = null, private var flavour: String? = null, private var appName: String? = null, - private var usDomain: String? = null, + private var serverDomains: List<String> = emptyList(), private var euDomain: String? = null, - private var subscriptionEnabled: Boolean = false, private var mediaBackupEnabled: Boolean = false, private var rageshakeEnabled: Boolean = false ) { @@ -48,9 +44,7 @@ object CirclesAppConfig { fun appName(appName: String) = apply { this.appName = appName } - fun usDomain(domain: String) = apply { this.usDomain = domain } - - fun euDomain(domain: String) = apply { this.euDomain = domain } + fun serverDomains(domains: List<String>) = apply { this.serverDomains = domains } fun isMediaBackupEnabled(isEnabled: Boolean) = apply { this.mediaBackupEnabled = isEnabled } @@ -70,11 +64,8 @@ object CirclesAppConfig { CirclesAppConfig.appName = appName?.takeIf { it.isNotEmpty() } ?: throw IllegalArgumentException("appName is empty $appName") - usServerDomain = usDomain?.takeIf { it.isNotEmpty() } - ?: throw IllegalArgumentException("Illegal US server domain $usDomain") - - euServerDomain = euDomain?.takeIf { it.isNotEmpty() } - ?: throw IllegalArgumentException("Illegal EU server domain $euDomain") + CirclesAppConfig.serverDomains = serverDomains.takeIf { it.isNotEmpty() } + ?: throw IllegalArgumentException("Illegal empty server domains") isMediaBackupEnabled = mediaBackupEnabled isRageshakeEnabled = rageshakeEnabled diff --git a/core/src/main/java/org/futo/circles/core/base/Constants.kt b/core/src/main/java/org/futo/circles/core/base/Constants.kt index da27a0b25b74bce18534147cb8f1cc15062b7b72..8ead7f0d10d45959d27ef9cef671b3dd6724e1fc 100644 --- a/core/src/main/java/org/futo/circles/core/base/Constants.kt +++ b/core/src/main/java/org/futo/circles/core/base/Constants.kt @@ -1,6 +1,5 @@ package org.futo.circles.core.base -import org.futo.circles.core.BuildConfig import org.futo.circles.core.provider.MatrixSessionProvider const val FILE_PROVIDER_AUTHORITY_EXTENSION = ".provider" @@ -8,9 +7,7 @@ const val MediaCaptionFieldKey = "caption" const val READ_ONLY_ROLE = -10 fun getCirclesDomain(): String { - if (BuildConfig.DEBUG) return CirclesAppConfig.usServerDomain val homeServerUrl = MatrixSessionProvider.currentSession?.sessionParams?.homeServerUrl ?: "" - if (homeServerUrl.contains(CirclesAppConfig.usServerDomain)) return CirclesAppConfig.usServerDomain - if (homeServerUrl.contains(CirclesAppConfig.euServerDomain)) return CirclesAppConfig.euServerDomain - return CirclesAppConfig.usServerDomain + return CirclesAppConfig.serverDomains.firstOrNull { homeServerUrl.contains(it) } + ?: CirclesAppConfig.serverDomains.first() }