From 25c2260f828fa0c4993d4973836948d67eb53c06 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 8 Apr 2020 14:07:03 +0200 Subject: [PATCH] Reply layout Signed-off-by: Mario Danic --- .../talk/newarch/features/chat/ChatView.kt | 76 +++++++++++- .../main/res/layout/item_message_quote.xml | 112 +++++++++--------- .../main/res/layout/view_message_input.xml | 15 +-- 3 files changed, 141 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt index e85c0ebf1..5359946f1 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/chat/ChatView.kt @@ -22,6 +22,7 @@ package com.nextcloud.talk.newarch.features.chat +import android.content.ClipData import android.content.ComponentName import android.content.Context import android.content.Intent @@ -33,10 +34,13 @@ import android.net.Uri import android.os.Bundle import android.text.Editable import android.text.InputFilter +import android.text.TextUtils import android.text.TextWatcher -import android.util.Log +import android.util.TypedValue import android.view.* import android.widget.ImageView +import android.widget.PopupMenu +import androidx.core.view.isVisible import androidx.lifecycle.observe import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -82,9 +86,11 @@ import com.otaliastudios.elements.Adapter import com.otaliastudios.elements.Element import com.otaliastudios.elements.Page import com.otaliastudios.elements.Presenter +import com.stfalcon.chatkit.utils.DateFormatter import com.uber.autodispose.lifecycle.LifecycleScopeProvider import com.vanniktech.emoji.EmojiPopup import kotlinx.android.synthetic.main.controller_chat.view.* +import kotlinx.android.synthetic.main.item_message_quote.view.* import kotlinx.android.synthetic.main.lobby_view.view.* import kotlinx.android.synthetic.main.view_message_input.view.* import org.koin.android.ext.android.inject @@ -194,7 +200,7 @@ class ChatView(private val bundle: Bundle) : BaseView(), ImageLoaderInterface { view.smileyButton.setOnClickListener { emojiPopup?.toggle() } - + viewModel.apply { conversation.observe(this@ChatView) { conversation -> setTitle() @@ -238,6 +244,7 @@ class ChatView(private val bundle: Bundle) : BaseView(), ImageLoaderInterface { } } + view.cancelReplyButton.setOnClickListener { hideReplyView() } return view } @@ -341,8 +348,73 @@ class ChatView(private val bundle: Bundle) : BaseView(), ImageLoaderInterface { } } + private fun hideReplyView() { + view?.messageInputView?.let { + with (it) { + quotedMessageLayout.isVisible = false + attachmentButton.isVisible = true + attachmentButtonSpace.isVisible = true + } + } + } private fun onElementLongClick(page: Page, holder: Presenter.Holder, element: Element, payload: Map) { + if (element.type == ChatElementTypes.CHAT_MESSAGE.ordinal) { + element.data?.let { chatElement -> + var chatMessage = chatElement.data as ChatMessage + if (payload.containsKey("parentMessage")) { + chatMessage = chatMessage.parentMessage!! + } + PopupMenu(this.context, holder.itemView, Gravity.START).apply { + setOnMenuItemClickListener { item -> + when (item?.itemId) { + + R.id.action_copy_message -> { + val clipboardManager = + activity?.getSystemService(Context.CLIPBOARD_SERVICE) as android.content.ClipboardManager + val clipData = ClipData.newPlainText(resources?.getString(R.string.nc_app_name), chatMessage.text) + clipboardManager.setPrimaryClip(clipData) + true + } + R.id.action_reply_to_message -> { + view?.let { + with(it.messageInputView) { + attachmentButton.isVisible = false + attachmentButtonSpace.isVisible = false + cancelReplyButton.isVisible = true + quotedChatText.maxLines = 2 + quotedChatText.ellipsize = TextUtils.TruncateAt.END + quotedChatText.text = chatMessage.text + quotedAuthor.text = chatMessage.user.name + quotedMessageTime.text = DateFormatter.format(chatMessage.createdAt, DateFormatter.Template.TIME) + + loadImage(quotedUserAvatar, chatMessage.user.avatar) + + chatMessage.imageUrl?.let { previewImageUrl -> + quotedPreviewImage.isVisible = true + + val px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 96f, resources?.displayMetrics) + quotedPreviewImage.maxHeight = px.toInt() + loadImage(quotedPreviewImage, previewImageUrl) + } ?: run { + quotedPreviewImage.isVisible = false + } + quotedMessageLayout.tag = chatMessage.jsonMessageId + quotedMessageLayout.isVisible = true + + } + } + true + } + else -> false + } + } + inflate(R.menu.chat_message_menu) + menu.findItem(R.id.action_reply_to_message).isVisible = chatMessage.replyable + show() + } + } + } } override fun onAttach(view: View) { diff --git a/app/src/main/res/layout/item_message_quote.xml b/app/src/main/res/layout/item_message_quote.xml index 1b7f5ab6d..a1cc49785 100644 --- a/app/src/main/res/layout/item_message_quote.xml +++ b/app/src/main/res/layout/item_message_quote.xml @@ -10,9 +10,9 @@ android:id="@+id/quoteColoredView" android:layout_width="2dp" android:layout_height="match_parent" - android:layout_alignTop="@id/quotedAuthorLayout" + android:layout_alignTop="@id/quotedTextLayout" android:layout_alignParentStart="true" - android:layout_alignBottom="@id/quotedMessageTime" + android:layout_alignBottom="@id/quotedTextLayout" android:layout_marginEnd="4dp" android:background="@color/colorPrimary" /> @@ -20,72 +20,78 @@ + android:layout_toEndOf="@id/quoteColoredView"> - + android:id="@+id/quotedAuthorLayout"> + + + + + + + + + + + android:layout_alignParentEnd="true" + android:layout_below="@id/quotedChatText" + android:textSize="10sp" + android:textAlignment="textEnd" + android:id="@+id/quotedMessageTime" + tools:text="12:30"/> - - - - - - + android:visibility="gone" + /> @@ -72,14 +73,14 @@ android:id="@id/attachmentButtonSpace" android:layout_width="0dp" android:layout_height="0dp" - android:layout_below="@id/quotedChatMessageView" + android:layout_below="@id/quotedMessageLayout" android:layout_toEndOf="@id/attachmentButton" />