From 5cf9deb329bf50c383e13159c7d1ecc84c1512c8 Mon Sep 17 00:00:00 2001 From: Valere Date: Fri, 7 Jun 2019 10:45:24 +0200 Subject: [PATCH] Menu action for non room messages --- .../action/MessageActionsBottomSheet.kt | 31 ++++++++++++------- .../action/MessageActionsViewModel.kt | 27 +++++++++------- .../timeline/action/MessageMenuViewModel.kt | 11 +++++-- .../timeline/action/QuickReactionViewModel.kt | 21 ++++++------- .../room/detail/timeline/item/NoticeItem.kt | 1 - .../layout/bottom_sheet_message_actions.xml | 15 ++++++--- 6 files changed, 64 insertions(+), 42 deletions(-) diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt index fa94043e..7ea6a9b1 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsBottomSheet.kt @@ -23,6 +23,7 @@ import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView +import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProviders import butterknife.BindView import butterknife.ButterKnife @@ -35,6 +36,7 @@ import im.vector.riotredesign.R import im.vector.riotredesign.core.glide.GlideApp import im.vector.riotredesign.features.home.AvatarRenderer import im.vector.riotredesign.features.home.room.detail.timeline.item.MessageInformationData +import kotlinx.android.synthetic.main.bottom_sheet_message_actions.* /** * Bottom sheet fragment that shows a message preview with list of contextual actions @@ -115,20 +117,27 @@ class MessageActionsBottomSheet : BaseMvRxBottomSheetDialog() { } override fun invalidate() = withState(viewModel) { - senderNameTextView.text = it.senderName - messageBodyTextView.text = it.messageBody - messageTimestampText.text = it.ts + if (it.showPreview) { + bottom_sheet_message_preview.isVisible = true + senderNameTextView.text = it.senderName + messageBodyTextView.text = it.messageBody + messageTimestampText.text = it.ts - GlideApp.with(this).clear(senderAvatarImageView) - if (it.senderAvatarPath != null) { - GlideApp.with(this) - .load(it.senderAvatarPath) - .circleCrop() - .placeholder(AvatarRenderer.getPlaceholderDrawable(requireContext(), it.userId, it.senderName)) - .into(senderAvatarImageView) + GlideApp.with(this).clear(senderAvatarImageView) + if (it.senderAvatarPath != null) { + GlideApp.with(this) + .load(it.senderAvatarPath) + .circleCrop() + .placeholder(AvatarRenderer.getPlaceholderDrawable(requireContext(), it.userId, it.senderName)) + .into(senderAvatarImageView) + } else { + senderAvatarImageView.setImageDrawable(AvatarRenderer.getPlaceholderDrawable(requireContext(), it.userId, it.senderName)) + } } else { - senderAvatarImageView.setImageDrawable(AvatarRenderer.getPlaceholderDrawable(requireContext(), it.userId, it.senderName)) + bottom_sheet_message_preview.isVisible = false } + quickReactBottomDivider.isVisible = it.canReact + bottom_sheet_quick_reaction_container.isVisible = it.canReact return@withState } diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt index a307afe3..2a925894 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageActionsViewModel.kt @@ -19,6 +19,7 @@ import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.ViewModelContext import im.vector.matrix.android.api.session.Session +import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.message.MessageContent import im.vector.matrix.android.api.session.room.model.message.MessageTextContent @@ -34,10 +35,12 @@ import java.util.* data class MessageActionState( - val userId: String, - val senderName: String, - val messageBody: CharSequence, - val ts: String?, + val userId: String = "", + val senderName: String = "", + val messageBody: CharSequence? = null, + val ts: String? = null, + val showPreview: Boolean = false, + val canReact: Boolean = false, val senderAvatarPath: String? = null) : MvRxState @@ -59,21 +62,21 @@ class MessageActionsViewModel(initialState: MessageActionState) : VectorViewMode val messageContent: MessageContent? = event.annotations?.editSummary?.aggregatedContent?.toModel() ?: event.root.content.toModel() val originTs = event.root.originServerTs - var body: CharSequence = messageContent?.body ?: "" + var body: CharSequence? = messageContent?.body if (messageContent is MessageTextContent && messageContent.format == MessageType.FORMAT_MATRIX_HTML) { val parser = Parser.builder().build() val document = parser.parse(messageContent.formattedBody ?: messageContent.body) - // val renderer = HtmlRenderer.builder().build() body = Markwon.builder(viewModelContext.activity) .usePlugin(HtmlPlugin.create()).build().render(document) -// body = renderer.render(document) } MessageActionState( - event.root.sender ?: "", - parcel.informationData.memberName.toString(), - body, - dateFormat.format(Date(originTs ?: 0)), - currentSession.contentUrlResolver().resolveFullSize(parcel.informationData.avatarUrl) + userId = event.root.sender ?: "", + senderName = parcel.informationData.memberName.toString(), + messageBody = body, + ts = dateFormat.format(Date(originTs ?: 0)), + showPreview = event.root.type == EventType.MESSAGE, + canReact = event.root.type == EventType.MESSAGE, + senderAvatarPath = currentSession.contentUrlResolver().resolveFullSize(parcel.informationData.avatarUrl) ) } else { //can this happen? diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt index 6d99d41a..d2511eff 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/action/MessageMenuViewModel.kt @@ -73,7 +73,9 @@ class MessageMenuViewModel(initialState: MessageMenuState) : VectorViewModel>? = null, - val eventId: String) : MvRxState + val eventId: String = "") : MvRxState /** * Quick reaction view model - * TODO: configure initial state from event */ class QuickReactionViewModel(initialState: QuickReactionState) : VectorViewModel(initialState) { @@ -88,15 +87,15 @@ class QuickReactionViewModel(initialState: QuickReactionState) : VectorViewModel private fun getReactions(state: QuickReactionState, newState1: TriggleState?, newState2: TriggleState?): List { return ArrayList(4).apply { when (newState2 ?: state.likeTriggleState) { - TriggleState.FIRST -> add(likePositive) + TriggleState.FIRST -> add(likePositive) TriggleState.SECOND -> add(likeNegative) - else -> { + else -> { } } when (newState1 ?: state.agreeTrigleState) { - TriggleState.FIRST -> add(agreePositive) + TriggleState.FIRST -> add(agreePositive) TriggleState.SECOND -> add(agreeNegative) - else -> { + else -> { } } } @@ -114,9 +113,9 @@ class QuickReactionViewModel(initialState: QuickReactionState) : VectorViewModel return when (reaction) { agreePositive -> agreeNegative agreeNegative -> agreePositive - likePositive -> likeNegative - likeNegative -> likePositive - else -> null + likePositive -> likeNegative + likeNegative -> likePositive + else -> null } } diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/NoticeItem.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/NoticeItem.kt index 914cb232..d190875f 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/NoticeItem.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/item/NoticeItem.kt @@ -37,7 +37,6 @@ abstract class NoticeItem : BaseEventItem() { @EpoxyAttribute var baseCallback: TimelineEventController.BaseCallback? = null - private var longClickListener = View.OnLongClickListener { baseCallback?.onEventLongClicked(informationData, null, it) baseCallback != null diff --git a/vector/src/main/res/layout/bottom_sheet_message_actions.xml b/vector/src/main/res/layout/bottom_sheet_message_actions.xml index 0de471bd..d1cb8c9f 100644 --- a/vector/src/main/res/layout/bottom_sheet_message_actions.xml +++ b/vector/src/main/res/layout/bottom_sheet_message_actions.xml @@ -86,7 +86,8 @@ tools:text="Friday 8pm" /> - @@ -94,18 +95,22 @@ + android:layout_height="wrap_content" + tools:background="@android:color/holo_green_light" + tools:layout_height="180dp" /> - - + android:layout_height="wrap_content" + tools:background="@android:color/holo_blue_dark" + tools:layout_height="250dp" />