From 1558c8ed33a66b44c6916fc0cd454eb4d91452e1 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 15 Jul 2021 15:24:59 +0200 Subject: [PATCH] add ability to clear chat history - moderators can clear the chat in the conversations settings - chat is cleared by system message CLEARED_CHAT Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/api/NcApi.java | 3 ++ .../talk/controllers/ChatController.kt | 9 ++++- .../controllers/ConversationInfoController.kt | 37 +++++++++++++++++++ .../talk/models/json/chat/ChatMessage.java | 3 +- .../EnumSystemMessageTypeConverter.kt | 8 +++- .../layout/controller_conversation_info.xml | 8 ++++ app/src/main/res/values/strings.xml | 2 + 7 files changed, 67 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 5115de760..a1e6e2679 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -415,4 +415,7 @@ public interface NcApi { @Field("objectType") String objectType, @Field("objectId") String objectId, @Field("metaData") String metaData); + + @DELETE + Observable clearChatHistory(@Header("Authorization") String authorization, @Url String url); } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index f5f8f2a9a..da4a949fa 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -1805,7 +1805,7 @@ class ChatController(args: Bundle) : } override fun onError(e: Throwable) { - // unused atm + Log.e(TAG, "failed to pull chat messages", e) } override fun onComplete() { @@ -1877,6 +1877,13 @@ class ChatController(args: Bundle) : val chatOverall = response.body() as ChatOverall? val chatMessageList = setDeletionFlagsAndRemoveInfomessages(chatOverall?.ocs!!.data) + if (chatMessageList.isNotEmpty() && + ChatMessage.SystemMessageType.CLEARED_CHAT == chatMessageList[0].systemMessageType + ) { + adapter?.clear() + adapter?.notifyDataSetChanged() + } + if (isFirstMessagesProcessing) { cancelNotificationsForCurrentConversation() diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index 3582a0340..d698ae887 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -30,6 +30,7 @@ import android.text.TextUtils import android.util.Log import android.view.MenuItem import android.view.View +import android.widget.Toast import androidx.appcompat.widget.SwitchCompat import androidx.core.content.ContextCompat import androidx.work.Data @@ -165,6 +166,7 @@ class ConversationInfoController(args: Bundle) : binding.deleteConversationAction.setOnClickListener { showDeleteConversationDialog(null) } binding.leaveConversationAction.setOnClickListener { leaveConversation() } + binding.clearConversationHistory.setOnClickListener { clearHistory() } binding.addParticipantsAction.setOnClickListener { addParticipants() } fetchRoomInfo() @@ -488,6 +490,35 @@ class ConversationInfoController(args: Bundle) : } } + private fun clearHistory() { + val apiVersion = ApiUtils.getChatApiVersion(conversationUser, intArrayOf(1)) + + ncApi?.clearChatHistory( + credentials, + ApiUtils.getUrlForChat(apiVersion, conversationUser!!.baseUrl, conversationToken) + ) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + } + + @Suppress("Detekt.TooGenericExceptionCaught") + override fun onNext(genericOverall: GenericOverall) { + Toast.makeText(context, context?.getString(R.string.nc_clear_history_success), Toast.LENGTH_LONG) + .show() + } + + override fun onError(e: Throwable) { + Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() + Log.e(TAG, "failed to clear chat history", e) + } + + override fun onComplete() { + } + }) + } + private fun deleteConversation() { workerData?.let { WorkManager.getInstance().enqueue( @@ -529,8 +560,14 @@ class ConversationInfoController(args: Bundle) : if (conversationCopy!!.canModerate(conversationUser)) { binding.addParticipantsAction.visibility = View.VISIBLE + if (CapabilitiesUtil.hasSpreedFeatureCapability(conversationUser, "clear-history")) { + binding.clearConversationHistory.visibility = View.VISIBLE + } else { + binding.clearConversationHistory.visibility = View.GONE + } } else { binding.addParticipantsAction.visibility = View.GONE + binding.clearConversationHistory.visibility = View.GONE } if (isAttached && (!isBeingDestroyed || !isDestroyed)) { diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java index e3da928ae..ce3451ad4 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java @@ -646,6 +646,7 @@ public class ChatMessage implements MessageContentType, MessageContentType.Image MATTERBRIDGE_CONFIG_EDITED, MATTERBRIDGE_CONFIG_REMOVED, MATTERBRIDGE_CONFIG_ENABLED, - MATTERBRIDGE_CONFIG_DISABLED + MATTERBRIDGE_CONFIG_DISABLED, + CLEARED_CHAT } } 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 f54a7615b..8c1994c06 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 @@ -3,8 +3,10 @@ * * @author Mario Danic * @author Tim Krüger - * Copyright (C) 2021 Tim Krüger + * @author Marcel Hibbe * Copyright (C) 2017-2018 Mario Danic + * Copyright (C) 2021 Tim Krüger + * Copyright (C) 2021 Marcel Hibbe * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,6 +32,7 @@ import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_LE import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_MISSED import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_STARTED import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_TRIED +import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CLEARED_CHAT import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CONVERSATION_CREATED import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CONVERSATION_RENAMED import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.DESCRIPTION_REMOVED @@ -92,6 +95,7 @@ import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.USER_RE * `guest_moderator_promoted` - {actor} promoted {user} to moderator * `guest_moderator_demoted` - {actor} demoted {user} from moderator * `message_deleted` - Message deleted by {actor} (Should not be shown to the user) +* `history_cleared` - {actor} cleared the history of the conversation * `file_shared` - {file} * `object_shared` - {object} * `matterbridge_config_added` - {actor} set up Matterbridge to synchronize this conversation with other chats @@ -139,6 +143,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter return MATTERBRIDGE_CONFIG_REMOVED "matterbridge_config_enabled" -> return MATTERBRIDGE_CONFIG_ENABLED "matterbridge_config_disabled" -> return MATTERBRIDGE_CONFIG_DISABLED + "history_cleared" -> return CLEARED_CHAT else -> return DUMMY } } @@ -186,6 +191,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter return "matterbridge_config_removed" MATTERBRIDGE_CONFIG_ENABLED -> return "matterbridge_config_enabled" MATTERBRIDGE_CONFIG_DISABLED -> return "matterbridge_config_disabled" + CLEARED_CHAT -> return "clear_history" else -> return "" } } diff --git a/app/src/main/res/layout/controller_conversation_info.xml b/app/src/main/res/layout/controller_conversation_info.xml index 7352ee779..71d6ef568 100644 --- a/app/src/main/res/layout/controller_conversation_info.xml +++ b/app/src/main/res/layout/controller_conversation_info.xml @@ -171,6 +171,14 @@ apc:mp_icon_tint="@color/grey_600" apc:mp_title="@string/nc_leave" /> + + Start a conversation Configure conversation Leave conversation + Clear history + Chat history was cleared Rename conversation Set a password Change password