binding the expanded state as part of the view, allows us to manually control the expansion

This commit is contained in:
Adam Brown 2021-10-06 17:16:57 +01:00
parent 7ce811c227
commit 5a4f320bf9
6 changed files with 59 additions and 19 deletions

View File

@ -43,7 +43,13 @@ abstract class ExpandableTextItem : VectorEpoxyModel<ExpandableTextItem.Holder>(
@EpoxyAttribute @EpoxyAttribute
var enableScrollBar = true var enableScrollBar = true
private var isExpanded = false @EpoxyAttribute
var expanded: Boolean? = null
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var onExpandClicked: () -> Unit? = {}
private var internalIsExpanded = false
private var expandedLines = 0 private var expandedLines = 0
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
@ -53,18 +59,31 @@ abstract class ExpandableTextItem : VectorEpoxyModel<ExpandableTextItem.Holder>(
holder.content.copyOnLongClick() holder.content.copyOnLongClick()
holder.content.movementMethod = movementMethod holder.content.movementMethod = movementMethod
if (expanded == null) {
holder.view.setOnClickListener {
if (internalIsExpanded) {
collapse(holder)
} else {
expand(holder)
}
}
} else {
holder.view.setOnClickListener { onExpandClicked() }
}
holder.content.doOnPreDraw { holder.content.doOnPreDraw {
if (holder.content.lineCount > maxLines) { if (holder.content.lineCount > maxLines) {
expandedLines = holder.content.lineCount expandedLines = holder.content.lineCount
holder.content.maxLines = maxLines holder.content.maxLines = maxLines
holder.view.setOnClickListener { expanded?.let { expanded ->
if (isExpanded) { if (expanded) {
collapse(holder)
} else {
expand(holder) expand(holder)
} else {
collapse(holder)
} }
} }
holder.arrow.isVisible = true holder.arrow.isVisible = true
} else { } else {
holder.arrow.isVisible = false holder.arrow.isVisible = false
@ -81,7 +100,7 @@ abstract class ExpandableTextItem : VectorEpoxyModel<ExpandableTextItem.Holder>(
holder.content.ellipsize = null holder.content.ellipsize = null
holder.arrow.setImageResource(R.drawable.ic_expand_less) holder.arrow.setImageResource(R.drawable.ic_expand_less)
holder.arrow.contentDescription = holder.view.context.getString(R.string.merged_events_collapse) holder.arrow.contentDescription = holder.view.context.getString(R.string.merged_events_collapse)
isExpanded = true internalIsExpanded = true
} }
private fun collapse(holder: Holder) { private fun collapse(holder: Holder) {
@ -93,7 +112,7 @@ abstract class ExpandableTextItem : VectorEpoxyModel<ExpandableTextItem.Holder>(
holder.content.ellipsize = TextUtils.TruncateAt.END holder.content.ellipsize = TextUtils.TruncateAt.END
holder.arrow.setImageResource(R.drawable.ic_expand_more) holder.arrow.setImageResource(R.drawable.ic_expand_more)
holder.arrow.contentDescription = holder.view.context.getString(R.string.merged_events_expand) holder.arrow.contentDescription = holder.view.context.getString(R.string.merged_events_expand)
isExpanded = false internalIsExpanded = false
} }
class Holder : VectorEpoxyHolder() { class Holder : VectorEpoxyHolder() {

View File

@ -31,4 +31,5 @@ sealed class DiscoverySettingsAction : VectorViewModelAction {
data class FinalizeBind3pid(val threePid: ThreePid) : DiscoverySettingsAction() data class FinalizeBind3pid(val threePid: ThreePid) : DiscoverySettingsAction()
data class SubmitMsisdnToken(val threePid: ThreePid.Msisdn, val code: String) : DiscoverySettingsAction() data class SubmitMsisdnToken(val threePid: ThreePid.Msisdn, val code: String) : DiscoverySettingsAction()
data class CancelBinding(val threePid: ThreePid) : DiscoverySettingsAction() data class CancelBinding(val threePid: ThreePid) : DiscoverySettingsAction()
object PolicyUrlsExpandedStateToggled : DiscoverySettingsAction()
} }

View File

@ -15,6 +15,7 @@
*/ */
package im.vector.app.features.discovery package im.vector.app.features.discovery
import android.text.method.LinkMovementMethod
import com.airbnb.epoxy.TypedEpoxyController import com.airbnb.epoxy.TypedEpoxyController
import com.airbnb.mvrx.Async import com.airbnb.mvrx.Async
import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Fail
@ -134,7 +135,11 @@ class DiscoverySettingsController @Inject constructor(
append(title) append(title)
appendNl(policyUrls) appendNl(policyUrls)
}) })
movementMethod(EvenBetterLinkMovementMethod()) movementMethod(LinkMovementMethod())
expanded(data.isIdentityPolicyUrlsExpanded)
onExpandClicked {
host.listener?.onPolicyUrlsExpandedStateToggled()
}
} }
} }
@ -419,5 +424,6 @@ class DiscoverySettingsController @Inject constructor(
fun onTapDisconnectIdentityServer() fun onTapDisconnectIdentityServer()
fun onTapUpdateUserConsent(newValue: Boolean) fun onTapUpdateUserConsent(newValue: Boolean)
fun onTapRetryToRetrieveBindings() fun onTapRetryToRetrieveBindings()
fun onPolicyUrlsExpandedStateToggled()
} }
} }

