From 299e8508c49f2fa7c165e280856c4229964f2d0e Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 8 Aug 2024 14:35:39 +0200 Subject: [PATCH] handle CLEARED_CHAT for scrolling into past Signed-off-by: Marcel Hibbe --- .../chat/data/network/OfflineFirstChatRepository.kt | 11 +++++++++-- .../nextcloud/talk/data/database/dao/ChatBlocksDao.kt | 9 +++++++++ .../talk/data/database/dao/ChatMessagesDao.kt | 9 +++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt index a4a141151..e1f3fe77c 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt @@ -481,8 +481,15 @@ class OfflineFirstChatRepository @Inject constructor( } ChatMessage.SystemMessageType.CLEARED_CHAT -> { - val pattern = "$internalConversationId%" // LIKE "@@%" - chatDao.clearAllMessagesForUser(pattern) + // for lookIntoFuture just deleting everything would be fine. + // But lets say we did not open the chat for a while and in between it was cleared. + // We just load the last 100 messages but this don't contain the system message. + // We scroll up and load the system message. Deleting everything is not an option as we + // would loose the messages that we want to keep. We only want to + // delete the messages and chatBlocks older than the system message. + + chatDao.deleteMessagesOlderThan(internalConversationId, messageJson.id) + chatBlocksDao.deleteChatBlocksOlderThan(internalConversationId, messageJson.id) } else -> {} diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt index f9efffe95..171feb228 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatBlocksDao.kt @@ -89,4 +89,13 @@ interface ChatBlocksDao { """ ) fun clearChatBlocksForUser(pattern: String) + + @Query( + """ + DELETE FROM ChatBlocks + WHERE internalConversationId = :internalConversationId + AND oldestMessageId < :messageId + """ + ) + fun deleteChatBlocksOlderThan(internalConversationId: String, messageId: Long) } diff --git a/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatMessagesDao.kt b/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatMessagesDao.kt index bb0ab220b..6fbf61ca1 100644 --- a/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatMessagesDao.kt +++ b/app/src/main/java/com/nextcloud/talk/data/database/dao/ChatMessagesDao.kt @@ -131,4 +131,13 @@ interface ChatMessagesDao { """ ) fun clearAllMessagesForUser(pattern: String) + + @Query( + """ + DELETE FROM chatmessages + WHERE internalConversationId = :internalConversationId + AND id < :messageId + """ + ) + fun deleteMessagesOlderThan(internalConversationId: String, messageId: Long) }