Split code in MergedRoomCreationItem

This commit is contained in:
Florian Renaud 2022-06-30 15:24:42 +02:00
parent 71320e42d0
commit c7db89613c

View File

@ -16,7 +16,6 @@
package im.vector.app.features.home.room.detail.timeline.item package im.vector.app.features.home.room.detail.timeline.item
import android.content.res.Resources
import android.text.SpannableString import android.text.SpannableString
import android.text.method.MovementMethod import android.text.method.MovementMethod
import android.text.style.ClickableSpan import android.text.style.ClickableSpan
@ -39,7 +38,6 @@ import im.vector.app.features.home.room.detail.RoomDetailAction
import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.home.room.detail.timeline.TimelineEventController
import im.vector.app.features.home.room.detail.timeline.tools.linkify import im.vector.app.features.home.room.detail.timeline.tools.linkify
import me.gujun.android.span.span import me.gujun.android.span.span
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.localecho.RoomLocalEcho import org.matrix.android.sdk.api.session.room.model.localecho.RoomLocalEcho
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
@ -53,6 +51,14 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var movementMethod: MovementMethod? = null var movementMethod: MovementMethod? = null
private val roomSummary
get() = attributes.roomSummary
private val isDirectRoom
get() = distinctMergeData.lastOrNull()?.isDirectRoom
?: roomSummary?.isDirect
?: false
override fun getViewStubId() = STUB_ID override fun getViewStubId() = STUB_ID
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
@ -67,7 +73,7 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
if (attributes.isCollapsed) { if (attributes.isCollapsed) {
// Take the oldest data // Take the oldest data
val data = distinctMergeData.lastOrNull() val data = distinctMergeData.lastOrNull()
holder.summaryView.text = getSummaryText(holder.expandView.resources, data) renderSummaryText(holder, data)
holder.summaryView.visibility = View.VISIBLE holder.summaryView.visibility = View.VISIBLE
if (data != null) { if (data != null) {
holder.avatarView.visibility = View.VISIBLE holder.avatarView.visibility = View.VISIBLE
@ -75,7 +81,7 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
} else { } else {
holder.avatarView.visibility = View.GONE holder.avatarView.visibility = View.GONE
} }
bindEncryptionTile(holder, data) bindEncryptionTile(holder)
} else { } else {
holder.avatarView.visibility = View.INVISIBLE holder.avatarView.visibility = View.INVISIBLE
holder.summaryView.visibility = View.GONE holder.summaryView.visibility = View.GONE
@ -83,9 +89,9 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
} }
} }
private fun getSummaryText(resources: Resources, data: Data?): String { private fun renderSummaryText(holder: Holder, data: Data?) {
val resources = holder.expandView.resources
val createdFromCurrentUser = data?.userId == attributes.currentUserId val createdFromCurrentUser = data?.userId == attributes.currentUserId
val isDirectRoom = data?.isDirectRoom.orFalse()
val summary = if (createdFromCurrentUser) { val summary = if (createdFromCurrentUser) {
if (isDirectRoom) { if (isDirectRoom) {
resources.getString(R.string.direct_room_created_summary_item_by_you) resources.getString(R.string.direct_room_created_summary_item_by_you)
@ -99,39 +105,28 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
resources.getString(R.string.room_created_summary_item, data?.memberName.orEmpty()) resources.getString(R.string.room_created_summary_item, data?.memberName.orEmpty())
} }
} }
return summary holder.summaryView.text = summary
} }
private fun bindEncryptionTile(holder: Holder, data: Data?) { private fun bindEncryptionTile(holder: Holder) {
if (attributes.hasEncryptionEvent) { if (attributes.hasEncryptionEvent) {
holder.encryptionTile.isVisible = true holder.encryptionTile.isVisible = true
holder.encryptionTile.updateLayoutParams<ConstraintLayout.LayoutParams> { holder.encryptionTile.updateLayoutParams<ConstraintLayout.LayoutParams> {
this.marginEnd = leftGuideline this.marginEnd = leftGuideline
} }
if (attributes.isEncryptionAlgorithmSecure) { if (attributes.isEncryptionAlgorithmSecure) {
holder.e2eTitleTextView.text = holder.expandView.resources.getString(R.string.encryption_enabled) renderE2ESecureTile(holder)
holder.e2eTitleDescriptionView.text = getE2ESecureDescriptionText(holder.expandView.resources, data)
holder.e2eTitleDescriptionView.textAlignment = View.TEXT_ALIGNMENT_CENTER
holder.e2eTitleTextView.setCompoundDrawablesWithIntrinsicBounds(
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_shield_black),
null, null, null
)
} else { } else {
holder.e2eTitleTextView.text = holder.expandView.resources.getString(R.string.encryption_not_enabled) renderE2EUnsecureTile(holder)
holder.e2eTitleDescriptionView.text = holder.expandView.resources.getString(R.string.encryption_unknown_algorithm_tile_description)
holder.e2eTitleTextView.setCompoundDrawablesWithIntrinsicBounds(
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_shield_warning),
null, null, null
)
} }
} else { } else {
holder.encryptionTile.isVisible = false holder.encryptionTile.isVisible = false
} }
} }
private fun getE2ESecureDescriptionText(resources: Resources, data: Data?): String { private fun renderE2ESecureTile(holder: Holder) {
val isDirectRoom = data?.isDirectRoom.orFalse() val resources = holder.expandView.resources
return when { val description = when {
isDirectRoom -> { isDirectRoom -> {
if (attributes.isLocalRoom) { if (attributes.isLocalRoom) {
resources.getString(R.string.direct_room_encryption_enabled_tile_description_future) resources.getString(R.string.direct_room_encryption_enabled_tile_description_future)
@ -143,65 +138,36 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
resources.getString(R.string.encryption_enabled_tile_description) resources.getString(R.string.encryption_enabled_tile_description)
} }
} }
holder.e2eTitleTextView.text = holder.expandView.resources.getString(R.string.encryption_enabled)
holder.e2eTitleTextView.setCompoundDrawablesWithIntrinsicBounds(
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_shield_black),
null, null, null
)
holder.e2eTitleDescriptionView.text = description
holder.e2eTitleDescriptionView.textAlignment = View.TEXT_ALIGNMENT_CENTER
}
private fun renderE2EUnsecureTile(holder: Holder) {
holder.e2eTitleTextView.text = holder.expandView.resources.getString(R.string.encryption_not_enabled)
holder.e2eTitleDescriptionView.text = holder.expandView.resources.getString(R.string.encryption_unknown_algorithm_tile_description)
holder.e2eTitleTextView.setCompoundDrawablesWithIntrinsicBounds(
ContextCompat.getDrawable(holder.view.context, R.drawable.ic_shield_warning),
null, null, null
)
} }
private fun bindCreationSummaryTile(holder: Holder) { private fun bindCreationSummaryTile(holder: Holder) {
val roomSummary = attributes.roomSummary
val roomDisplayName = roomSummary?.displayName val roomDisplayName = roomSummary?.displayName
holder.roomNameText.setTextOrHide(roomDisplayName)
val isDirect = roomSummary?.isDirect == true
val membersCount = roomSummary?.otherMemberIds?.size ?: 0 val membersCount = roomSummary?.otherMemberIds?.size ?: 0
when { holder.roomNameText.setTextOrHide(roomDisplayName)
isDirect -> { renderRoomDescription(holder)
if (attributes.isLocalRoom) { renderRoomTopic(holder)
holder.roomDescriptionText.text = holder.view.resources.getString(
R.string.send_your_first_msg_to_invite,
roomSummary?.displayName.orEmpty()
)
} else {
holder.roomDescriptionText.text = holder.view.resources.getString(
R.string.this_is_the_beginning_of_dm,
roomSummary?.displayName.orEmpty()
)
}
}
roomDisplayName.isNullOrBlank() || roomSummary.name.isBlank() -> {
holder.roomDescriptionText.text = holder.view.resources.getString(R.string.this_is_the_beginning_of_room_no_name)
}
else -> {
holder.roomDescriptionText.text = holder.view.resources.getString(R.string.this_is_the_beginning_of_room, roomDisplayName)
}
}
val topic = roomSummary?.topic
if (topic.isNullOrBlank()) {
// do not show hint for DMs or group DMs
val canSetTopic = attributes.canChangeTopic && !isDirect
if (canSetTopic) {
val addTopicLink = holder.view.resources.getString(R.string.add_a_topic_link_text)
val styledText = SpannableString(holder.view.resources.getString(R.string.room_created_summary_no_topic_creation_text, addTopicLink))
holder.roomTopicText.setTextOrHide(styledText.tappableMatchingText(addTopicLink, object : ClickableSpan() {
override fun onClick(widget: View) {
attributes.callback?.onTimelineItemAction(RoomDetailAction.QuickActionSetTopic)
}
}))
}
} else {
holder.roomTopicText.setTextOrHide(
span {
span(holder.view.resources.getString(R.string.topic_prefix)) {
textStyle = "bold"
}
+topic.linkify(attributes.callback)
}
)
}
holder.roomTopicText.movementMethod = movementMethod
val roomItem = roomSummary?.toMatrixItem() val roomItem = roomSummary?.toMatrixItem()
val shouldSetAvatar = attributes.canChangeAvatar && val shouldSetAvatar = attributes.canChangeAvatar &&
(roomSummary?.isDirect == false || (isDirect && membersCount >= 2)) && (roomSummary?.isDirect == false || (isDirectRoom && membersCount >= 2)) &&
roomItem?.avatarUrl.isNullOrBlank() roomItem?.avatarUrl.isNullOrBlank()
holder.roomAvatarImageView.isVisible = roomItem != null holder.roomAvatarImageView.isVisible = roomItem != null
@ -224,7 +190,7 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
} }
} }
val canInvite = attributes.canInvite && !isDirect val canInvite = attributes.canInvite && !isDirectRoom
holder.addPeopleButton.isVisible = canInvite holder.addPeopleButton.isVisible = canInvite
if (canInvite) { if (canInvite) {
holder.addPeopleButton.onClick { holder.addPeopleButton.onClick {
@ -233,6 +199,58 @@ abstract class MergedRoomCreationItem : BasedMergedItem<MergedRoomCreationItem.H
} }
} }
private fun renderRoomDescription(holder: Holder) {
val roomDisplayName = roomSummary?.displayName
when {
isDirectRoom -> {
if (attributes.isLocalRoom) {
holder.roomDescriptionText.text = holder.view.resources.getString(
R.string.send_your_first_msg_to_invite,
roomSummary?.displayName.orEmpty()
)
} else {
holder.roomDescriptionText.text = holder.view.resources.getString(
R.string.this_is_the_beginning_of_dm,
roomSummary?.displayName.orEmpty()
)
}
}
roomDisplayName.isNullOrBlank() || roomSummary?.name.isNullOrBlank() -> {
holder.roomDescriptionText.text = holder.view.resources.getString(R.string.this_is_the_beginning_of_room_no_name)
}
else -> {
holder.roomDescriptionText.text = holder.view.resources.getString(R.string.this_is_the_beginning_of_room, roomDisplayName)
}
}
}
private fun renderRoomTopic(holder: Holder) {
val topic = roomSummary?.topic
if (topic.isNullOrBlank()) {
// do not show hint for DMs or group DMs
val canSetTopic = attributes.canChangeTopic && !isDirectRoom
if (canSetTopic) {
val addTopicLink = holder.view.resources.getString(R.string.add_a_topic_link_text)
val styledText = SpannableString(holder.view.resources.getString(R.string.room_created_summary_no_topic_creation_text, addTopicLink))
holder.roomTopicText.setTextOrHide(styledText.tappableMatchingText(addTopicLink, object : ClickableSpan() {
override fun onClick(widget: View) {
attributes.callback?.onTimelineItemAction(RoomDetailAction.QuickActionSetTopic)
}
}))
}
} else {
holder.roomTopicText.setTextOrHide(
span {
span(holder.view.resources.getString(R.string.topic_prefix)) {
textStyle = "bold"
}
+topic.linkify(attributes.callback)
}
)
}
holder.roomTopicText.movementMethod = movementMethod
}
class Holder : BasedMergedItem.Holder(STUB_ID) { class Holder : BasedMergedItem.Holder(STUB_ID) {
val mergedView by bind<View>(R.id.mergedSumContainer) val mergedView by bind<View>(R.id.mergedSumContainer)
val summaryView by bind<TextView>(R.id.itemNoticeTextView) val summaryView by bind<TextView>(R.id.itemNoticeTextView)