From fd10937d68fa63a8bfdcb9e00d0d77bde5812b62 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 30cbe77c8..029dbbf8c 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) @@ -372,14 +371,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 dcd08af6b..f2a729b7b 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 b143de18f..250cd3df2 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -4130,13 +4130,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 967583b98..29c32ce3e 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 @@ -429,7 +429,8 @@ data class ChatMessage( AVATAR_SET, AVATAR_REMOVED, FEDERATED_USER_ADDED, - FEDERATED_USER_REMOVED + FEDERATED_USER_REMOVED, + 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 9613c8f82..09cc4a536 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 @@ -71,6 +71,7 @@ import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.RECORDIN import com.nextcloud.talk.chat.data.model.ChatMessage.SystemMessageType.RECORDING_STOPPED 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.THREAD_CREATED /* * see https://nextcloud-talk.readthedocs.io/en/latest/chat/#system-messages @@ -141,6 +142,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter AVATAR_REMOVED "federated_user_added" -> FEDERATED_USER_ADDED "federated_user_removed" -> FEDERATED_USER_REMOVED + "thread_created" -> THREAD_CREATED else -> DUMMY } } @@ -210,6 +212,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter "avatar_removed" FEDERATED_USER_ADDED -> "federated_user_added" FEDERATED_USER_REMOVED -> "federated_user_removed" + 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 a1f7d9b35..dd744a16a 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 @@ -144,6 +144,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( @@ -411,6 +412,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