From 225fe391409610bbb1c14b058de73a503b9f186e Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 4 Jul 2025 14:34:39 +0200 Subject: [PATCH] move "open thread" to context menu + add threads system message Signed-off-by: Marcel Hibbe --- .../messages/IncomingTextMessageViewHolder.kt | 11 +------ .../OutcomingTextMessageViewHolder.kt | 19 ++++++----- .../com/nextcloud/talk/chat/ChatActivity.kt | 16 +++++---- .../talk/chat/data/model/ChatMessage.kt | 3 +- .../EnumSystemMessageTypeConverter.kt | 3 ++ .../talk/ui/dialog/MessageActionsDialog.kt | 12 +++++++ .../res/layout/dialog_message_actions.xml | 33 +++++++++++++++++++ .../main/res/layout/item_message_quote.xml | 11 ------- app/src/main/res/values/strings.xml | 4 +++ 9 files changed, 75 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt index 810a7ae68..f477df5c4 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingTextMessageViewHolder.kt @@ -167,8 +167,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : // parent message handling val chatActivity = commonMessageInterface as ChatActivity binding.messageQuote.quotedChatMessageView.visibility = - // TODO replace message.parentMessageId with topmostParentId - if (chatActivity.threadId == message.parentMessageId) { + if (chatActivity.threadId == message.threadId) { View.GONE } else if (!message.isDeleted && message.parentMessageId != null) { processParentMessage(message) @@ -376,14 +375,6 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) : viewThemeUtils ) - // TODO replace message.parentMessageId!! with topmostParentId (=threadId) - binding.messageQuote.threadIcon.setOnClickListener { - chatActivity.openThread( - chatActivity.roomToken, - message.parentMessageId!! - ) - } - viewThemeUtils.talk.themeParentMessage( parentChatMessage, message, diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt index da8d62787..843681674 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingTextMessageViewHolder.kt @@ -178,13 +178,18 @@ class OutcomingTextMessageViewHolder(itemView: View) : } viewThemeUtils.platform.colorTextView(binding.messageTime, ColorRole.ON_SURFACE_VARIANT) setBubbleOnChatMessage(message) + // parent message handling - if (!message.isDeleted && message.parentMessageId != null) { - processParentMessage(message) - binding.messageQuote.quotedChatMessageView.visibility = View.VISIBLE - } else { - binding.messageQuote.quotedChatMessageView.visibility = View.GONE - } + val chatActivity = commonMessageInterface as ChatActivity + binding.messageQuote.quotedChatMessageView.visibility = + if (chatActivity.threadId == message.threadId) { + View.GONE + } else if (!message.isDeleted && message.parentMessageId != null) { + processParentMessage(message) + View.VISIBLE + } else { + View.GONE + } binding.checkMark.visibility = View.INVISIBLE binding.sendingProgress.visibility = View.GONE @@ -199,8 +204,6 @@ class OutcomingTextMessageViewHolder(itemView: View) : updateStatus(R.drawable.ic_check, context.resources?.getString(R.string.nc_message_sent)) } - val chatActivity = commonMessageInterface as ChatActivity - chatActivity.lifecycleScope.launch { if (message.isTemporary && !networkMonitor.isOnline.value) { updateStatus( diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index b51b3f973..8c8733554 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -4132,13 +4132,15 @@ class ChatActivity : private fun isChatThread(): Boolean = threadId != null && threadId!! > 0 - fun openThread(roomToken: String, threadId: Long) { - val bundle = Bundle() - bundle.putString(KEY_ROOM_TOKEN, roomToken) - bundle.putLong(KEY_THREAD_ID, threadId) - val chatIntent = Intent(context, ChatActivity::class.java) - chatIntent.putExtras(bundle) - startActivity(chatIntent) + fun openThread(chatMessage: ChatMessage) { + chatMessage.threadId?.let { + val bundle = Bundle() + bundle.putString(KEY_ROOM_TOKEN, roomToken) + bundle.putLong(KEY_THREAD_ID, it) + val chatIntent = Intent(context, ChatActivity::class.java) + chatIntent.putExtras(bundle) + startActivity(chatIntent) + } } override fun joinAudioCall() { diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessage.kt b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessage.kt index 011db5563..375a44a82 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessage.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessage.kt @@ -430,7 +430,8 @@ data class ChatMessage( AVATAR_REMOVED, FEDERATED_USER_ADDED, FEDERATED_USER_REMOVED, - PHONE_ADDED + PHONE_ADDED, + THREAD_CREATED } companion object { diff --git a/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt index 9643dae39..bb3e72c71 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt @@ -72,6 +72,7 @@ import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.RECORDIN import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.USER_ADDED import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.USER_REMOVED import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.PHONE_ADDED +import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.THREAD_CREATED /* * see https://nextcloud-talk.readthedocs.io/en/latest/chat/#system-messages @@ -143,6 +144,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter FEDERATED_USER_ADDED "federated_user_removed" -> FEDERATED_USER_REMOVED "phone_added" -> PHONE_ADDED + "thread_created" -> THREAD_CREATED else -> DUMMY } @@ -212,6 +214,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter "federated_user_added" FEDERATED_USER_REMOVED -> "federated_user_removed" PHONE_ADDED -> "phone_added" + THREAD_CREATED -> "thread_created" else -> "" } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt index 2c40d23f4..cf4577d2c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt @@ -151,6 +151,7 @@ class MessageActionsDialog( currentConversation?.type != ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL && isOnline ) + initMenuOpenThread(message.isThread && chatActivity.threadId == null) initMenuEditMessage(isMessageEditable) initMenuDeleteMessage(showMessageDeletionButton && isOnline) initMenuForwardMessage( @@ -414,6 +415,17 @@ class MessageActionsDialog( dialogMessageActionsBinding.menuReplyPrivately.visibility = getVisibility(visible) } + private fun initMenuOpenThread(visible: Boolean) { + if (visible) { + dialogMessageActionsBinding.menuOpenThread.setOnClickListener { + chatActivity.openThread(message) + dismiss() + } + } + + dialogMessageActionsBinding.menuOpenThread.visibility = getVisibility(visible) + } + private fun initMenuReplyToMessage(visible: Boolean) { if (visible) { dialogMessageActionsBinding.menuReplyToMessage.setOnClickListener { diff --git a/app/src/main/res/layout/dialog_message_actions.xml b/app/src/main/res/layout/dialog_message_actions.xml index 9500c1d1a..cc3a081e7 100644 --- a/app/src/main/res/layout/dialog_message_actions.xml +++ b/app/src/main/res/layout/dialog_message_actions.xml @@ -282,6 +282,39 @@ + + + + + + + + - - and 1 other is typing … and %1$s others are typing … %1$s in %2$s + + See thread + Reply in thread + Add to conversation Take photo