Fix / ripple effect after merging

This commit is contained in:
Valere 2019-05-08 10:33:14 +02:00
parent b00bff0af5
commit 38abf31889
7 changed files with 40 additions and 20 deletions

View file

@ -17,8 +17,10 @@
package im.vector.riotredesign.features.home.room.detail.timeline.factory package im.vector.riotredesign.features.home.room.detail.timeline.factory
import android.text.Spannable import android.text.Spannable
import android.text.SpannableString
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import androidx.annotation.ColorRes import androidx.annotation.ColorRes
import androidx.core.text.toSpannable
import im.vector.matrix.android.api.permalinks.MatrixLinkify import im.vector.matrix.android.api.permalinks.MatrixLinkify
import im.vector.matrix.android.api.permalinks.MatrixPermalinkSpan import im.vector.matrix.android.api.permalinks.MatrixPermalinkSpan
import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.EventType
@ -84,16 +86,16 @@ class MessageItemFactory(private val colorProvider: ColorProvider,
return when (messageContent) { return when (messageContent) {
is MessageEmoteContent -> buildEmoteMessageItem(eventId, messageContent, informationData, callback) is MessageEmoteContent -> buildEmoteMessageItem(eventId, messageContent, informationData, callback)
is MessageTextContent -> buildTextMessageItem(eventId, event.sendState, messageContent, informationData, callback) is MessageTextContent -> buildTextMessageItem(eventId, event.sendState, messageContent, informationData, callback)
is MessageImageContent -> buildImageMessageItem(messageContent, informationData, callback) is MessageImageContent -> buildImageMessageItem(eventId, messageContent, informationData, callback)
is MessageNoticeContent -> buildNoticeMessageItem(eventId, messageContent, informationData, callback) is MessageNoticeContent -> buildNoticeMessageItem(eventId, messageContent, informationData, callback)
is MessageVideoContent -> buildVideoMessageItem(messageContent, informationData, callback) is MessageVideoContent -> buildVideoMessageItem(eventId, messageContent, informationData, callback)
is MessageFileContent -> buildFileMessageItem(messageContent, informationData, callback) is MessageFileContent -> buildFileMessageItem(eventId, messageContent, informationData, callback)
is MessageAudioContent -> buildAudioMessageItem(messageContent, informationData, callback) is MessageAudioContent -> buildAudioMessageItem(eventId, messageContent, informationData, callback)
else -> buildNotHandledMessageItem(messageContent) else -> buildNotHandledMessageItem(messageContent)
} }
} }
private fun buildAudioMessageItem(messageContent: MessageAudioContent, private fun buildAudioMessageItem(eventId: String, messageContent: MessageAudioContent,
informationData: MessageInformationData, informationData: MessageInformationData,
callback: TimelineEventController.Callback?): MessageFileItem? { callback: TimelineEventController.Callback?): MessageFileItem? {
return MessageFileItem_() return MessageFileItem_()
@ -101,9 +103,13 @@ class MessageItemFactory(private val colorProvider: ColorProvider,
.filename(messageContent.body) .filename(messageContent.body)
.iconRes(R.drawable.filetype_audio) .iconRes(R.drawable.filetype_audio)
.clickListener { _ -> callback?.onAudioMessageClicked(messageContent) } .clickListener { _ -> callback?.onAudioMessageClicked(messageContent) }
.longClickListener { view ->
return@longClickListener callback?.onEventLongClicked(eventId, informationData, messageContent, view)
?: false
}
} }
private fun buildFileMessageItem(messageContent: MessageFileContent, private fun buildFileMessageItem(eventId: String, messageContent: MessageFileContent,
informationData: MessageInformationData, informationData: MessageInformationData,
callback: TimelineEventController.Callback?): MessageFileItem? { callback: TimelineEventController.Callback?): MessageFileItem? {
return MessageFileItem_() return MessageFileItem_()
@ -111,6 +117,10 @@ class MessageItemFactory(private val colorProvider: ColorProvider,
.filename(messageContent.body) .filename(messageContent.body)
.iconRes(R.drawable.filetype_attachment) .iconRes(R.drawable.filetype_attachment)
.clickListener { _ -> callback?.onFileMessageClicked(messageContent) } .clickListener { _ -> callback?.onFileMessageClicked(messageContent) }
.longClickListener { view ->
return@longClickListener callback?.onEventLongClicked(eventId, informationData, messageContent, view)
?: false
}
} }
private fun buildNotHandledMessageItem(messageContent: MessageContent): DefaultItem? { private fun buildNotHandledMessageItem(messageContent: MessageContent): DefaultItem? {
@ -118,7 +128,7 @@ class MessageItemFactory(private val colorProvider: ColorProvider,
return DefaultItem_().text(text) return DefaultItem_().text(text)
} }
private fun buildImageMessageItem(messageContent: MessageImageContent, private fun buildImageMessageItem(eventId: String, messageContent: MessageImageContent,
informationData: MessageInformationData, informationData: MessageInformationData,
callback: TimelineEventController.Callback?): MessageImageVideoItem? { callback: TimelineEventController.Callback?): MessageImageVideoItem? {
@ -138,9 +148,13 @@ class MessageItemFactory(private val colorProvider: ColorProvider,
.informationData(informationData) .informationData(informationData)
.mediaData(data) .mediaData(data)
.clickListener { view -> callback?.onImageMessageClicked(messageContent, data, view) } .clickListener { view -> callback?.onImageMessageClicked(messageContent, data, view) }
.longClickListener { view ->
return@longClickListener callback?.onEventLongClicked(eventId, informationData, messageContent, view)
?: false
}
} }
private fun buildVideoMessageItem(messageContent: MessageVideoContent, private fun buildVideoMessageItem(eventId: String, messageContent: MessageVideoContent,
informationData: MessageInformationData, informationData: MessageInformationData,
callback: TimelineEventController.Callback?): MessageImageVideoItem? { callback: TimelineEventController.Callback?): MessageImageVideoItem? {
@ -165,6 +179,10 @@ class MessageItemFactory(private val colorProvider: ColorProvider,
.informationData(informationData) .informationData(informationData)
.mediaData(thumbnailData) .mediaData(thumbnailData)
.clickListener { view -> callback?.onVideoMessageClicked(messageContent, videoData, view) } .clickListener { view -> callback?.onVideoMessageClicked(messageContent, videoData, view) }
.longClickListener { view ->
return@longClickListener callback?.onEventLongClicked(eventId, informationData, messageContent, view)
?: false
}
} }
private fun buildTextMessageItem(eventId: String, sendState: SendState, private fun buildTextMessageItem(eventId: String, sendState: SendState,
@ -224,7 +242,7 @@ class MessageItemFactory(private val colorProvider: ColorProvider,
} }
} }
private fun linkifyBody(body: CharSequence, callback: TimelineEventController.Callback?): Spannable { private fun linkifyBody(body: CharSequence, callback: TimelineEventController.Callback?): CharSequence {
val spannable = SpannableStringBuilder(body) val spannable = SpannableStringBuilder(body)
MatrixLinkify.addLinks(spannable, object : MatrixPermalinkSpan.Callback { MatrixLinkify.addLinks(spannable, object : MatrixPermalinkSpan.Callback {
override fun onUrlClicked(url: String) { override fun onUrlClicked(url: String) {

View file

@ -46,6 +46,7 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : VectorEpoxyModel<H>()
holder.timeView.visibility = View.GONE holder.timeView.visibility = View.GONE
} }
holder.view.setOnLongClickListener(longClickListener) holder.view.setOnLongClickListener(longClickListener)
} }
protected fun View.renderSendState() { protected fun View.renderSendState() {

View file

@ -39,6 +39,7 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
ImageContentRenderer.render(mediaData, ImageContentRenderer.Mode.THUMBNAIL, holder.imageView) ImageContentRenderer.render(mediaData, ImageContentRenderer.Mode.THUMBNAIL, holder.imageView)
ContentUploadStateTrackerBinder.bind(informationData.eventId, mediaData, holder.progressLayout) ContentUploadStateTrackerBinder.bind(informationData.eventId, mediaData, holder.progressLayout)
holder.imageView.setOnClickListener(clickListener) holder.imageView.setOnClickListener(clickListener)
holder.imageView.setOnLongClickListener(longClickListener)
holder.imageView.renderSendState() holder.imageView.renderSendState()
holder.playContentView.visibility = if (playable) View.VISIBLE else View.GONE holder.playContentView.visibility = if (playable) View.VISIBLE else View.GONE
} }

View file

@ -21,6 +21,7 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.core.text.PrecomputedTextCompat import androidx.core.text.PrecomputedTextCompat
import androidx.core.text.toSpannable
import androidx.core.widget.TextViewCompat import androidx.core.widget.TextViewCompat
import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyAttribute
import com.airbnb.epoxy.EpoxyModelClass import com.airbnb.epoxy.EpoxyModelClass
@ -35,7 +36,7 @@ import kotlinx.coroutines.withContext
@EpoxyModelClass(layout = R.layout.item_timeline_event_text_message) @EpoxyModelClass(layout = R.layout.item_timeline_event_text_message)
abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() { abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
@EpoxyAttribute var message: Spannable? = null @EpoxyAttribute var message: CharSequence? = null
@EpoxyAttribute override lateinit var informationData: MessageInformationData @EpoxyAttribute override lateinit var informationData: MessageInformationData
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
@ -53,7 +54,7 @@ abstract class MessageTextItem : AbsMessageItem<MessageTextItem.Holder>() {
private fun findPillsAndProcess(processBlock: (span: PillImageSpan) -> Unit) { private fun findPillsAndProcess(processBlock: (span: PillImageSpan) -> Unit) {
GlobalScope.launch(Dispatchers.Main) { GlobalScope.launch(Dispatchers.Main) {
val pillImageSpans: Array<PillImageSpan>? = withContext(Dispatchers.IO) { val pillImageSpans: Array<PillImageSpan>? = withContext(Dispatchers.IO) {
message?.let { spannable -> message?.toSpannable()?.let { spannable ->
spannable.getSpans(0, spannable.length, PillImageSpan::class.java) spannable.getSpans(0, spannable.length, PillImageSpan::class.java)
} }
} }

View file

@ -19,6 +19,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:addStatesFromChildren="true"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="16dp"> android:paddingRight="16dp">
@ -58,7 +59,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:duplicateParentState="true"
android:textColor="@color/brown_grey" android:textColor="@color/brown_grey"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
@ -76,7 +76,6 @@
android:layout_marginEnd="32dp" android:layout_marginEnd="32dp"
android:layout_marginRight="32dp" android:layout_marginRight="32dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:duplicateParentState="true"
android:orientation="horizontal" android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0" app:layout_constraintHorizontal_bias="0"

View file

@ -19,7 +19,9 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:addStatesFromChildren="true"
android:paddingRight="16dp"> android:paddingRight="16dp">
@ -58,7 +60,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:duplicateParentState="true"
android:textColor="@color/brown_grey" android:textColor="@color/brown_grey"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
@ -74,13 +75,13 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="32dp" android:layout_marginEnd="32dp"
android:layout_marginRight="32dp" android:layout_marginRight="32dp"
android:layout_marginBottom="8dp" android:foreground="?attr/selectableItemBackground"
android:duplicateParentState="true"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0" app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/messageMemberNameView" app:layout_constraintTop_toBottomOf="@+id/messageMemberNameView"
tools:layout_height="300dp" /> tools:layout_height="300dp"
tools:srcCompat="@tools:sample/backgrounds/scenic" />
<ImageView <ImageView
android:id="@+id/messageMediaPlayView" android:id="@+id/messageMediaPlayView"

View file

@ -5,6 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:addStatesFromChildren="true"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="16dp"> android:paddingRight="16dp">
@ -45,7 +46,6 @@
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:textColor="@color/brown_grey" android:textColor="@color/brown_grey"
android:duplicateParentState="true"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintTop_toTopOf="@id/messageMemberNameView" app:layout_constraintTop_toTopOf="@id/messageMemberNameView"
@ -55,11 +55,10 @@
android:id="@+id/messageTextView" android:id="@+id/messageTextView"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:layout_marginStart="56dp" android:layout_marginStart="56dp"
android:layout_marginLeft="56dp" android:layout_marginLeft="56dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:duplicateParentState="true" android:clickable="true"
android:textColor="@color/dark_grey" android:textColor="@color/dark_grey"
android:textSize="14sp" android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"