View File

@ -192,6 +192,10 @@ class DiscoverySettingsFragment @Inject constructor(
viewModel.handle(DiscoverySettingsAction.RetrieveBinding) viewModel.handle(DiscoverySettingsAction.RetrieveBinding)
} }
override fun onPolicyUrlsExpandedStateToggled() {
viewModel.handle(DiscoverySettingsAction.PolicyUrlsExpandedStateToggled)
}
private fun navigateToChangeIdentityServerFragment() { private fun navigateToChangeIdentityServerFragment() {
(vectorBaseActivity as? VectorSettingsActivity)?.navigateTo(SetIdentityServerFragment::class.java) (vectorBaseActivity as? VectorSettingsActivity)?.navigateTo(SetIdentityServerFragment::class.java)
} }

View File

@ -27,7 +27,8 @@ data class DiscoverySettingsState(
val phoneNumbersList: Async<List<PidInfo>> = Uninitialized, val phoneNumbersList: Async<List<PidInfo>> = Uninitialized,
// Can be true if terms are updated // Can be true if terms are updated
val termsNotSigned: Boolean = false, val termsNotSigned: Boolean = false,
val userConsent: Boolean = false val userConsent: Boolean = false,
val isIdentityPolicyUrlsExpanded: Boolean = false
) : MvRxState ) : MvRxState
data class IdentityServerWithTerms( data class IdentityServerWithTerms(

View File

@ -111,16 +111,17 @@ class DiscoverySettingsViewModel @AssistedInject constructor(
override fun handle(action: DiscoverySettingsAction) { override fun handle(action: DiscoverySettingsAction) {
when (action) { when (action) {
DiscoverySettingsAction.Refresh -> fetchContent() DiscoverySettingsAction.Refresh -> fetchContent()
DiscoverySettingsAction.RetrieveBinding -> retrieveBinding() DiscoverySettingsAction.RetrieveBinding -> retrieveBinding()
DiscoverySettingsAction.DisconnectIdentityServer -> disconnectIdentityServer() DiscoverySettingsAction.DisconnectIdentityServer -> disconnectIdentityServer()
is DiscoverySettingsAction.ChangeIdentityServer -> changeIdentityServer(action) DiscoverySettingsAction.PolicyUrlsExpandedStateToggled -> toggleExpandedPolicyUrlsState()
is DiscoverySettingsAction.UpdateUserConsent -> handleUpdateUserConsent(action) is DiscoverySettingsAction.ChangeIdentityServer -> changeIdentityServer(action)
is DiscoverySettingsAction.RevokeThreePid -> revokeThreePid(action) is DiscoverySettingsAction.UpdateUserConsent -> handleUpdateUserConsent(action)
is DiscoverySettingsAction.ShareThreePid -> shareThreePid(action) is DiscoverySettingsAction.RevokeThreePid -> revokeThreePid(action)
is DiscoverySettingsAction.FinalizeBind3pid -> finalizeBind3pid(action, true) is DiscoverySettingsAction.ShareThreePid -> shareThreePid(action)
is DiscoverySettingsAction.SubmitMsisdnToken -> submitMsisdnToken(action) is DiscoverySettingsAction.FinalizeBind3pid -> finalizeBind3pid(action, true)
is DiscoverySettingsAction.CancelBinding -> cancelBinding(action) is DiscoverySettingsAction.SubmitMsisdnToken -> submitMsisdnToken(action)
is DiscoverySettingsAction.CancelBinding -> cancelBinding(action)
}.exhaustive }.exhaustive
} }
@ -147,6 +148,14 @@ class DiscoverySettingsViewModel @AssistedInject constructor(
} }
} }
private fun toggleExpandedPolicyUrlsState() {
withState {
setState {
copy(isIdentityPolicyUrlsExpanded = !it.isIdentityPolicyUrlsExpanded)
}
}
}
private fun changeIdentityServer(action: DiscoverySettingsAction.ChangeIdentityServer) { private fun changeIdentityServer(action: DiscoverySettingsAction.ChangeIdentityServer) {
setState { copy(identityServer = Loading()) } setState { copy(identityServer = Loading()) }