From ff6325fe91324ca3f571f2afac3fe6838cfce776 Mon Sep 17 00:00:00 2001 From: Dominic Tubach Date: Thu, 19 Jun 2025 13:02:07 +0200 Subject: [PATCH] Disable bug reports if homeserver is not synod.im This also adds synod.im string keys, enums and variable names instead of re-using those for matrix.org. --- .../ui-strings/src/main/res/values-de/strings.xml | 3 ++- library/ui-strings/src/main/res/values/strings.xml | 3 ++- vector-config/src/main/res/values/config.xml | 3 ++- .../java/im/vector/app/features/home/HomeActivity.kt | 10 ++++++++++ .../app/features/homeserver/ServerUrlsRepository.kt | 2 +- .../im/vector/app/features/login/LoginActivity.kt | 1 + .../im/vector/app/features/login/LoginFragment.kt | 10 +++++++--- .../login/LoginSignUpSignInSelectionFragment.kt | 8 ++++++-- .../vector/app/features/login/LoginSplashFragment.kt | 2 +- .../im/vector/app/features/login/LoginViewModel.kt | 10 ++++++++-- .../java/im/vector/app/features/login/ServerType.kt | 3 ++- .../app/features/onboarding/OnboardingViewModel.kt | 12 ++++++++++-- .../features/onboarding/RegistrationActionHandler.kt | 5 +++-- .../ftueauth/FtueAuthCombinedRegisterFragment.kt | 1 + .../onboarding/ftueauth/FtueAuthLoginFragment.kt | 10 +++++++--- .../FtueAuthSignUpSignInSelectionFragment.kt | 8 ++++++-- .../features/onboarding/ftueauth/FtueAuthVariant.kt | 1 + 17 files changed, 70 insertions(+), 22 deletions(-) diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml index 38f1e47756d..32582889787 100644 --- a/library/ui-strings/src/main/res/values-de/strings.xml +++ b/library/ui-strings/src/main/res/values-de/strings.xml @@ -1057,7 +1057,8 @@ Los geht\'s Wähle einen Server Genau wie bei E-Mails haben Accounts ein Zuhause, auch wenn du mit jedem kommunizieren kannst - Tausche dich aus - mit dem sicheren Messenger im kirchlichen Bereich + Folge Millionen Anderen kostenlos auf dem größten öffentlichen Server + Tausche dich aus - mit dem sicheren Messenger im kirchlichen Bereich Premium-Hosting für Organisationen Mehr erfahren Andere diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index d40315697fa..09f12f3fe8b 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -2126,7 +2126,8 @@ Select a server Just like email, accounts have one home, although you can talk to anyone - Communicate - using the secure messenger for congregations + Join millions for free on the largest public server + Communicate - using the secure messenger for congregations Premium hosting for organisations Learn more Other diff --git a/vector-config/src/main/res/values/config.xml b/vector-config/src/main/res/values/config.xml index 205a826c7f2..2928f1ebc0f 100755 --- a/vector-config/src/main/res/values/config.xml +++ b/vector-config/src/main/res/values/config.xml @@ -4,7 +4,8 @@ - https://synod.im + https://matrix.org + https://synod.im https://bugs.synod.im diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index d22ea908564..e2c1ebcb51d 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -613,6 +613,16 @@ class HomeActivity : override fun handlePrepareMenu(menu: Menu) { menu.findItem(R.id.menu_home_init_sync_legacy).isVisible = vectorPreferences.developerMode() menu.findItem(R.id.menu_home_init_sync_optimized).isVisible = vectorPreferences.developerMode() + // Changed for Synod.im: Disable bug reporting when on third party home server. + // Rage shake is still possible to keep the code changes minimal. + if (activeSessionHolder.hasActiveSession()) { + val homeServerUrlBase = activeSessionHolder.getActiveSession().sessionParams.homeServerUrlBase; + val defaultHomeServerUrl = getString(im.vector.app.config.R.string.synod_im_server_url) + if (homeServerUrlBase != defaultHomeServerUrl) { + menu.findItem(R.id.menu_home_report_bug).isVisible = false + menu.findItem(R.id.menu_home_suggestion).isVisible = false + } + } } override fun handleMenuItemSelected(item: MenuItem): Boolean { diff --git a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt index d5a5fc8a602..bd3ae447d4f 100644 --- a/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt +++ b/vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt @@ -80,5 +80,5 @@ class ServerUrlsRepository @Inject constructor( /** * Return default homeserver url from resources. */ - private fun getDefaultHomeServerUrl() = stringProvider.getString(im.vector.app.config.R.string.matrix_org_server_url) + private fun getDefaultHomeServerUrl() = stringProvider.getString(im.vector.app.config.R.string.synod_im_server_url) } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt index cbf13acc986..67d098a79af 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt @@ -247,6 +247,7 @@ open class LoginActivity : VectorBaseActivity(), UnlockedA private fun onServerSelectionDone(loginViewEvents: LoginViewEvents.OnServerSelectionDone) { when (loginViewEvents.serverType) { ServerType.MatrixOrg -> Unit // In this case, we wait for the login flow + ServerType.SynodIm -> Unit // In this case, we wait for the login flow ServerType.EMS, ServerType.Other -> addFragmentToBackstack( views.loginFragmentContainer, diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt index 37cc3fc757c..b52bf969467 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt @@ -171,12 +171,16 @@ class LoginFragment : when (state.serverType) { ServerType.MatrixOrg -> { - // Changed for Synod.im: Hide matrix.org icon. - views.loginServerIcon.isVisible = false + views.loginServerIcon.isVisible = true views.loginServerIcon.setImageResource(R.drawable.ic_logo_matrix_org) views.loginTitle.text = getString(resId, state.homeServerUrlFromUser.toReducedUrl()) views.loginNotice.text = getString(CommonStrings.login_server_matrix_org_text) } + ServerType.SynodIm -> { + views.loginServerIcon.isVisible = false + views.loginTitle.text = getString(resId, state.homeServerUrlFromUser.toReducedUrl()) + views.loginNotice.text = getString(CommonStrings.login_server_synod_im_text) + } ServerType.EMS -> { views.loginServerIcon.isVisible = true views.loginServerIcon.setImageResource(R.drawable.ic_logo_element_matrix_services) @@ -259,7 +263,7 @@ class LoginFragment : override fun updateWithState(state: LoginViewState) { isSignupMode = state.signMode == SignMode.SignUp - isNumericOnlyUserIdForbidden = state.serverType == ServerType.MatrixOrg + isNumericOnlyUserIdForbidden = state.serverType == ServerType.MatrixOrg || state.serverType == ServerType.SynodIm setupUi(state) setupAutoFill(state) diff --git a/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt index 4797df9c9cf..d00e4c14432 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginSignUpSignInSelectionFragment.kt @@ -47,11 +47,15 @@ class LoginSignUpSignInSelectionFragment : when (state.serverType) { ServerType.MatrixOrg -> { views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_matrix_org) - // Changed for Synod.im: Hide matrix.org icon. - views.loginSignupSigninServerIcon.isVisible = false + views.loginSignupSigninServerIcon.isVisible = true views.loginSignupSigninTitle.text = getString(CommonStrings.login_connect_to, state.homeServerUrlFromUser.toReducedUrl()) views.loginSignupSigninText.text = getString(CommonStrings.login_server_matrix_org_text) } + ServerType.SynodIm -> { + views.loginSignupSigninServerIcon.isVisible = false + views.loginSignupSigninTitle.text = getString(CommonStrings.login_connect_to, state.homeServerUrlFromUser.toReducedUrl()) + views.loginSignupSigninText.text = getString(CommonStrings.login_server_synod_im_text) + } ServerType.EMS -> { views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_element_matrix_services) views.loginSignupSigninServerIcon.isVisible = true diff --git a/vector/src/main/java/im/vector/app/features/login/LoginSplashFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginSplashFragment.kt index a1eb1a139a4..c4ed92674c9 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginSplashFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginSplashFragment.kt @@ -75,7 +75,7 @@ class LoginSplashFragment : loginViewModel.handle(LoginAction.OnGetStarted(resetLoginConfig = false)) } else { // Synod.im: skip server selection - loginViewModel.handle(LoginAction.UpdateHomeServer(getString(im.vector.app.config.R.string.matrix_org_server_url).ensureTrailingSlash())) + loginViewModel.handle(LoginAction.UpdateHomeServer(getString(im.vector.app.config.R.string.synod_im_server_url).ensureTrailingSlash())) } } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt index 60a45b4ac31..1ba384c76f4 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt @@ -82,6 +82,7 @@ class LoginViewModel @AssistedInject constructor( private var currentHomeServerConnectionConfig: HomeServerConnectionConfig? = null private val matrixOrgUrl = stringProvider.getString(im.vector.app.config.R.string.matrix_org_server_url).ensureTrailingSlash() + private val synodImUrl = stringProvider.getString(im.vector.app.config.R.string.synod_im_server_url).ensureTrailingSlash() val currentThreePid: String? get() = registrationWizard?.getCurrentThreePid() @@ -441,6 +442,9 @@ class LoginViewModel @AssistedInject constructor( ServerType.MatrixOrg -> // Request login flow here handle(LoginAction.UpdateHomeServer(matrixOrgUrl)) + ServerType.SynodIm -> + // Request login flow here + handle(LoginAction.UpdateHomeServer(synodImUrl)) ServerType.EMS, ServerType.Other -> _viewEvents.post(LoginViewEvents.OnServerSelectionDone(action.serverType)) } @@ -780,6 +784,8 @@ class LoginViewModel @AssistedInject constructor( // It is also useful to set the value again in the case of a certificate error on matrix.org serverType = if (homeServerConnectionConfig.homeServerUri.toString() == matrixOrgUrl) { ServerType.MatrixOrg + } else if (homeServerConnectionConfig.homeServerUri.toString() == synodImUrl) { + ServerType.SynodIm } else { serverTypeOverride ?: serverType } @@ -793,8 +799,8 @@ class LoginViewModel @AssistedInject constructor( setState { copy( asyncHomeServerLoginFlowRequest = Uninitialized, - // If we were trying to retrieve matrix.org login flow, also reset the serverType - serverType = if (serverType == ServerType.MatrixOrg) ServerType.Unknown else serverType + // If we were trying to retrieve matrix.org or synod.im login flow, also reset the serverType + serverType = if (serverType == ServerType.MatrixOrg || serverType == ServerType.SynodIm) ServerType.Unknown else serverType ) } null diff --git a/vector/src/main/java/im/vector/app/features/login/ServerType.kt b/vector/src/main/java/im/vector/app/features/login/ServerType.kt index f4a73e313ce..8c3a715b192 100644 --- a/vector/src/main/java/im/vector/app/features/login/ServerType.kt +++ b/vector/src/main/java/im/vector/app/features/login/ServerType.kt @@ -11,5 +11,6 @@ enum class ServerType { Unknown, MatrixOrg, EMS, - Other + Other, + SynodIm } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 73e49a9940d..f94160fe306 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -8,6 +8,8 @@ package im.vector.app.features.onboarding import android.content.Context +import android.content.res.Resources +import androidx.core.os.ConfigurationCompat import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -115,7 +117,8 @@ class OnboardingViewModel @AssistedInject constructor( } private val matrixOrgUrl = stringProvider.getString(im.vector.app.config.R.string.matrix_org_server_url).ensureTrailingSlash() - private val defaultHomeserverUrl = mdmService.getData(MdmData.DefaultHomeserverUrl, matrixOrgUrl) + private val synodImUrl = stringProvider.getString(im.vector.app.config.R.string.synod_im_server_url).ensureTrailingSlash() + private val defaultHomeserverUrl = mdmService.getData(MdmData.DefaultHomeserverUrl, synodImUrl) private val registrationWizard: RegistrationWizard get() = authenticationService.getRegistrationWizard() @@ -233,7 +236,7 @@ class OnboardingViewModel @AssistedInject constructor( private fun handleSplashAction(action: OnboardingAction.SplashAction) { setState { copy(onboardingFlow = action.onboardingFlow) } // Changed for Synod.im: Skip server selection - handle(OnboardingAction.HomeServerChange.SelectHomeServer(matrixOrgUrl)) + handle(OnboardingAction.HomeServerChange.SelectHomeServer(synodImUrl)) // Previous code: (would show "Server Selection Screen") // continueToPageAfterSplash(action.onboardingFlow) } @@ -473,6 +476,9 @@ class OnboardingViewModel @AssistedInject constructor( ServerType.MatrixOrg -> // Request login flow here handle(OnboardingAction.HomeServerChange.SelectHomeServer(matrixOrgUrl)) + ServerType.SynodIm -> + // Request login flow here + handle(OnboardingAction.HomeServerChange.SelectHomeServer(synodImUrl)) ServerType.EMS, ServerType.Other -> _viewEvents.post(OnboardingViewEvents.OnServerSelectionDone(action.serverType)) } @@ -822,6 +828,8 @@ class OnboardingViewModel @AssistedInject constructor( private fun OnboardingViewState.alignServerTypeAfterSubmission(config: HomeServerConnectionConfig, serverTypeOverride: ServerType?): ServerType { return if (config.homeServerUri.toString() == matrixOrgUrl) { ServerType.MatrixOrg + } else if (config.homeServerUri.toString() == synodImUrl) { + ServerType.SynodIm } else { serverTypeOverride ?: serverType } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt b/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt index d3260141bc8..ecd568285db 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/RegistrationActionHandler.kt @@ -30,6 +30,7 @@ class RegistrationActionHandler @Inject constructor( ) { private val matrixOrgUrl = stringProvider.getString(im.vector.app.config.R.string.matrix_org_server_url).ensureTrailingSlash() + private val synodImUrl = stringProvider.getString(im.vector.app.config.R.string.synod_im_server_url).ensureTrailingSlash() suspend fun processAction(state: SelectedHomeserverState, action: RegisterAction): Result { val result = registrationWizardActionDelegate.executeAction(action) @@ -66,7 +67,7 @@ class RegistrationActionHandler @Inject constructor( private fun findNextStage(state: SelectedHomeserverState, flowResult: FlowResult): Result { val orderedResult = when { - state.hasSelectedMatrixOrg() && vectorFeatures.isOnboardingCombinedRegisterEnabled() -> flowResult.copy( + state.hasSelectedMatrixOrgOrSynodIm() && vectorFeatures.isOnboardingCombinedRegisterEnabled() -> flowResult.copy( missingStages = flowResult.missingStages.sortedWith(MatrixOrgRegistrationStagesComparator()) ) else -> flowResult @@ -80,7 +81,7 @@ class RegistrationActionHandler @Inject constructor( private suspend fun FlowResult.registrationShouldFallback() = vectorOverrides.forceLoginFallback.first() || missingStages.any { !it.isSupported() } - private fun SelectedHomeserverState.hasSelectedMatrixOrg() = userFacingUrl == matrixOrgUrl + private fun SelectedHomeserverState.hasSelectedMatrixOrgOrSynodIm() = userFacingUrl == matrixOrgUrl || userFacingUrl == synodImUrl sealed interface Result { data class RegistrationComplete(val session: Session) : Result diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt index 8b5127b90e4..530e2af487f 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedRegisterFragment.kt @@ -280,4 +280,5 @@ class FtueAuthCombinedRegisterFragment : private fun OnboardingViewState.isNumericOnlyUserIdForbidden() = selectedHomeserver.userFacingUrl == getString(im.vector.app.config.R.string.matrix_org_server_url) + || selectedHomeserver.userFacingUrl == getString(im.vector.app.config.R.string.synod_im_server_url) } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt index c7df2e5f5f2..912010c8ec6 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthLoginFragment.kt @@ -186,12 +186,16 @@ class FtueAuthLoginFragment : when (state.serverType) { ServerType.MatrixOrg -> { - // Changed for Synod.im: Hide matrix.org icon. - views.loginServerIcon.isVisible = false + views.loginServerIcon.isVisible = true views.loginServerIcon.setImageResource(R.drawable.ic_logo_matrix_org) views.loginTitle.text = getString(resId, state.selectedHomeserver.userFacingUrl.toReducedUrl()) views.loginNotice.text = getString(CommonStrings.login_server_matrix_org_text) } + ServerType.SynodIm -> { + views.loginServerIcon.isVisible = false + views.loginTitle.text = getString(resId, state.selectedHomeserver.userFacingUrl.toReducedUrl()) + views.loginNotice.text = getString(CommonStrings.login_server_synod_im_text) + } ServerType.EMS -> { views.loginServerIcon.isVisible = true views.loginServerIcon.setImageResource(R.drawable.ic_logo_element_matrix_services) @@ -293,7 +297,7 @@ class FtueAuthLoginFragment : override fun updateWithState(state: OnboardingViewState) { isSignupMode = state.signMode == SignMode.SignUp - isNumericOnlyUserIdForbidden = state.serverType == ServerType.MatrixOrg + isNumericOnlyUserIdForbidden = state.serverType == ServerType.MatrixOrg || state.serverType == ServerType.SynodIm setupUi(state) setupAutoFill(state) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSignUpSignInSelectionFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSignUpSignInSelectionFragment.kt index 78d8a01719d..1ded7c46799 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSignUpSignInSelectionFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthSignUpSignInSelectionFragment.kt @@ -55,11 +55,15 @@ class FtueAuthSignUpSignInSelectionFragment : private fun render(state: OnboardingViewState) { when (state.serverType) { ServerType.MatrixOrg -> renderServerInformation( - // Changed for Synod.im: Hide matrix.org icon. - icon = null, // R.drawable.ic_logo_matrix_org, + icon = R.drawable.ic_logo_matrix_org, title = getString(CommonStrings.login_connect_to, state.selectedHomeserver.userFacingUrl.toReducedUrl()), subtitle = getString(CommonStrings.login_server_matrix_org_text) ) + ServerType.SynodIm -> renderServerInformation( + icon = null, + title = getString(CommonStrings.login_connect_to, state.selectedHomeserver.userFacingUrl.toReducedUrl()), + subtitle = getString(CommonStrings.login_server_synod_im_text) + ) ServerType.EMS -> renderServerInformation( icon = R.drawable.ic_logo_element_matrix_services, title = getString(CommonStrings.login_connect_to_modular), diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt index b6d73676565..4f0671e6ea9 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthVariant.kt @@ -299,6 +299,7 @@ class FtueAuthVariant( private fun onServerSelectionDone(onboardingViewEvents: OnboardingViewEvents.OnServerSelectionDone) { when (onboardingViewEvents.serverType) { ServerType.MatrixOrg -> Unit // In this case, we wait for the login flow + ServerType.SynodIm -> Unit // In this case, we wait for the login flow ServerType.EMS, ServerType.Other -> activity.addFragmentToBackstack( views.loginFragmentContainer,