From 136e6da0be48feedeb49dbdec74b6cff34a56aec Mon Sep 17 00:00:00 2001 From: VelikovPetar Date: Thu, 16 Apr 2026 09:58:31 +0200 Subject: [PATCH] Fix offline persisted drafts not cleared on logout --- .../api/stream-chat-android-offline.api | 1 + .../internal/DatabaseMessageRepository.kt | 1 + .../domain/message/internal/MessageDao.kt | 3 +++ .../repository/MessageRepositoryTests.kt | 22 +++++++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/stream-chat-android-offline/api/stream-chat-android-offline.api b/stream-chat-android-offline/api/stream-chat-android-offline.api index f9c6222b504..8aa4599cea5 100644 --- a/stream-chat-android-offline/api/stream-chat-android-offline.api +++ b/stream-chat-android-offline/api/stream-chat-android-offline.api @@ -107,6 +107,7 @@ public final class io/getstream/chat/android/offline/repository/domain/message/i public final class io/getstream/chat/android/offline/repository/domain/message/internal/MessageDao_Impl : io/getstream/chat/android/offline/repository/domain/message/internal/MessageDao { public fun (Landroidx/room/RoomDatabase;)V public fun deleteAll (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun deleteAllDrafts (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun deleteAttachments (Ljava/util/List;)V public fun deleteAttachmentsChunked (Ljava/util/List;)V public fun deleteChannelMessagesBefore (Ljava/lang/String;Ljava/util/Date;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; diff --git a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/DatabaseMessageRepository.kt b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/DatabaseMessageRepository.kt index 18bc1c1aa29..cac4fe15706 100644 --- a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/DatabaseMessageRepository.kt +++ b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/DatabaseMessageRepository.kt @@ -258,6 +258,7 @@ internal class DatabaseMessageRepository( replyMessageCache.evictAll() dbMutex.withLock { messageDao.deleteAll() + messageDao.deleteAllDrafts() replyMessageDao.deleteAll() } } diff --git a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/MessageDao.kt b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/MessageDao.kt index c89e57c703b..ac08d5e05b1 100644 --- a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/MessageDao.kt +++ b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/message/internal/MessageDao.kt @@ -253,6 +253,9 @@ internal interface MessageDao { @Query("DELETE FROM $MESSAGE_ENTITY_TABLE_NAME") suspend fun deleteAll() + @Query("DELETE FROM $DRAFT_MESSAGE_ENTITY_TABLE_NAME") + suspend fun deleteAllDrafts() + private companion object { private const val SQLITE_MAX_VARIABLE_NUMBER: Int = 999 private const val NO_LIMIT: Int = -1 diff --git a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/MessageRepositoryTests.kt b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/MessageRepositoryTests.kt index 1e93ff8d7e5..da39096e977 100644 --- a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/MessageRepositoryTests.kt +++ b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/repository/MessageRepositoryTests.kt @@ -219,4 +219,26 @@ internal class MessageRepositoryTests { // then verify(messageDao).deleteMessages(messageIds) } + + @Test + fun `when calling clear, then all related tables are cleared`() = runTest(testDispatcher) { + // given + val repository = DatabaseMessageRepository( + this, + messageDao, + replyMessageDao, + pollDao, + ::randomUser, + randomUser(id = "currentUserId"), + emptySet(), + ) + + // when + repository.clear() + + // then + verify(messageDao).deleteAll() + verify(messageDao).deleteAllDrafts() + verify(replyMessageDao).deleteAll() + } }