binding the indentity server policy urls to the discovery page

This commit is contained in:
Adam Brown 2021-10-06 16:23:33 +01:00
parent 04d844b1a9
commit 7ce811c227
4 changed files with 65 additions and 33 deletions

View File

@ -26,11 +26,14 @@ import im.vector.app.R
import im.vector.app.core.epoxy.attributes.ButtonStyle
import im.vector.app.core.epoxy.attributes.ButtonType
import im.vector.app.core.epoxy.attributes.IconMode
import im.vector.app.core.epoxy.expandableTextItem
import im.vector.app.core.epoxy.loadingItem
import im.vector.app.core.error.ErrorFormatter
import im.vector.app.core.extensions.getFormattedValue
import im.vector.app.core.resources.ColorProvider
import im.vector.app.core.resources.StringProvider
import im.vector.app.core.utils.EvenBetterLinkMovementMethod
import org.matrix.android.sdk.api.extensions.appendNl
import org.matrix.android.sdk.api.failure.Failure
import org.matrix.android.sdk.api.session.identity.SharedState
import org.matrix.android.sdk.api.session.identity.ThreePid
@ -105,8 +108,9 @@ class DiscoverySettingsController @Inject constructor(
}
}
private fun buildIdentityServerSection(data: DiscoverySettingsState) {
val identityServer = data.identityServer()?.serverUrl ?: stringProvider.getString(R.string.none)
private fun buildIdentityServerSection(data: DiscoverySettingsState, ) {
val identityServer = data.identityServer()
val identityServerUrl = identityServer?.serverUrl ?: stringProvider.getString(R.string.none)
val host = this
settingsSectionTitleItem {
@ -116,28 +120,43 @@ class DiscoverySettingsController @Inject constructor(
settingsItem {
id("idServer")
title(identityServer)
title(identityServerUrl)
}
if (data.identityServer() != null && data.termsNotSigned) {
val policyUrls = identityServer?.policyUrls?.joinToString(separator = "\n") { it }
if (policyUrls != null) {
val title = stringProvider.getString(R.string.settings_discovery_identity_server_policies_title)
expandableTextItem {
id("policy-urls")
maxLines(1)
enableScrollBar(false)
content(buildString {
append(title)
appendNl(policyUrls)
})
movementMethod(EvenBetterLinkMovementMethod())
}
}
if (identityServer != null && data.termsNotSigned) {
settingsInfoItem {
id("idServerFooter")
helperText(host.stringProvider.getString(R.string.settings_agree_to_terms, identityServer))
helperText(host.stringProvider.getString(R.string.settings_agree_to_terms, identityServerUrl))
showCompoundDrawable(true)
itemClickListener { host.listener?.openIdentityServerTerms() }
}
settingsButtonItem {
id("seeTerms")
colorProvider(host.colorProvider)
buttonTitle(host.stringProvider.getString(R.string.open_terms_of, identityServer))
buttonTitle(host.stringProvider.getString(R.string.open_terms_of, identityServerUrl))
buttonClickListener { host.listener?.openIdentityServerTerms() }
}
} else {
settingsInfoItem {
id("idServerFooter")
showCompoundDrawable(false)
if (data.identityServer() != null) {
helperText(host.stringProvider.getString(R.string.settings_discovery_identity_server_info, identityServer))
if (identityServer != null) {
helperText(host.stringProvider.getString(R.string.settings_discovery_identity_server_info, identityServerUrl))
} else {
helperTextResId(R.string.settings_discovery_identity_server_info_none)
}
@ -147,7 +166,7 @@ class DiscoverySettingsController @Inject constructor(
settingsButtonItem {
id("change")
colorProvider(host.colorProvider)
if (data.identityServer() == null) {
if (identityServer == null) {
buttonTitleId(R.string.add_identity_server)
} else {
buttonTitleId(R.string.change_identity_server)
@ -155,7 +174,7 @@ class DiscoverySettingsController @Inject constructor(
buttonClickListener { host.listener?.onTapChangeIdentityServer() }
}
if (data.identityServer() != null) {
if (identityServer != null) {
settingsInfoItem {
id("removeInfo")
helperTextResId(R.string.settings_discovery_disconnect_identity_server_info)

View File

@ -31,6 +31,6 @@ data class DiscoverySettingsState(
) : MvRxState
data class IdentityServerWithTerms(
val serverUrl: String?,
val terms: List<LocalizedFlowDataLoginTerms>
val serverUrl: String,
val policyUrls: List<String>
)

View File

@ -67,32 +67,27 @@ class DiscoverySettingsViewModel @AssistedInject constructor(
private val identityServerManagerListener = object : IdentityServiceListener {
override fun onIdentityServerChange() = withState { state ->
viewModelScope.launch {
val identityServer = fetchIdentityServerWithTerms()
val currentIS = state.identityServer()
setState {
copy(
identityServer = Success(identityServer),
userConsent = identityService.getUserConsent()
)
}
if (currentIS != identityServer) retrieveBinding()
runCatching { fetchIdentityServerWithTerms() }.fold(
onSuccess = {
val currentIS = state.identityServer()
setState {
copy(
identityServer = Success(it),
userConsent = identityService.getUserConsent()
)
}
if (currentIS != it) retrieveBinding()
},
onFailure = { _viewEvents.post(DiscoverySettingsViewEvents.Failure(it)) }
)
}
}
}
private suspend fun fetchIdentityServerWithTerms(): IdentityServerWithTerms {
val identityServerUrl = identityService.getCurrentIdentityServerUrl()
val policies = if (identityServerUrl == null) emptyList() else {
val terms = termsService.getTerms(TermsService.ServiceType.IdentityService, identityServerUrl.ensureProtocol())
terms.serverResponse.getLocalizedTerms(stringProvider.getString(R.string.resources_language))
}
return IdentityServerWithTerms(identityServerUrl, policies)
}
init {
setState {
copy(
identityServer = Success(IdentityServerWithTerms(identityService.getCurrentIdentityServerUrl(), emptyList())),
identityServer = Success(identityService.getCurrentIdentityServerUrl()?.let { IdentityServerWithTerms(it, emptyList()) }),
userConsent = identityService.getUserConsent()
)
}
@ -116,7 +111,7 @@ class DiscoverySettingsViewModel @AssistedInject constructor(
override fun handle(action: DiscoverySettingsAction) {
when (action) {
DiscoverySettingsAction.Refresh -> refreshPendingEmailBindings()
DiscoverySettingsAction.Refresh -> fetchContent()
DiscoverySettingsAction.RetrieveBinding -> retrieveBinding()
DiscoverySettingsAction.DisconnectIdentityServer -> disconnectIdentityServer()
is DiscoverySettingsAction.ChangeIdentityServer -> changeIdentityServer(action)
@ -395,12 +390,29 @@ class DiscoverySettingsViewModel @AssistedInject constructor(
}
}
private fun refreshPendingEmailBindings() = withState { state ->
private fun fetchContent() = withState { state ->
state.emailList()?.forEach { info ->
when (info.isShared()) {
SharedState.BINDING_IN_PROGRESS -> finalizeBind3pid(DiscoverySettingsAction.FinalizeBind3pid(info.threePid), false)
else -> Unit
}
}
viewModelScope.launch {
runCatching { fetchIdentityServerWithTerms() }.fold(
onSuccess = { setState { copy(identityServer = Success(it)) } },
onFailure = { _viewEvents.post(DiscoverySettingsViewEvents.Failure(it)) }
)
}
}
private suspend fun fetchIdentityServerWithTerms(): IdentityServerWithTerms? {
val identityServerUrl = identityService.getCurrentIdentityServerUrl()
return identityServerUrl?.let {
val terms = termsService.getTerms(TermsService.ServiceType.IdentityService, identityServerUrl.ensureProtocol())
.serverResponse
.getLocalizedTerms(stringProvider.getString(R.string.resources_language))
val policyUrls = terms.mapNotNull { it.localizedUrl }
IdentityServerWithTerms(identityServerUrl, policyUrls)
}
}
}

View File

@ -2349,6 +2349,7 @@
<string name="add_identity_server">Configure identity server</string>
<string name="open_discovery_settings">Open Discovery Settings</string>
<string name="change_identity_server">Change identity server</string>
<string name="settings_discovery_identity_server_policies_title">Identity server policy</string>
<string name="settings_discovery_identity_server_info">You are currently using %1$s to discover and be discoverable by existing contacts you know.</string>
<string name="settings_discovery_identity_server_info_none">You are not currently using an identity server. To discover and be discoverable by existing contacts you know, configure one below.</string>
<string name="settings_discovery_emails_title">Discoverable email addresses</string>