From 227ec0754a4af9b194eac4fbef9618630220f734 Mon Sep 17 00:00:00 2001 From: Aleksandar Apostolov Date: Fri, 13 Feb 2026 14:01:59 +0100 Subject: [PATCH 01/33] chore(ci): update stream-build-conventions to v0.9.0 (#6151) --- .github/workflows/pr-checks.yml | 4 ++-- .github/workflows/pr-cleanup.yaml | 2 +- .github/workflows/pr-quality.yml | 2 +- .github/workflows/publish-new-version.yml | 2 +- .github/workflows/sdk-size-checks.yml | 2 +- .github/workflows/sdk-size-updates.yml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 2516e3ae86c..32a91c0ce0d 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -8,7 +8,7 @@ concurrency: jobs: base-android-ci: - uses: GetStream/stream-build-conventions-android/.github/workflows/android-ci.yml@v0.7.1 + uses: GetStream/stream-build-conventions-android/.github/workflows/android-ci.yml@v0.9.0 secrets: inherit detekt: @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4.2.2 - - uses: GetStream/stream-build-conventions-android/.github/actions/setup-gradle@v0.7.1 + - uses: GetStream/stream-build-conventions-android/.github/actions/setup-gradle@v0.9.0 - name: Detekt run: ./gradlew detekt diff --git a/.github/workflows/pr-cleanup.yaml b/.github/workflows/pr-cleanup.yaml index 9f5a4c8835c..9edb0bf7014 100644 --- a/.github/workflows/pr-cleanup.yaml +++ b/.github/workflows/pr-cleanup.yaml @@ -12,5 +12,5 @@ permissions: jobs: pr-clean-stale: - uses: GetStream/stream-build-conventions-android/.github/workflows/pr-clean-stale.yaml@v0.6.1 + uses: GetStream/stream-build-conventions-android/.github/workflows/pr-clean-stale.yaml@v0.9.0 secrets: inherit diff --git a/.github/workflows/pr-quality.yml b/.github/workflows/pr-quality.yml index fe853591e85..f34fc42a089 100644 --- a/.github/workflows/pr-quality.yml +++ b/.github/workflows/pr-quality.yml @@ -15,5 +15,5 @@ concurrency: jobs: pr-checklist: - uses: GetStream/stream-build-conventions-android/.github/workflows/pr-quality.yml@v0.7.1 + uses: GetStream/stream-build-conventions-android/.github/workflows/pr-quality.yml@v0.9.0 secrets: inherit diff --git a/.github/workflows/publish-new-version.yml b/.github/workflows/publish-new-version.yml index 0b301637876..b8feff80dbf 100644 --- a/.github/workflows/publish-new-version.yml +++ b/.github/workflows/publish-new-version.yml @@ -30,7 +30,7 @@ jobs: permissions: contents: write needs: pre_release_check - uses: GetStream/stream-build-conventions-android/.github/workflows/release.yml@v0.8.0 + uses: GetStream/stream-build-conventions-android/.github/workflows/release.yml@v0.9.0 with: bump: ${{ inputs.bump }} secrets: diff --git a/.github/workflows/sdk-size-checks.yml b/.github/workflows/sdk-size-checks.yml index 72f61c54637..7e4b4c4e99f 100644 --- a/.github/workflows/sdk-size-checks.yml +++ b/.github/workflows/sdk-size-checks.yml @@ -9,7 +9,7 @@ concurrency: jobs: compare-sdk-sizes: - uses: GetStream/stream-build-conventions-android/.github/workflows/sdk-size-checks.yml@v0.6.1 + uses: GetStream/stream-build-conventions-android/.github/workflows/sdk-size-checks.yml@v0.9.0 with: modules: "stream-chat-android-client stream-chat-android-offline stream-chat-android-ui-components stream-chat-android-compose" metrics-project: "stream-chat-android-metrics" diff --git a/.github/workflows/sdk-size-updates.yml b/.github/workflows/sdk-size-updates.yml index 13c1f7e2e6f..6d145452cf6 100644 --- a/.github/workflows/sdk-size-updates.yml +++ b/.github/workflows/sdk-size-updates.yml @@ -13,7 +13,7 @@ concurrency: jobs: update-sdk-sizes: - uses: GetStream/stream-build-conventions-android/.github/workflows/sdk-size-updates.yml@v0.6.1 + uses: GetStream/stream-build-conventions-android/.github/workflows/sdk-size-updates.yml@v0.9.0 with: modules: "stream-chat-android-client stream-chat-android-offline stream-chat-android-ui-components stream-chat-android-compose" metrics-project: "stream-chat-android-metrics" From 396c9e91afcf54fe80db5a5ff8de1eea09418795 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Tue, 17 Feb 2026 11:03:34 +0100 Subject: [PATCH 02/33] Fix local only message deletion (#6157) Co-authored-by: Claude Co-authored-by: Cursor --- .../client/utils/message/MessageUtils.kt | 38 +++++ .../client/utils/message/MessageUtilsTest.kt | 84 ++++++++++ .../internal/DeleteMessageListenerDatabase.kt | 35 ++-- .../DeleteMessageListenerDatabaseTest.kt | 149 +++++++++++++++++- .../internal/DeleteMessageListenerState.kt | 54 +++---- .../DeleteMessageListenerStateTest.kt | 143 +++++++++++++++++ 6 files changed, 445 insertions(+), 58 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt index 1bbe1ae5d92..03be42f9c58 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt @@ -19,6 +19,7 @@ package io.getstream.chat.android.client.utils.message +import io.getstream.chat.android.client.errors.cause.MessageModerationDeletedException import io.getstream.chat.android.client.extensions.getCreatedAtOrNull import io.getstream.chat.android.core.internal.InternalStreamChatApi import io.getstream.chat.android.core.utils.date.after @@ -30,6 +31,8 @@ import io.getstream.chat.android.models.MessageType import io.getstream.chat.android.models.ModerationAction import io.getstream.chat.android.models.SyncStatus import io.getstream.chat.android.models.User +import io.getstream.result.Error +import io.getstream.result.Result import java.util.UUID private const val ITEM_COUNT_OF_TWO: Int = 2 @@ -205,6 +208,41 @@ public fun Message.isModerationFlag(): Boolean = public fun Message.isModerationError(currentUserId: String?): Boolean = isMine(currentUserId) && (isError() && isModerationBounce()) +/** + * Checks whether we should attempt to delete the message remotely. + * + * @param currentUserId The ID of the currently logged in user. + * @return [Result.Success] if remote delete should be attempted, [Result.Failure] if the message should be deleted only + * locally. + */ +@Suppress("ComplexCondition") +@InternalStreamChatApi +public fun Message.shouldDeleteRemote(currentUserId: String?): Result { + // 1. Moderation action = 'bounce' - not persisted on server, delete only locally + // Note: handled separately from pt. 2/3 for backwards-compatibility + if (isModerationError(currentUserId)) { + val error = Error.ThrowableError( + message = "Message with failed moderation has been deleted locally: $id", + cause = MessageModerationDeletedException( + "Message with failed moderation has been deleted locally: $id", + ), + ) + return Result.Failure(error) + } + // 2. type = 'error'/'ephemeral' - not persisted on server, delete only locally + // 3. syncStatus = 'IN_PROGRESS'/`SYNC_NEEDED`/`FAILED_PERMANENTLY` - not persisted on server, delete only locally + if (isError() || isEphemeral() || + syncStatus == SyncStatus.IN_PROGRESS || + syncStatus == SyncStatus.SYNC_NEEDED || + syncStatus == SyncStatus.FAILED_PERMANENTLY + ) { + val error = Error.GenericError("Message is local-only, don't call DeleteMessage API") + return Result.Failure(error) + } + // 4. Any other case, attempt to delete the message remotely + return Result.Success(Unit) +} + /** * Ensures the message has an id. * If the message doesn't have an id, a unique message id is generated. diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt index b71f9fff549..9e52d4d795a 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt @@ -31,11 +31,13 @@ import io.getstream.chat.android.randomModeration import io.getstream.chat.android.randomPoll import io.getstream.chat.android.randomString import io.getstream.chat.android.randomUser +import io.getstream.result.Result import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.currentTime import kotlinx.coroutines.test.runTest import org.amshove.kluent.shouldBeEqualTo +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import java.util.Date @@ -583,4 +585,86 @@ internal class MessageUtilsTest { val result = draftMessage.ensureId(user) result.id.startsWith(userId) shouldBeEqualTo true } + + @Test + fun `shouldDeleteRemote should return Failure for moderation bounce message`() { + val currentUserId = randomString() + val message = randomMessage( + user = randomUser(id = currentUserId), + type = MessageType.ERROR, + moderation = randomModeration(action = ModerationAction.bounce), + ) + val result = message.shouldDeleteRemote(currentUserId) + assertTrue(result is Result.Failure) + } + + @Test + fun `shouldDeleteRemote should return Failure for error message type`() { + val message = randomMessage( + type = MessageType.ERROR, + syncStatus = SyncStatus.COMPLETED, + ) + val result = message.shouldDeleteRemote(randomString()) + assertTrue(result is Result.Failure) + } + + @Test + fun `shouldDeleteRemote should return Failure for ephemeral message type`() { + val message = randomMessage( + type = MessageType.EPHEMERAL, + syncStatus = SyncStatus.COMPLETED, + ) + val result = message.shouldDeleteRemote(randomString()) + assertTrue(result is Result.Failure) + } + + @Test + fun `shouldDeleteRemote should return Failure for IN_PROGRESS sync status`() { + val message = randomMessage( + type = MessageType.REGULAR, + syncStatus = SyncStatus.IN_PROGRESS, + ) + val result = message.shouldDeleteRemote(randomString()) + assertTrue(result is Result.Failure) + } + + @Test + fun `shouldDeleteRemote should return Failure for SYNC_NEEDED sync status`() { + val message = randomMessage( + type = MessageType.REGULAR, + syncStatus = SyncStatus.SYNC_NEEDED, + ) + val result = message.shouldDeleteRemote(randomString()) + assertTrue(result is Result.Failure) + } + + @Test + fun `shouldDeleteRemote should return Failure for FAILED_PERMANENTLY sync status`() { + val message = randomMessage( + type = MessageType.REGULAR, + syncStatus = SyncStatus.FAILED_PERMANENTLY, + ) + val result = message.shouldDeleteRemote(randomString()) + assertTrue(result is Result.Failure) + } + + @Test + fun `shouldDeleteRemote should return Success for COMPLETED regular message`() { + val message = randomMessage( + type = MessageType.REGULAR, + syncStatus = SyncStatus.COMPLETED, + ) + val result = message.shouldDeleteRemote(randomString()) + assertTrue(result is Result.Success) + } + + @Test + fun `shouldDeleteRemote should return Success for AWAITING_ATTACHMENTS regular message`() { + val message = randomMessage( + type = MessageType.REGULAR, + syncStatus = SyncStatus.AWAITING_ATTACHMENTS, + ) + val result = message.shouldDeleteRemote(randomString()) + assertTrue(result is Result.Success) + } } diff --git a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabase.kt b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabase.kt index 661a898a109..e40ef423cf6 100644 --- a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabase.kt +++ b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabase.kt @@ -16,16 +16,14 @@ package io.getstream.chat.android.offline.plugin.listener.internal -import io.getstream.chat.android.client.errors.cause.MessageModerationDeletedException import io.getstream.chat.android.client.extensions.internal.users import io.getstream.chat.android.client.persistance.repository.MessageRepository import io.getstream.chat.android.client.persistance.repository.UserRepository import io.getstream.chat.android.client.plugin.listeners.DeleteMessageListener import io.getstream.chat.android.client.setup.state.ClientState -import io.getstream.chat.android.client.utils.message.isModerationError +import io.getstream.chat.android.client.utils.message.shouldDeleteRemote import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.SyncStatus -import io.getstream.result.Error import io.getstream.result.Result import java.util.Date @@ -45,24 +43,19 @@ internal class DeleteMessageListenerDatabase( * @param messageId The message id to be deleted. */ override suspend fun onMessageDeletePrecondition(messageId: String): Result { - return messageRepository.selectMessage(messageId)?.let { message -> - val currentUserId = clientState.user.value?.id - val isModerationFailed = message.isModerationError(currentUserId) - - if (isModerationFailed) { - messageRepository.deleteChannelMessage(message) - Result.Failure( - Error.ThrowableError( - message = "Message with failed moderation has been deleted locally: $messageId", - cause = MessageModerationDeletedException( - "Message with failed moderation has been deleted locally: $messageId", - ), - ), - ) - } else { - Result.Success(Unit) - } - } ?: Result.Success(Unit) + val localMessage = messageRepository.selectMessage(messageId) + val currentUserId = clientState.user.value?.id + // We don't have the message locally, we must attempt to delete the message remotely + if (localMessage == null) { + return Result.Success(Unit) + } + // Check if the message is local-only (if attempting remote delete should be skipped + val shouldDeleteRemote = localMessage.shouldDeleteRemote(currentUserId) + if (shouldDeleteRemote is Result.Failure) { + // Delete the message ONLY locally + messageRepository.deleteChannelMessage(localMessage) + } + return shouldDeleteRemote } /** diff --git a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt index f8a3a3e1557..0da7cd80b34 100644 --- a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt +++ b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt @@ -19,12 +19,19 @@ package io.getstream.chat.android.offline.plugin.listener.internal import io.getstream.chat.android.client.persistance.repository.MessageRepository import io.getstream.chat.android.client.persistance.repository.UserRepository import io.getstream.chat.android.client.setup.state.ClientState +import io.getstream.chat.android.models.MessageType +import io.getstream.chat.android.models.ModerationAction import io.getstream.chat.android.models.SyncStatus import io.getstream.chat.android.randomCID import io.getstream.chat.android.randomMessage +import io.getstream.chat.android.randomModeration +import io.getstream.chat.android.randomUser import io.getstream.result.Error import io.getstream.result.Result +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.mockito.kotlin.any import org.mockito.kotlin.argThat @@ -37,11 +44,16 @@ internal class DeleteMessageListenerDatabaseTest { private val clientState: ClientState = mock() - private val messageRepository: MessageRepository = mock() + private lateinit var messageRepository: MessageRepository private val userRepository: UserRepository = mock() - private val deleteMessageListenerState: DeleteMessageListenerDatabase = - DeleteMessageListenerDatabase(clientState, messageRepository, userRepository) + private lateinit var deleteMessageListenerState: DeleteMessageListenerDatabase + + @BeforeEach + fun setUp() { + messageRepository = mock() + deleteMessageListenerState = DeleteMessageListenerDatabase(clientState, messageRepository, userRepository) + } @Test fun `when internet is available, the message should be updated as in progress before the request`() = runTest { @@ -122,4 +134,135 @@ internal class DeleteMessageListenerDatabaseTest { }, ) } + + @Test + fun `onMessageDeletePrecondition when message not found locally should return Success`() = runTest { + val currentUser = randomUser() + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(messageRepository.selectMessage(any())) doReturn null + + val result = deleteMessageListenerState.onMessageDeletePrecondition("unknown-message-id") + + assertTrue(result is Result.Success) + } + + @Test + fun `onMessageDeletePrecondition when message has moderation bounce should return Failure and delete from repo`() = + runTest { + val currentUser = randomUser() + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + user = currentUser, + type = MessageType.ERROR, + moderation = randomModeration(action = ModerationAction.bounce), + ) + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(messageRepository.selectMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message is error type should return Failure and delete from repo`() = + runTest { + val currentUser = randomUser() + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.ERROR, + syncStatus = SyncStatus.COMPLETED, + ) + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(messageRepository.selectMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message is ephemeral type should return Failure and delete from repo`() = + runTest { + val currentUser = randomUser() + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.EPHEMERAL, + syncStatus = SyncStatus.COMPLETED, + ) + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(messageRepository.selectMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message has SYNC_NEEDED should return Failure and delete from repo`() = + runTest { + val currentUser = randomUser() + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.REGULAR, + syncStatus = SyncStatus.SYNC_NEEDED, + ) + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(messageRepository.selectMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message has FAILED_PERMANENTLY should return Failure and delete from repo`() = + runTest { + val currentUser = randomUser() + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.REGULAR, + syncStatus = SyncStatus.FAILED_PERMANENTLY, + ) + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(messageRepository.selectMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message is COMPLETED regular should return Success`() = runTest { + val currentUser = randomUser() + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.REGULAR, + syncStatus = SyncStatus.COMPLETED, + ) + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(messageRepository.selectMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Success) + } } diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerState.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerState.kt index 7bca9ef4b98..0833857f672 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerState.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerState.kt @@ -16,16 +16,14 @@ package io.getstream.chat.android.state.plugin.listener.internal -import io.getstream.chat.android.client.errors.cause.MessageModerationDeletedException import io.getstream.chat.android.client.plugin.listeners.DeleteMessageListener import io.getstream.chat.android.client.setup.state.ClientState -import io.getstream.chat.android.client.utils.message.isModerationError +import io.getstream.chat.android.client.utils.message.shouldDeleteRemote import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.SyncStatus import io.getstream.chat.android.state.plugin.logic.channel.internal.ChannelLogic import io.getstream.chat.android.state.plugin.logic.internal.LogicRegistry import io.getstream.chat.android.state.plugin.state.global.GlobalState -import io.getstream.result.Error import io.getstream.result.Result import java.util.Date @@ -45,25 +43,19 @@ internal class DeleteMessageListenerState( * @param messageId The message id to be deleted. */ override suspend fun onMessageDeletePrecondition(messageId: String): Result { - val channelLogic: ChannelLogic? = logic.channelFromMessageId(messageId) - - return channelLogic?.getMessage(messageId)?.let { message -> - val isModerationFailed = message.isModerationError(clientState.user.value?.id) - - if (isModerationFailed) { - deleteMessage(message) - Result.Failure( - Error.ThrowableError( - message = "Message with failed moderation has been deleted locally: $messageId", - cause = MessageModerationDeletedException( - "Message with failed moderation has been deleted locally: $messageId", - ), - ), - ) - } else { - Result.Success(Unit) - } - } ?: Result.Success(Unit) + val localMessage = logic.channelFromMessageId(messageId)?.getMessage(messageId) + val currentUserId = clientState.user.value?.id + // We don't have the message locally, we must attempt to delete the message remotely + if (localMessage == null) { + return Result.Success(Unit) + } + // Check if the message is local-only (if attempting remote delete should be skipped) + val shouldDeleteRemote = localMessage.shouldDeleteRemote(currentUserId) + if (shouldDeleteRemote is Result.Failure) { + // Delete the message ONLY locally + deleteMessage(localMessage) + } + return shouldDeleteRemote } /** @@ -75,19 +67,13 @@ internal class DeleteMessageListenerState( val channelLogic: ChannelLogic? = logic.channelFromMessageId(messageId) channelLogic?.getMessage(messageId)?.let { message -> - val isModerationFailed = message.isModerationError(clientState.user.value?.id) + val networkAvailable = clientState.isNetworkAvailable + val messageToBeDeleted = message.copy( + deletedAt = Date(), + syncStatus = if (!networkAvailable) SyncStatus.SYNC_NEEDED else SyncStatus.IN_PROGRESS, + ) - if (isModerationFailed) { - deleteMessage(message) - } else { - val networkAvailable = clientState.isNetworkAvailable - val messageToBeDeleted = message.copy( - deletedAt = Date(), - syncStatus = if (!networkAvailable) SyncStatus.SYNC_NEEDED else SyncStatus.IN_PROGRESS, - ) - - updateMessage(messageToBeDeleted) - } + updateMessage(messageToBeDeleted) } } diff --git a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt index 26d34596953..0440575acdd 100644 --- a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt +++ b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt @@ -17,9 +17,12 @@ package io.getstream.chat.android.state.plugin.listener.internal import io.getstream.chat.android.client.setup.state.ClientState +import io.getstream.chat.android.models.MessageType +import io.getstream.chat.android.models.ModerationAction import io.getstream.chat.android.models.SyncStatus import io.getstream.chat.android.randomCID import io.getstream.chat.android.randomMessage +import io.getstream.chat.android.randomModeration import io.getstream.chat.android.randomUser import io.getstream.chat.android.state.plugin.logic.channel.internal.ChannelLogic import io.getstream.chat.android.state.plugin.logic.channel.internal.ChannelStateLogic @@ -30,6 +33,7 @@ import io.getstream.result.Error import io.getstream.result.Result import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import org.mockito.kotlin.any import org.mockito.kotlin.argThat @@ -168,4 +172,143 @@ internal class DeleteMessageListenerStateTest { }, ) } + + @Test + fun `onMessageDeletePrecondition when message not found locally should return Success`() = runTest { + whenever(logicRegistry.channelFromMessageId(any())) doReturn null + + val result = deleteMessageListenerState.onMessageDeletePrecondition("unknown-message-id") + + assertTrue(result is Result.Success) + } + + @Test + fun `onMessageDeletePrecondition when message has moderation bounce should return Failure and delete locally`() = + runTest { + val currentUser = randomUser() + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + user = currentUser, + type = MessageType.ERROR, + moderation = randomModeration(action = ModerationAction.bounce), + ) + + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + whenever(logicRegistry.channelFromMessageId(any())) doReturn channelLogic + whenever(logicRegistry.channelFromMessage(any())) doReturn channelLogic + whenever(logicRegistry.getActiveQueryThreadsLogic()) doReturn activeThreadsLogic + whenever(logicRegistry.threadFromMessage(any())) doReturn null + whenever(channelLogic.getMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(channelLogic).deleteMessage(argThat { id == testMessage.id }) + verify(threadsLogic).deleteMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message is error type should return Failure and delete locally`() = runTest { + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.ERROR, + syncStatus = SyncStatus.COMPLETED, + ) + + whenever(logicRegistry.channelFromMessageId(any())) doReturn channelLogic + whenever(logicRegistry.channelFromMessage(any())) doReturn channelLogic + whenever(logicRegistry.getActiveQueryThreadsLogic()) doReturn activeThreadsLogic + whenever(logicRegistry.threadFromMessage(any())) doReturn null + whenever(channelLogic.getMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(channelLogic).deleteMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message is ephemeral type should return Failure and delete locally`() = + runTest { + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.EPHEMERAL, + syncStatus = SyncStatus.COMPLETED, + ) + + whenever(logicRegistry.channelFromMessageId(any())) doReturn channelLogic + whenever(logicRegistry.channelFromMessage(any())) doReturn channelLogic + whenever(logicRegistry.getActiveQueryThreadsLogic()) doReturn activeThreadsLogic + whenever(logicRegistry.threadFromMessage(any())) doReturn null + whenever(channelLogic.getMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(channelLogic).deleteMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message has SYNC_NEEDED should return Failure and delete locally`() = + runTest { + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.REGULAR, + syncStatus = SyncStatus.SYNC_NEEDED, + ) + + whenever(logicRegistry.channelFromMessageId(any())) doReturn channelLogic + whenever(logicRegistry.channelFromMessage(any())) doReturn channelLogic + whenever(logicRegistry.getActiveQueryThreadsLogic()) doReturn activeThreadsLogic + whenever(logicRegistry.threadFromMessage(any())) doReturn null + whenever(channelLogic.getMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(channelLogic).deleteMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message has FAILED_PERMANENTLY should return Failure and delete locally`() = + runTest { + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.REGULAR, + syncStatus = SyncStatus.FAILED_PERMANENTLY, + ) + + whenever(logicRegistry.channelFromMessageId(any())) doReturn channelLogic + whenever(logicRegistry.channelFromMessage(any())) doReturn channelLogic + whenever(logicRegistry.getActiveQueryThreadsLogic()) doReturn activeThreadsLogic + whenever(logicRegistry.threadFromMessage(any())) doReturn null + whenever(channelLogic.getMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Failure) + verify(channelLogic).deleteMessage(argThat { id == testMessage.id }) + } + + @Test + fun `onMessageDeletePrecondition when message is COMPLETED regular should return Success`() = runTest { + val testMessage = randomMessage( + id = "msg-1", + cid = randomCID(), + type = MessageType.REGULAR, + syncStatus = SyncStatus.COMPLETED, + ) + + whenever(logicRegistry.channelFromMessageId(any())) doReturn channelLogic + whenever(channelLogic.getMessage(any())) doReturn testMessage + + val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) + + assertTrue(result is Result.Success) + } } From 3e3e389e78e1b3b6c65d04cd6adbee50dc72d5b8 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 10:06:01 +0000 Subject: [PATCH 03/33] AUTOMATION: Version Bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c645f50ea37..ea325ed08b7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ android.enableR8.fullMode=true android.suppressUnsupportedCompileSdk=34 # Project version -version=6.32.2 +version=6.32.3 From 714ea4f38927a515b39087e4c558538612bbe44f Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Wed, 18 Feb 2026 20:06:12 +0100 Subject: [PATCH 04/33] Fix auto scroll to bottom when exiting a thread (#6165) Co-authored-by: Claude --- .../chat/android/compose/ui/messages/list/Messages.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt index 8a1f69c7ca8..8e5d9b9119e 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt @@ -310,7 +310,10 @@ internal fun BoxScope.DefaultMessagesHelperContent( // Keep track of the last new message state that triggered a scroll to bottom. // If a configuration change happens, we want to keep the same state // and not scroll to bottom again if the newMessageState is the same as before the configuration change. - var lastScrollToBottomOnNewMessage by rememberSaveable(saver = MutableStateNewMessageStateSaver) { + var lastScrollToBottomOnNewMessage by rememberSaveable( + isMessageInThread, + saver = MutableStateNewMessageStateSaver, + ) { mutableStateOf(newMessageState) } @@ -344,9 +347,7 @@ internal fun BoxScope.DefaultMessagesHelperContent( count = messagesState.unreadCount, onClick = { scrollToBottom { - coroutineScope.launch { - lazyListState.scrollToItem(0) - } + coroutineScope.launch { lazyListState.scrollToItem(0) } } }, ) From 04a2a58ebdb89ddf31adc5d975746e18bcaf7019 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Thu, 19 Feb 2026 16:40:15 +0100 Subject: [PATCH 05/33] Fix CaptureMediaContract not remembered across recompositions (#6169) Co-authored-by: Claude --- .../ui/messages/attachments/media/CaptureMediaLauncher.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt index 1b0f3bf93e2..3d8364380dc 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt @@ -19,6 +19,7 @@ package io.getstream.chat.android.compose.ui.messages.attachments.media import androidx.activity.compose.ManagedActivityResultLauncher import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import io.getstream.chat.android.ui.common.contract.internal.CaptureMediaContract import java.io.File @@ -62,8 +63,10 @@ public fun rememberCaptureMediaLauncher( video: Boolean, onResult: (File) -> Unit, ): ManagedActivityResultLauncher? { - val mode = resolveMediaPickerMode(photo, video) ?: return null - return rememberLauncherForActivityResult(CaptureMediaContract(mode)) { file -> + val contract = remember(photo, video) { + resolveMediaPickerMode(photo, video)?.let { CaptureMediaContract(it) } + } ?: return null + return rememberLauncherForActivityResult(contract) { file -> file?.let(onResult) } } From 38f908aab93466b384a0f0462043add9a6b075ef Mon Sep 17 00:00:00 2001 From: Gianmarco <47775302+gpunto@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:32:49 +0100 Subject: [PATCH 06/33] Explicitly set repository name in the conventions plugin (#6170) --- build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index e3371fdb19f..e3241b75259 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,6 +28,8 @@ plugins { } streamProject { + repositoryName = "stream-chat-android" + spotless { ignoredModules = setOf("stream-chat-android-docs") } From d7a52d6ce7e782b4a97f246f84931838d0e47382 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Mon, 23 Feb 2026 09:46:45 +0100 Subject: [PATCH 07/33] Fix delivery receipts not being sent in privacy settings updates (#6178) Co-authored-by: Claude --- .../android/client/api2/mapping/DtoMapping.kt | 10 +++ .../android/client/socket/SocketFactory.kt | 21 ++--- .../client/api2/mapping/DtoMappingTest.kt | 21 +++++ .../client/socket/SocketFactoryTest.kt | 80 +++++++++++++++---- 4 files changed, 103 insertions(+), 29 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt index 39205468738..3439c354cf0 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/DtoMapping.kt @@ -16,10 +16,12 @@ package io.getstream.chat.android.client.api2.mapping +import io.getstream.chat.android.DeliveryReceipts import io.getstream.chat.android.PrivacySettings import io.getstream.chat.android.ReadReceipts import io.getstream.chat.android.TypingIndicators import io.getstream.chat.android.client.api2.model.dto.AttachmentDto +import io.getstream.chat.android.client.api2.model.dto.DeliveryReceiptsDto import io.getstream.chat.android.client.api2.model.dto.DeviceDto import io.getstream.chat.android.client.api2.model.dto.PrivacySettingsDto import io.getstream.chat.android.client.api2.model.dto.ReadReceiptsDto @@ -207,6 +209,7 @@ internal class DtoMapping( internal fun PrivacySettings.toDto(): PrivacySettingsDto = PrivacySettingsDto( typing_indicators = typingIndicators?.toDto(), read_receipts = readReceipts?.toDto(), + delivery_receipts = deliveryReceipts?.toDto(), ) /** @@ -223,6 +226,13 @@ internal class DtoMapping( enabled = enabled, ) + /** + * Maps the domain [DeliveryReceipts] model to a network [DeliveryReceiptsDto] model. + */ + internal fun DeliveryReceipts.toDto(): DeliveryReceiptsDto = DeliveryReceiptsDto( + enabled = enabled, + ) + /** * Maps the domain [User] model to a network [UpstreamUserDto] model. * diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt index 196fa19a1ee..582b1238d2f 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt @@ -107,21 +107,14 @@ internal class SocketFactory( private fun PrivacySettings.reducePrivacySettings(): Map = mutableMapOf() .apply { - typingIndicators?.also { - put( - "typing_indicators", - mapOf( - "enabled" to it.enabled, - ), - ) + typingIndicators?.let { + put("typing_indicators", mapOf("enabled" to it.enabled)) } - readReceipts?.also { - put( - "read_receipts", - mapOf( - "enabled" to it.enabled, - ), - ) + deliveryReceipts?.let { + put("delivery_receipts", mapOf("enabled" to it.enabled)) + } + readReceipts?.let { + put("read_receipts", mapOf("enabled" to it.enabled)) } } diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt index 0df358ab54c..d86fe3f1454 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/api2/mapping/DtoMappingTest.kt @@ -16,10 +16,12 @@ package io.getstream.chat.android.client.api2.mapping +import io.getstream.chat.android.DeliveryReceipts import io.getstream.chat.android.PrivacySettings import io.getstream.chat.android.ReadReceipts import io.getstream.chat.android.TypingIndicators import io.getstream.chat.android.client.api2.model.dto.AttachmentDto +import io.getstream.chat.android.client.api2.model.dto.DeliveryReceiptsDto import io.getstream.chat.android.client.api2.model.dto.DeviceDto import io.getstream.chat.android.client.api2.model.dto.PrivacySettingsDto import io.getstream.chat.android.client.api2.model.dto.ReadReceiptsDto @@ -238,12 +240,31 @@ internal class DtoMappingTest { val privacySettings = PrivacySettings( typingIndicators = TypingIndicators(enabled = true), readReceipts = ReadReceipts(enabled = false), + deliveryReceipts = DeliveryReceipts(enabled = false), ) val mapping = Fixture().get() val dto = with(mapping) { privacySettings.toDto() } val expected = PrivacySettingsDto( typing_indicators = TypingIndicatorsDto(enabled = true), read_receipts = ReadReceiptsDto(enabled = false), + delivery_receipts = DeliveryReceiptsDto(enabled = false), + ) + dto shouldBeEqualTo expected + } + + @Test + fun `PrivacySettings with null deliveryReceipts is correctly mapped to Dto`() { + val privacySettings = PrivacySettings( + typingIndicators = TypingIndicators(enabled = true), + readReceipts = ReadReceipts(enabled = false), + deliveryReceipts = null, + ) + val mapping = Fixture().get() + val dto = with(mapping) { privacySettings.toDto() } + val expected = PrivacySettingsDto( + typing_indicators = TypingIndicatorsDto(enabled = true), + read_receipts = ReadReceiptsDto(enabled = false), + delivery_receipts = null, ) dto shouldBeEqualTo expected } diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt index 41002a9d56c..3509bf8599e 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt @@ -16,6 +16,10 @@ package io.getstream.chat.android.client.socket +import io.getstream.chat.android.DeliveryReceipts +import io.getstream.chat.android.PrivacySettings +import io.getstream.chat.android.ReadReceipts +import io.getstream.chat.android.TypingIndicators import io.getstream.chat.android.client.parser.ChatParser import io.getstream.chat.android.client.parser2.ParserFactory import io.getstream.chat.android.client.token.FakeTokenManager @@ -94,7 +98,7 @@ internal class SocketFactoryTest { } @JvmStatic - @Suppress("MaxLineLength") + @Suppress("MaxLineLength", "LongMethod") fun arguments() = listOf( randomUser(image = randomString(), name = randomString(), language = randomString()).let { Arguments.of( @@ -138,26 +142,72 @@ internal class SocketFactoryTest { "${endpoint}connect?json=${buildMinimumUserJson("anon")}&api_key=$apiKey&X-Stream-Client=${headersUtil.buildSdkTrackingHeaders()}&stream-auth-type=anonymous", ) }, + randomUser( + image = randomString(), + name = randomString(), + language = randomString(), + privacySettings = PrivacySettings( + typingIndicators = TypingIndicators(enabled = false), + deliveryReceipts = DeliveryReceipts(enabled = false), + readReceipts = ReadReceipts(enabled = true), + ), + ).let { + Arguments.of( + false, + SocketFactory.ConnectionConf.UserConnectionConf(endpoint, apiKey, it), + "${endpoint}connect?json=${buildFullUserJson(it, it.id)}&api_key=$apiKey&X-Stream-Client=${headersUtil.buildSdkTrackingHeaders()}&authorization=$token&stream-auth-type=jwt", + ) + }, + randomUser( + image = randomString(), + name = randomString(), + language = randomString(), + privacySettings = PrivacySettings( + typingIndicators = null, + deliveryReceipts = DeliveryReceipts(enabled = false), + readReceipts = null, + ), + ).let { + Arguments.of( + false, + SocketFactory.ConnectionConf.UserConnectionConf(endpoint, apiKey, it), + "${endpoint}connect?json=${buildFullUserJson(it, it.id)}&api_key=$apiKey&X-Stream-Client=${headersUtil.buildSdkTrackingHeaders()}&authorization=$token&stream-auth-type=jwt", + ) + }, ) private fun buildMinimumUserJson(userId: String): String = encode( defaultMap(userId, mapOf("id" to userId)), ) - private fun buildFullUserJson(user: User, userId: String): String = encode( - defaultMap( - userId, - mapOf( - "id" to userId, - "role" to user.role, - "banned" to user.isBanned, - "invisible" to user.isInvisible, - "language" to user.language, - "image" to user.image, - "name" to user.name, - ) + user.extraData, - ), - ) + private fun buildFullUserJson(user: User, userId: String): String { + val ps = user.privacySettings + return encode( + defaultMap( + userId, + linkedMapOf( + "id" to userId, + "role" to user.role, + "banned" to user.isBanned, + "invisible" to user.isInvisible, + ) + if (ps != null) { + mapOf( + "privacy_settings" to listOfNotNull( + ps.typingIndicators?.let { "typing_indicators" to mapOf("enabled" to it.enabled) }, + ps.deliveryReceipts?.let { "delivery_receipts" to mapOf("enabled" to it.enabled) }, + ps.readReceipts?.let { "read_receipts" to mapOf("enabled" to it.enabled) }, + ).toMap(), + ) + } else { + emptyMap() + } + mapOf( + "language" to user.language, + "image" to user.image, + "name" to user.name, + ) + user.extraData, + ), + ) + } private fun defaultMap(userId: String, userDetails: Map): Map = mapOf( From 7abef21fa88d8f40cd60ef1bc98ba287d380a299 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 08:54:19 +0000 Subject: [PATCH 08/33] [skip ci] Update SDK sizes --- metrics/size.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/size.json b/metrics/size.json index acccb9eb54c..4043c2a402a 100644 --- a/metrics/size.json +++ b/metrics/size.json @@ -2,7 +2,7 @@ "debug": { "stream-chat-android-client": 6944, "stream-chat-android-offline": 7284, - "stream-chat-android-ui-components": 13396, + "stream-chat-android-ui-components": 13400, "stream-chat-android-compose": 16644 }, "release": { From 0a76dd60b60b3b052a82a31f135ba7c401e10955 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Mon, 23 Feb 2026 17:38:43 +0100 Subject: [PATCH 09/33] Fix `rememberCaptureMediaLauncher` not surviving `Activity` death (#6177) * Ensure AttachmentsPickerViewModel.isShowingAttachments is preserved across process death. * Fix CaptureMediaContract not preserved across activity death. * Remove logs. * Introduce `CaptureMediaContract.restoreFilePaths` method. --- .../api/stream-chat-android-compose.api | 3 + ...AttachmentsPickerMediaCaptureTabFactory.kt | 46 +++++++------- .../attachments/media/CaptureMediaLauncher.kt | 60 +++++++++++++++++-- .../messages/AttachmentsPickerViewModel.kt | 32 +++++++++- .../messages/MessagesViewModelFactory.kt | 23 +++++++ .../compose/messages/MessageComposer.kt | 4 +- .../contract/internal/CaptureMediaContract.kt | 41 ++++++++++++- 7 files changed, 172 insertions(+), 37 deletions(-) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index b3de3922358..4c4e996a5d5 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -4973,6 +4973,8 @@ public final class io/getstream/chat/android/compose/viewmodel/mentions/MentionL public final class io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel : androidx/lifecycle/ViewModel { public static final field $stable I public fun (Lio/getstream/chat/android/compose/ui/util/StorageHelperWrapper;Lkotlinx/coroutines/flow/StateFlow;)V + public fun (Lio/getstream/chat/android/compose/ui/util/StorageHelperWrapper;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/SavedStateHandle;)V + public synthetic fun (Lio/getstream/chat/android/compose/ui/util/StorageHelperWrapper;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/SavedStateHandle;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun changeAttachmentPickerMode (Lio/getstream/chat/android/compose/state/messages/attachments/AttachmentsPickerMode;Lkotlin/jvm/functions/Function0;)V public static synthetic fun changeAttachmentPickerMode$default (Lio/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel;Lio/getstream/chat/android/compose/state/messages/attachments/AttachmentsPickerMode;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V public final fun changeAttachmentState (Z)V @@ -5135,6 +5137,7 @@ public final class io/getstream/chat/android/compose/viewmodel/messages/Messages public fun (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/client/setup/state/ClientState;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lio/getstream/chat/android/ui/common/feature/messages/composer/mention/UserLookupHandler;Lkotlin/jvm/functions/Function1;ILio/getstream/chat/android/ui/common/helper/ClipboardHandler;ZIZLio/getstream/chat/android/ui/common/state/messages/list/DeletedMessageVisibility;Lio/getstream/chat/android/ui/common/state/messages/list/MessageFooterVisibility;Lio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/MessagePositionHandler;ZZZZZ)V public synthetic fun (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/client/setup/state/ClientState;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lio/getstream/chat/android/ui/common/feature/messages/composer/mention/UserLookupHandler;Lkotlin/jvm/functions/Function1;ILio/getstream/chat/android/ui/common/helper/ClipboardHandler;ZIZLio/getstream/chat/android/ui/common/state/messages/list/DeletedMessageVisibility;Lio/getstream/chat/android/ui/common/state/messages/list/MessageFooterVisibility;Lio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/DateSeparatorHandler;Lio/getstream/chat/android/ui/common/feature/messages/list/MessagePositionHandler;ZZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun create (Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; + public fun create (Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; } public final class io/getstream/chat/android/compose/viewmodel/messages/PollResultsViewModel : androidx/lifecycle/ViewModel { diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/factory/AttachmentsPickerMediaCaptureTabFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/factory/AttachmentsPickerMediaCaptureTabFactory.kt index 54b082db161..acbfcb22f7e 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/factory/AttachmentsPickerMediaCaptureTabFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/factory/AttachmentsPickerMediaCaptureTabFactory.kt @@ -17,13 +17,15 @@ package io.getstream.chat.android.compose.ui.messages.attachments.factory import android.Manifest -import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.remember +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag @@ -36,11 +38,10 @@ import io.getstream.chat.android.compose.R import io.getstream.chat.android.compose.state.messages.attachments.AttachmentPickerItemState import io.getstream.chat.android.compose.state.messages.attachments.AttachmentsPickerMode import io.getstream.chat.android.compose.state.messages.attachments.MediaCapture +import io.getstream.chat.android.compose.ui.messages.attachments.media.rememberCancelAwareCaptureMediaLauncher import io.getstream.chat.android.compose.ui.theme.ChatTheme -import io.getstream.chat.android.ui.common.contract.internal.CaptureMediaContract import io.getstream.chat.android.ui.common.state.messages.composer.AttachmentMetaData import io.getstream.chat.android.ui.common.utils.isPermissionDeclared -import java.io.File /** * Holds the information required to add support for "media capture" tab in the attachment picker. @@ -101,22 +102,27 @@ public class AttachmentsPickerMediaCaptureTabFactory(private val pickerMediaMode val cameraPermissionState = if (requiresCameraPermission) rememberPermissionState(permission = Manifest.permission.CAMERA) else null - val contract = remember { CaptureMediaContract(pickerMediaMode.mode) } - val mediaCaptureResultLauncher = - rememberLauncherForActivityResult(contract = contract) { file: File? -> - val attachments = if (file == null) { - emptyList() - } else { - listOf(AttachmentMetaData(context, file)) - } - - onAttachmentsSubmitted(attachments) + val mediaCaptureResultLauncher = rememberCancelAwareCaptureMediaLauncher( + photo = pickerMediaMode == PickerMediaMode.PHOTO || pickerMediaMode == PickerMediaMode.PHOTO_AND_VIDEO, + video = pickerMediaMode == PickerMediaMode.VIDEO || pickerMediaMode == PickerMediaMode.PHOTO_AND_VIDEO, + ) { file -> + val attachments = if (file == null) { + emptyList() + } else { + listOf(AttachmentMetaData(context, file)) } + onAttachmentsSubmitted(attachments) + } + + var hasLaunched by rememberSaveable { mutableStateOf(false) } if (cameraPermissionState == null || cameraPermissionState.status == PermissionStatus.Granted) { Box(modifier = Modifier.fillMaxSize()) { LaunchedEffect(Unit) { - mediaCaptureResultLauncher.launch(Unit) + if (!hasLaunched) { + hasLaunched = true + mediaCaptureResultLauncher?.launch(Unit) + } } } } else if (cameraPermissionState.status is PermissionStatus.Denied) { @@ -132,14 +138,4 @@ public class AttachmentsPickerMediaCaptureTabFactory(private val pickerMediaMode VIDEO, PHOTO_AND_VIDEO, } - - /** - * Map [PickerMediaMode] into [CaptureMediaContract.Mode] - */ - private val PickerMediaMode.mode: CaptureMediaContract.Mode - get() = when (this) { - PickerMediaMode.PHOTO -> CaptureMediaContract.Mode.PHOTO - PickerMediaMode.VIDEO -> CaptureMediaContract.Mode.VIDEO - PickerMediaMode.PHOTO_AND_VIDEO -> CaptureMediaContract.Mode.PHOTO_AND_VIDEO - } } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt index 3d8364380dc..6d1f029a128 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/media/CaptureMediaLauncher.kt @@ -19,12 +19,22 @@ package io.getstream.chat.android.compose.ui.messages.attachments.media import androidx.activity.compose.ManagedActivityResultLauncher import androidx.activity.compose.rememberLauncherForActivityResult import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import io.getstream.chat.android.ui.common.contract.internal.CaptureMediaContract import java.io.File /** - * Creates and remembers a launcher for capturing media (photo and/or video) using the device camera. + * Creates and remembers a process-death-safe launcher for capturing media (photo and/or video) + * using the device camera. + * + * Destination file paths are persisted via [rememberSaveable]. When the hosting activity is + * destroyed and recreated (e.g. under "Don't keep activities"), the paths are restored on the + * [CaptureMediaContract] before the pending result is delivered, ensuring the captured file is + * correctly resolved. * * @param photo If `true`, enables photo capture capability. When both [photo] and [video] are * `true`, the user will be able to capture both types of media. @@ -62,12 +72,52 @@ public fun rememberCaptureMediaLauncher( photo: Boolean, video: Boolean, onResult: (File) -> Unit, +): ManagedActivityResultLauncher? = + rememberCaptureMediaLauncherInternal(photo, video) { file -> + file?.let(onResult) + } + +/** + * Internal cancel-aware variant of [rememberCaptureMediaLauncher]. + * + * Unlike the public API, this variant invokes [onResult] with `null` when the user cancels the + * capture, allowing callers to react to cancellation (e.g. dismiss the picker). + */ +@Composable +internal fun rememberCancelAwareCaptureMediaLauncher( + photo: Boolean, + video: Boolean, + onResult: (File?) -> Unit, +): ManagedActivityResultLauncher? = + rememberCaptureMediaLauncherInternal(photo, video, onResult) + +@Composable +private fun rememberCaptureMediaLauncherInternal( + photo: Boolean, + video: Boolean, + onResult: (File?) -> Unit, ): ManagedActivityResultLauncher? { - val contract = remember(photo, video) { - resolveMediaPickerMode(photo, video)?.let { CaptureMediaContract(it) } - } ?: return null + val mode = resolveMediaPickerMode(photo, video) ?: return null + + var pictureFilePath by rememberSaveable { mutableStateOf(null) } + var videoFilePath by rememberSaveable { mutableStateOf(null) } + + val contract = remember(mode) { + CaptureMediaContract(mode) { createdPicture, createdVideo -> + pictureFilePath = createdPicture?.absolutePath + videoFilePath = createdVideo?.absolutePath + } + } + + // Restore file references on the contract after process death. + // Runs during composition, before rememberLauncherForActivityResult re-registers + // in its DisposableEffect and dispatches pending results. + contract.restoreFilePaths(picturePath = pictureFilePath, videoPath = videoFilePath) + return rememberLauncherForActivityResult(contract) { file -> - file?.let(onResult) + onResult(file) + pictureFilePath = null + videoFilePath = null } } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt index f45d63f88d0..e5193e13f41 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel.kt @@ -20,6 +20,7 @@ import android.net.Uri import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import io.getstream.chat.android.client.channel.state.ChannelState @@ -45,10 +46,17 @@ import kotlinx.coroutines.withContext * * Used to load file and media images that are then connected to the UI. It also keeps state of the * selected items and prepares items before sending them. + * + * @param storageHelper Wrapper around storage utilities for loading media and files. + * @param channelState The state of the channel where attachments are being picked. + * @param savedStateHandle Handle for persisting state across process death. When provided by + * [MessagesViewModelFactory], it survives activity destruction (e.g. "Don't keep activities" mode), + * ensuring the picker UI is restored when the activity recreates. */ -public class AttachmentsPickerViewModel( +public class AttachmentsPickerViewModel @JvmOverloads constructor( private val storageHelper: StorageHelperWrapper, channelState: StateFlow, + private val savedStateHandle: SavedStateHandle = SavedStateHandle(), ) : ViewModel() { /** @@ -105,9 +113,23 @@ public class AttachmentsPickerViewModel( /** * Gives us information if we're showing the attachments picker or not. + * + * Backed by both [MutableState] (for Compose observation/recomposition) and [SavedStateHandle] + * (for persistence across process death). This ensures the picker remains visible after activity + * recreation (e.g. when returning from an external activity like the camera or file picker under + * "Don't keep activities" mode), which in turn allows `rememberLauncherForActivityResult` + * callbacks inside the picker composable tree to re-register and receive the pending result. */ - public var isShowingAttachments: Boolean by mutableStateOf(false) - private set + public var isShowingAttachments: Boolean + get() = _isShowingAttachments.value + private set(value) { + _isShowingAttachments.value = value + savedStateHandle[KEY_IS_SHOWING_ATTACHMENTS] = value + } + + private val _isShowingAttachments = mutableStateOf( + savedStateHandle.get(KEY_IS_SHOWING_ATTACHMENTS) ?: false, + ) /** * Loads all the items based on the current type. @@ -265,4 +287,8 @@ public class AttachmentsPickerViewModel( images = emptyList() files = emptyList() } + + private companion object { + private const val KEY_IS_SHOWING_ATTACHMENTS = "io.getstream.chat.isShowingAttachments" + } } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt index d2f8cc06df7..e6fb406e7e1 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt @@ -19,8 +19,11 @@ package io.getstream.chat.android.compose.viewmodel.messages import android.content.ClipboardManager import android.content.Context import androidx.core.net.toUri +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.createSavedStateHandle +import androidx.lifecycle.viewmodel.CreationExtras import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.channel.state.ChannelState import io.getstream.chat.android.client.setup.state.ClientState @@ -178,4 +181,24 @@ public class MessagesViewModelFactory( @Suppress("UNCHECKED_CAST") return viewModel as T } + + /** + * Creates the required [ViewModel] with access to [CreationExtras], which provides a + * [SavedStateHandle] for persisting state across process death. + * + * Called by Compose's `viewModel()` helper. Falls back to [create] for ViewModels + * that do not require a [SavedStateHandle]. + */ + override fun create(modelClass: Class, extras: CreationExtras): T { + if (modelClass == AttachmentsPickerViewModel::class.java) { + val savedStateHandle = extras.createSavedStateHandle() + @Suppress("UNCHECKED_CAST") + return AttachmentsPickerViewModel( + storageHelper = StorageHelperWrapper(context), + channelState = channelStateFlow, + savedStateHandle = savedStateHandle, + ) as T + } + return create(modelClass) + } } diff --git a/stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/messages/MessageComposer.kt b/stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/messages/MessageComposer.kt index eec17a93883..1e527207e27 100644 --- a/stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/messages/MessageComposer.kt +++ b/stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/messages/MessageComposer.kt @@ -17,11 +17,11 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Email import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Email import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember diff --git a/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/contract/internal/CaptureMediaContract.kt b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/contract/internal/CaptureMediaContract.kt index 16cd554c614..664289a0a0b 100644 --- a/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/contract/internal/CaptureMediaContract.kt +++ b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/contract/internal/CaptureMediaContract.kt @@ -37,20 +37,38 @@ import java.io.File * - Videos: `{externalFilesDir}/Movies/` * With fallback to cache directories if external storage is unavailable. * - * @param mode The capture mode determining what media types can be captured - * @param fileManager Manager for creating temporary files in external storage + * [pictureFile] and [videoFile] are set during [createIntent] and used by [parseResult] to resolve + * the captured file. After process death these references are lost; callers can restore them via + * [restoreFilePaths] before the pending result is dispatched. + * + * @param mode The capture mode determining what media types can be captured. + * @param fileManager Manager for creating temporary files in external storage. + * @param onFilesCreated Optional callback invoked inside [createIntent] after destination files + * are created, giving the caller an opportunity to persist the file references before the + * external activity starts. */ @InternalStreamChatApi public class CaptureMediaContract( private val mode: Mode, private val fileManager: StreamFileManager = StreamFileManager(), + private val onFilesCreated: ((pictureFile: File?, videoFile: File?) -> Unit)? = null, ) : ActivityResultContract() { + /** + * The destination file for a captured photo. + * Set by [createIntent]; can be restored externally after process death. + */ private var pictureFile: File? = null + + /** + * The destination file for a captured video. + * Set by [createIntent]; can be restored externally after process death. + */ private var videoFile: File? = null override fun createIntent(context: Context, input: Unit): Intent { val intents: List = mode.intents(context) + onFilesCreated?.invoke(pictureFile, videoFile) val initialIntent = intents.lastOrNull() ?: Intent() return Intent.createChooser(initialIntent, mode.label(context)) .apply { @@ -61,6 +79,25 @@ public class CaptureMediaContract( } } + /** + * Restores [pictureFile] and [videoFile] from previously persisted absolute paths. + * + * After process death the in-memory file references are lost, so the pending + * [ActivityResultContract] callback would be unable to locate the captured media. + * Call this method **before** the result is dispatched (e.g. in `onCreate`) to + * reconstruct the destination files so that [parseResult] can return the correct file. + * + * Passing `null` for either parameter leaves the corresponding file reference unchanged. + * + * @param picturePath Absolute path of the photo destination file, or `null`. + * @param videoPath Absolute path of the video destination file, or `null`. + */ + @InternalStreamChatApi + public fun restoreFilePaths(picturePath: String?, videoPath: String?) { + picturePath?.let { pictureFile = File(it) } + videoPath?.let { videoFile = File(it) } + } + private fun getRecordVideoIntents(context: Context): List { videoFile = fileManager.createVideoInExternalDir(context).getOrNull() return videoFile From ab79e256596c11251778dee2582e6441b6d07a12 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:48:15 +0000 Subject: [PATCH 10/33] [skip ci] Update SDK sizes --- metrics/size.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/size.json b/metrics/size.json index 4043c2a402a..6229ac5fffd 100644 --- a/metrics/size.json +++ b/metrics/size.json @@ -3,7 +3,7 @@ "stream-chat-android-client": 6944, "stream-chat-android-offline": 7284, "stream-chat-android-ui-components": 13400, - "stream-chat-android-compose": 16644 + "stream-chat-android-compose": 16648 }, "release": { "stream-chat-android-client": 5384, From 982316b50a68389793ae128d87e36ec48e4d9309 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Tue, 24 Feb 2026 13:44:42 +0100 Subject: [PATCH 11/33] Fix delete message not working when offline (SYNC_NEEDED) (#6184) * Fix delete message not working when offline (SYNC_NEEDED) Co-Authored-By: Claude * Update DeleteMessageListener tests for SYNC_NEEDED remote delete Co-Authored-By: Claude --------- Co-authored-by: Claude --- .../client/utils/message/MessageUtils.kt | 3 +-- .../client/utils/message/MessageUtilsTest.kt | 18 +++++++++--------- .../DeleteMessageListenerDatabaseTest.kt | 5 ++--- .../internal/DeleteMessageListenerStateTest.kt | 8 ++------ 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt index 03be42f9c58..c5c75c54c09 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt @@ -230,10 +230,9 @@ public fun Message.shouldDeleteRemote(currentUserId: String?): Result { return Result.Failure(error) } // 2. type = 'error'/'ephemeral' - not persisted on server, delete only locally - // 3. syncStatus = 'IN_PROGRESS'/`SYNC_NEEDED`/`FAILED_PERMANENTLY` - not persisted on server, delete only locally + // 3. syncStatus = 'IN_PROGRESS'/`FAILED_PERMANENTLY` - not persisted on server, delete only locally if (isError() || isEphemeral() || syncStatus == SyncStatus.IN_PROGRESS || - syncStatus == SyncStatus.SYNC_NEEDED || syncStatus == SyncStatus.FAILED_PERMANENTLY ) { val error = Error.GenericError("Message is local-only, don't call DeleteMessage API") diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt index 9e52d4d795a..3fb8c3af7ee 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt @@ -629,40 +629,40 @@ internal class MessageUtilsTest { } @Test - fun `shouldDeleteRemote should return Failure for SYNC_NEEDED sync status`() { + fun `shouldDeleteRemote should return Failure for FAILED_PERMANENTLY sync status`() { val message = randomMessage( type = MessageType.REGULAR, - syncStatus = SyncStatus.SYNC_NEEDED, + syncStatus = SyncStatus.FAILED_PERMANENTLY, ) val result = message.shouldDeleteRemote(randomString()) assertTrue(result is Result.Failure) } @Test - fun `shouldDeleteRemote should return Failure for FAILED_PERMANENTLY sync status`() { + fun `shouldDeleteRemote should return Success for COMPLETED regular message`() { val message = randomMessage( type = MessageType.REGULAR, - syncStatus = SyncStatus.FAILED_PERMANENTLY, + syncStatus = SyncStatus.COMPLETED, ) val result = message.shouldDeleteRemote(randomString()) - assertTrue(result is Result.Failure) + assertTrue(result is Result.Success) } @Test - fun `shouldDeleteRemote should return Success for COMPLETED regular message`() { + fun `shouldDeleteRemote should return Success for AWAITING_ATTACHMENTS regular message`() { val message = randomMessage( type = MessageType.REGULAR, - syncStatus = SyncStatus.COMPLETED, + syncStatus = SyncStatus.AWAITING_ATTACHMENTS, ) val result = message.shouldDeleteRemote(randomString()) assertTrue(result is Result.Success) } @Test - fun `shouldDeleteRemote should return Success for AWAITING_ATTACHMENTS regular message`() { + fun `shouldDeleteRemote should return Success for SYNC_NEEDED sync status`() { val message = randomMessage( type = MessageType.REGULAR, - syncStatus = SyncStatus.AWAITING_ATTACHMENTS, + syncStatus = SyncStatus.SYNC_NEEDED, ) val result = message.shouldDeleteRemote(randomString()) assertTrue(result is Result.Success) diff --git a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt index 0da7cd80b34..804dfeb4b4f 100644 --- a/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt +++ b/stream-chat-android-offline/src/test/java/io/getstream/chat/android/offline/plugin/listener/internal/DeleteMessageListenerDatabaseTest.kt @@ -209,7 +209,7 @@ internal class DeleteMessageListenerDatabaseTest { } @Test - fun `onMessageDeletePrecondition when message has SYNC_NEEDED should return Failure and delete from repo`() = + fun `onMessageDeletePrecondition when message has SYNC_NEEDED should return Success`() = runTest { val currentUser = randomUser() val testMessage = randomMessage( @@ -224,8 +224,7 @@ internal class DeleteMessageListenerDatabaseTest { val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) - assertTrue(result is Result.Failure) - verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id }) + assertTrue(result is Result.Success) } @Test diff --git a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt index 0440575acdd..e2ee17bdaaa 100644 --- a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt +++ b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/listener/internal/DeleteMessageListenerStateTest.kt @@ -252,7 +252,7 @@ internal class DeleteMessageListenerStateTest { } @Test - fun `onMessageDeletePrecondition when message has SYNC_NEEDED should return Failure and delete locally`() = + fun `onMessageDeletePrecondition when message has SYNC_NEEDED should return Success`() = runTest { val testMessage = randomMessage( id = "msg-1", @@ -262,15 +262,11 @@ internal class DeleteMessageListenerStateTest { ) whenever(logicRegistry.channelFromMessageId(any())) doReturn channelLogic - whenever(logicRegistry.channelFromMessage(any())) doReturn channelLogic - whenever(logicRegistry.getActiveQueryThreadsLogic()) doReturn activeThreadsLogic - whenever(logicRegistry.threadFromMessage(any())) doReturn null whenever(channelLogic.getMessage(any())) doReturn testMessage val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id) - assertTrue(result is Result.Failure) - verify(channelLogic).deleteMessage(argThat { id == testMessage.id }) + assertTrue(result is Result.Success) } @Test From 3b6345c4ff908583af97b36d0a2eab1846233ff8 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Tue, 24 Feb 2026 13:46:41 +0100 Subject: [PATCH 12/33] Restrict StreamFileProvider paths to only used directories (#6183) Co-authored-by: Claude --- .../src/main/res/xml/stream_filepaths.xml | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/stream-chat-android-ui-common/src/main/res/xml/stream_filepaths.xml b/stream-chat-android-ui-common/src/main/res/xml/stream_filepaths.xml index 60e718ca186..63cc24ea32d 100644 --- a/stream-chat-android-ui-common/src/main/res/xml/stream_filepaths.xml +++ b/stream-chat-android-ui-common/src/main/res/xml/stream_filepaths.xml @@ -15,28 +15,16 @@ limitations under the License. --> - - - - From b16c85c2d83144ceea7f3183f16911a66a3696a1 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 12:51:46 +0000 Subject: [PATCH 13/33] AUTOMATION: Version Bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ea325ed08b7..5dfdc6041bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ android.enableR8.fullMode=true android.suppressUnsupportedCompileSdk=34 # Project version -version=6.32.3 +version=6.32.4 From 4c5583030ef218e5a17d2816a1f18ee0e0c103d3 Mon Sep 17 00:00:00 2001 From: Tafel <35837839+tafelnl@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:13:43 +0100 Subject: [PATCH 14/33] Add`headerContent` and `footerContent` slots to `Messages` composable (#6166) * feat: add support for `headingContent` and `footerContent` slots to `Messages` * refactor: address review comments * chore: run `./gradlew apiDump spotlessApply` --------- Co-authored-by: Petar Velikov --- .../api/stream-chat-android-compose.api | 2 +- .../android/compose/ui/messages/list/Messages.kt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 4c4e996a5d5..02e067d8f2c 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -2664,7 +2664,7 @@ public final class io/getstream/chat/android/compose/ui/messages/list/MessageLis } public final class io/getstream/chat/android/compose/ui/messages/list/MessagesKt { - public static final fun Messages (Lio/getstream/chat/android/ui/common/state/messages/list/MessageListState;Lio/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Vertical;Lio/getstream/chat/android/compose/ui/messages/list/ThreadMessagesStart;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;III)V + public static final fun Messages (Lio/getstream/chat/android/ui/common/state/messages/list/MessageListState;Lio/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Vertical;Lio/getstream/chat/android/compose/ui/messages/list/ThreadMessagesStart;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;III)V } public final class io/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState { diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt index 8e5d9b9119e..257aed448df 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/Messages.kt @@ -95,6 +95,8 @@ import kotlin.math.abs * @param loadingMoreContent Composable that represents the loading more content, when we're loading the next page. * @param itemModifier Modifier for styling the message item container. * @param itemContent Composable that represents the item that displays each message. + * @param headerContent The content shown at the top of the list of message items. + * @param footerContent The content shown at the bottom of the list of message items. */ @Composable @Suppress("LongParameterList", "LongMethod", "ComplexMethod") @@ -131,6 +133,8 @@ public fun Messages( } }, itemContent: @Composable LazyItemScope.(MessageListItemState) -> Unit, + headerContent: (@Composable () -> Unit)? = null, + footerContent: (@Composable () -> Unit)? = null, ) { val lazyListState = messagesLazyListState.lazyListState val messages = messagesState.messageItems @@ -170,6 +174,12 @@ public fun Messages( reverseLayout = true, contentPadding = contentPadding, ) { + footerContent?.let { content -> + item { + content.invoke() + } + } + if (isLoadingMoreNewMessages && !endOfNewMessages) { item { loadingMoreContent() @@ -201,6 +211,12 @@ public fun Messages( loadingMoreContent() } } + + headerContent?.let { content -> + item { + content.invoke() + } + } } helperContent() From 9a4e33852801eeabefe6dd254c781146f7c44cf9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 09:22:24 +0000 Subject: [PATCH 15/33] [skip ci] Update SDK sizes --- README.md | 2 +- metrics/size.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1be1c72d736..cd2154a682c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ![stream-chat-android-client](https://img.shields.io/badge/stream--chat--android--client-5.25%20MB-lightgreen) ![stream-chat-android-offline](https://img.shields.io/badge/stream--chat--android--offline-5.48%20MB-lightgreen) ![stream-chat-android-ui-components](https://img.shields.io/badge/stream--chat--android--ui--components-10.62%20MB-lightgreen) -![stream-chat-android-compose](https://img.shields.io/badge/stream--chat--android--compose-12.84%20MB-lightgreen) +![stream-chat-android-compose](https://img.shields.io/badge/stream--chat--android--compose-12.85%20MB-lightgreen) diff --git a/metrics/size.json b/metrics/size.json index 6229ac5fffd..e65756105a9 100644 --- a/metrics/size.json +++ b/metrics/size.json @@ -9,6 +9,6 @@ "stream-chat-android-client": 5384, "stream-chat-android-offline": 5616, "stream-chat-android-ui-components": 10884, - "stream-chat-android-compose": 13156 + "stream-chat-android-compose": 13160 } } From 567d02e0b818f777bd6c6cc559d3790eb987a919 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Wed, 25 Feb 2026 10:27:08 +0100 Subject: [PATCH 16/33] Fix incorrect validation for searchMessages parameters (#6180) * Fix incorrect validation for searchMessages parameters Co-Authored-By: Claude * Fix detekt. --------- Co-authored-by: Claude --- .../java/io/getstream/chat/android/client/ChatClient.kt | 7 +++++-- .../chat/android/client/ChatClientGeneralApiTests.kt | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/ChatClient.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/ChatClient.kt index c4d1f9ca771..0428b52be2b 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/ChatClient.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/ChatClient.kt @@ -1759,8 +1759,11 @@ internal constructor( next: String? = null, sort: QuerySorter? = null, ): Call { - if (offset != null && (sort != null || next != null)) { - return ErrorCall(userScope, Error.GenericError("Cannot specify offset with sort or next parameters")) + if (offset != null && next != null) { + return ErrorCall( + userScope, + Error.GenericError("Cannot use both offset and next values. Specify only one of these options."), + ) } return api.searchMessages( channelFilter = channelFilter, diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/ChatClientGeneralApiTests.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/ChatClientGeneralApiTests.kt index f2c9741c719..bd26c8a470e 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/ChatClientGeneralApiTests.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/ChatClientGeneralApiTests.kt @@ -232,7 +232,7 @@ internal class ChatClientGeneralApiTests : BaseChatClientTest() { } @Test - fun searchMessagesWithoutOffsetWithSortAndNextSuccess() = runTest { + fun searchMessagesWithNextAndSort() = runTest { // given val channelFilter = Filters.neutral() val messageFilter = Filters.neutral() @@ -266,7 +266,7 @@ internal class ChatClientGeneralApiTests : BaseChatClientTest() { // when val result = sut.searchMessages(channelFilter, messageFilter, offset, limit, next, sort).await() // then - verifyGenericError(result, "Cannot specify offset with sort or next parameters") + verifySuccess(result, response) } @Test @@ -285,7 +285,7 @@ internal class ChatClientGeneralApiTests : BaseChatClientTest() { // when val result = sut.searchMessages(channelFilter, messageFilter, offset, limit, next, sort).await() // then - verifyGenericError(result, "Cannot specify offset with sort or next parameters") + verifyGenericError(result, "Cannot use both offset and next values. Specify only one of these options.") } @Test From 3a3ce49560b73d8a0f906eee08b5d5362cb85927 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 09:38:36 +0000 Subject: [PATCH 17/33] [skip ci] Update SDK sizes --- README.md | 2 +- metrics/size.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cd2154a682c..1be1c72d736 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ![stream-chat-android-client](https://img.shields.io/badge/stream--chat--android--client-5.25%20MB-lightgreen) ![stream-chat-android-offline](https://img.shields.io/badge/stream--chat--android--offline-5.48%20MB-lightgreen) ![stream-chat-android-ui-components](https://img.shields.io/badge/stream--chat--android--ui--components-10.62%20MB-lightgreen) -![stream-chat-android-compose](https://img.shields.io/badge/stream--chat--android--compose-12.85%20MB-lightgreen) +![stream-chat-android-compose](https://img.shields.io/badge/stream--chat--android--compose-12.84%20MB-lightgreen) diff --git a/metrics/size.json b/metrics/size.json index e65756105a9..6229ac5fffd 100644 --- a/metrics/size.json +++ b/metrics/size.json @@ -9,6 +9,6 @@ "stream-chat-android-client": 5384, "stream-chat-android-offline": 5616, "stream-chat-android-ui-components": 10884, - "stream-chat-android-compose": 13160 + "stream-chat-android-compose": 13156 } } From e8e97bfd2be5402f8693595373d4df2efc079dec Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Fri, 27 Feb 2026 12:45:27 +0100 Subject: [PATCH 18/33] Use cursor-based pagination for search messages (#6179) * Use cursor-based pagination for search messages Co-Authored-By: Claude * Fix detekt. * Make next internal --------- Co-authored-by: Claude --- .../channels/ChannelListViewModel.kt | 14 +- .../channels/ChannelListViewModelTest.kt | 184 ++++++++++++++--- .../api/stream-chat-android-ui-components.api | 8 +- .../ui/viewmodel/search/SearchViewModel.kt | 28 +-- .../viewmodels/search/SearchViewModelTest.kt | 194 ++++++++++++++++++ 5 files changed, 380 insertions(+), 48 deletions(-) create mode 100644 stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/viewmodels/search/SearchViewModelTest.kt diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt index fe22f7131e8..60e2f87fedc 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt @@ -367,14 +367,14 @@ public class ChannelListViewModel( currentState: SearchMessageState, channelFilter: FilterObject, ): SearchMessageState { - val offset = currentState.messages.size val limit = channelLimit - logger.v { "[searchMessages] #$src; query: '${currentState.query}', offset: $offset, limit: $limit" } + val next = currentState.next + logger.v { "[searchMessages] #$src; query: '${currentState.query}', next: $next, limit: $limit" } val result = chatClient.searchMessages( channelFilter = channelFilter, messageFilter = Filters.autocomplete("text", currentState.query), - offset = offset, limit = limit, + next = next, ).await() return when (result) { is io.getstream.result.Result.Success -> { @@ -383,7 +383,8 @@ public class ChannelListViewModel( messages = currentState.messages + result.value.messages, isLoading = false, isLoadingMore = false, - canLoadMore = result.value.messages.size >= limit, + canLoadMore = !result.value.next.isNullOrEmpty(), + next = result.value.next, ) } is io.getstream.result.Result.Failure -> { @@ -391,7 +392,6 @@ public class ChannelListViewModel( currentState.copy( isLoading = false, isLoadingMore = false, - canLoadMore = true, ) } } @@ -773,6 +773,7 @@ public class ChannelListViewModel( private data class SearchMessageState( val query: String = "", val canLoadMore: Boolean = true, + val next: String? = null, val messages: List = emptyList(), val isLoading: Boolean = false, val isLoadingMore: Boolean = false, @@ -784,7 +785,8 @@ public class ChannelListViewModel( "messages.size=${messages.size}, " + "isLoading=$isLoading, " + "isLoadingMore=$isLoadingMore, " + - "canLoadMore=$canLoadMore)" + "canLoadMore=$canLoadMore, " + + "next=$next)" } } } diff --git a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt index ef8f80bb926..883bfec1c27 100644 --- a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt +++ b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt @@ -19,6 +19,7 @@ package io.getstream.chat.android.compose.viewmodel.channels import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.api.models.QueryChannelsRequest import io.getstream.chat.android.client.channel.ChannelClient +import io.getstream.chat.android.client.persistance.repository.RepositoryFacade import io.getstream.chat.android.client.setup.state.ClientState import io.getstream.chat.android.compose.state.channels.list.ItemState import io.getstream.chat.android.compose.state.channels.list.SearchQuery @@ -30,10 +31,12 @@ import io.getstream.chat.android.models.FilterObject import io.getstream.chat.android.models.Filters import io.getstream.chat.android.models.InitializationState import io.getstream.chat.android.models.OrFilterObject +import io.getstream.chat.android.models.SearchMessagesResult import io.getstream.chat.android.models.TypingEvent import io.getstream.chat.android.models.User import io.getstream.chat.android.models.querysort.QuerySortByField import io.getstream.chat.android.models.querysort.QuerySorter +import io.getstream.chat.android.randomMessage import io.getstream.chat.android.state.event.handler.chat.factory.ChatEventHandlerFactory import io.getstream.chat.android.state.plugin.internal.StatePlugin import io.getstream.chat.android.state.plugin.state.StateRegistry @@ -48,10 +51,15 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest -import org.amshove.kluent.`should be equal to` +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertInstanceOf +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq @@ -76,8 +84,8 @@ internal class ChannelListViewModelTest { .get(this) val channelsState = viewModel.channelsState - channelsState.channelItems.size `should be equal to` 0 - channelsState.isLoading `should be equal to` true + assertEquals(0, channelsState.channelItems.size) + assertTrue(channelsState.isLoading) } @Test @@ -95,8 +103,8 @@ internal class ChannelListViewModelTest { .get(this) val channelsState = viewModel.channelsState - channelsState.channelItems.size `should be equal to` 2 - channelsState.isLoading `should be equal to` false + assertEquals(2, channelsState.channelItems.size) + assertFalse(channelsState.isLoading) } @Test @@ -118,8 +126,8 @@ internal class ChannelListViewModelTest { viewModel.performChannelAction(DeleteConversation(channel1)) viewModel.deleteConversation(channel1) - viewModel.activeChannelAction `should be equal to` null - viewModel.selectedChannel.value `should be equal to` null + assertNull(viewModel.activeChannelAction) + assertNull(viewModel.selectedChannel.value) verify(channelClient).delete() } @@ -140,8 +148,8 @@ internal class ChannelListViewModelTest { viewModel.selectChannel(channel1) viewModel.muteChannel(channel1) - viewModel.activeChannelAction `should be equal to` null - viewModel.selectedChannel.value `should be equal to` null + assertNull(viewModel.activeChannelAction) + assertNull(viewModel.selectedChannel.value) verify(chatClient).muteChannel("messaging", "channel1", null) } @@ -171,9 +179,9 @@ internal class ChannelListViewModelTest { viewModel.selectChannel(channel1) viewModel.unmuteChannel(channel1) - (viewModel.channelsState.channelItems.first() as ItemState.ChannelItemState).isMuted `should be equal to` true - viewModel.activeChannelAction `should be equal to` null - viewModel.selectedChannel.value `should be equal to` null + assertTrue((viewModel.channelsState.channelItems.first() as ItemState.ChannelItemState).isMuted) + assertNull(viewModel.activeChannelAction) + assertNull(viewModel.selectedChannel.value) verify(chatClient).unmuteChannel("messaging", "channel1") } @@ -193,8 +201,8 @@ internal class ChannelListViewModelTest { viewModel.selectChannel(channel1) viewModel.dismissChannelAction() - viewModel.activeChannelAction `should be equal to` null - viewModel.selectedChannel.value `should be equal to` null + assertNull(viewModel.activeChannelAction) + assertNull(viewModel.selectedChannel.value) } @Test @@ -223,8 +231,8 @@ internal class ChannelListViewModelTest { val captor = argumentCaptor() verify(chatClient, times(2)).queryChannels(captor.capture()) - captor.firstValue.offset `should be equal to` 0 - captor.secondValue.offset `should be equal to` 30 + assertEquals(0, captor.firstValue.offset) + assertEquals(30, captor.secondValue.offset) } @Test @@ -246,7 +254,7 @@ internal class ChannelListViewModelTest { val captor = argumentCaptor() verify(chatClient, times(1)).queryChannels(captor.capture()) - captor.firstValue.offset `should be equal to` 0 + assertEquals(0, captor.firstValue.offset) } @Test @@ -271,8 +279,8 @@ internal class ChannelListViewModelTest { val andFilterObject = captor.secondValue.filter as AndFilterObject val orFilterObject = andFilterObject.filterObjects.last() as OrFilterObject val autoCompleteFilterObject = orFilterObject.filterObjects.last() as AutocompleteFilterObject - autoCompleteFilterObject.fieldName `should be equal to` "name" - autoCompleteFilterObject.value `should be equal to` "Search query" + assertEquals("name", autoCompleteFilterObject.fieldName) + assertEquals("Search query", autoCompleteFilterObject.value) } @Test @@ -301,8 +309,8 @@ internal class ChannelListViewModelTest { val andFilterObject = captor.secondValue.filter as AndFilterObject val orFilterObject = andFilterObject.filterObjects.last() as OrFilterObject val autoCompleteFilterObject = orFilterObject.filterObjects.last() as AutocompleteFilterObject - autoCompleteFilterObject.fieldName `should be equal to` "name" - autoCompleteFilterObject.value `should be equal to` "Search query" + assertEquals("name", autoCompleteFilterObject.fieldName) + assertEquals("Search query", autoCompleteFilterObject.value) } @Test @@ -333,9 +341,125 @@ internal class ChannelListViewModelTest { val captor = argumentCaptor() verify(chatClient, times(2)).queryChannels(captor.capture()) - captor.allValues.size `should be equal to` 2 - captor.firstValue.offset `should be equal to` 0 - captor.secondValue.offset `should be equal to` 30 + assertEquals(2, captor.allValues.size) + assertEquals(0, captor.firstValue.offset) + assertEquals(30, captor.secondValue.offset) + } + + @Test + fun `Given channel list When setting message search query Should search messages without offset or cursor`() = + runTest { + val chatClient: ChatClient = mock() + val messages = listOf(randomMessage(cid = "messaging:channel1")) + val searchResult = SearchMessagesResult(messages = messages, next = "cursor_page2") + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenChannelsQuery() + .givenChannelsState( + channelsStateData = ChannelsStateData.Result(listOf(channel1)), + loading = false, + ) + .givenChannelMutes() + .givenSearchMessagesResult(searchResult) + .givenRepositorySelectChannels(listOf(channel1)) + .get(this) + + viewModel.setSearchQuery(SearchQuery.Messages("hello")) + advanceUntilIdle() + + verify(chatClient).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = eq(null), + limit = any(), + next = eq(null), + sort = eq(null), + ) + val items = viewModel.channelsState.channelItems + assertEquals(1, items.size) + assertInstanceOf(ItemState.SearchResultItemState::class.java, items.first()) + } + + @Test + fun `Given message search results with next cursor When loading more Should pass the cursor`() = + runTest { + val chatClient: ChatClient = mock() + val firstPageMessages = listOf(randomMessage(cid = "messaging:channel1")) + val firstPageResult = SearchMessagesResult(messages = firstPageMessages, next = "cursor_page2") + val secondPageMessages = listOf(randomMessage(cid = "messaging:channel1")) + val secondPageResult = SearchMessagesResult(messages = secondPageMessages, next = null) + + whenever( + chatClient.searchMessages(any(), any(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()), + ).doReturn( + firstPageResult.asCall(), + secondPageResult.asCall(), + ) + + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenChannelsQuery() + .givenChannelsState( + channelsStateData = ChannelsStateData.Result(listOf(channel1)), + loading = false, + ) + .givenChannelMutes() + .givenRepositorySelectChannels(listOf(channel1)) + .get(this) + + viewModel.setSearchQuery(SearchQuery.Messages("hello")) + advanceUntilIdle() + + viewModel.loadMore() + advanceUntilIdle() + + val captor = argumentCaptor() + verify(chatClient, times(2)).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = anyOrNull(), + limit = anyOrNull(), + next = captor.capture(), + sort = anyOrNull(), + ) + assertNull(captor.firstValue) + assertEquals("cursor_page2", captor.secondValue) + } + + @Test + fun `Given message search results without next cursor When loading more Should not load more`() = + runTest { + val chatClient: ChatClient = mock() + val messages = listOf(randomMessage(cid = "messaging:channel1")) + val searchResult = SearchMessagesResult(messages = messages, next = null) + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenChannelsQuery() + .givenChannelsState( + channelsStateData = ChannelsStateData.Result(listOf(channel1)), + loading = false, + ) + .givenChannelMutes() + .givenSearchMessagesResult(searchResult) + .givenRepositorySelectChannels(listOf(channel1)) + .get(this) + + viewModel.setSearchQuery(SearchQuery.Messages("hello")) + advanceUntilIdle() + + assertTrue(viewModel.channelsState.endOfChannels) + + viewModel.loadMore() + advanceUntilIdle() + + verify(chatClient, times(1)).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = anyOrNull(), + limit = anyOrNull(), + next = anyOrNull(), + sort = anyOrNull(), + ) } private class Fixture( @@ -347,6 +471,7 @@ internal class ChannelListViewModelTest { private val clientState: ClientState = mock() private val stateRegistry: StateRegistry = mock() private val globalState: GlobalState = mock() + private val repositoryFacade: RepositoryFacade = mock() init { val statePlugin: StatePlugin = mock() @@ -357,6 +482,7 @@ internal class ChannelListViewModelTest { whenever(chatClient.channel(any())) doReturn channelClient whenever(chatClient.channel(any(), any())) doReturn channelClient whenever(chatClient.clientState) doReturn clientState + whenever(chatClient.repositoryFacade) doReturn repositoryFacade whenever(globalState.channelDraftMessages) doReturn MutableStateFlow(emptyMap()) } @@ -394,6 +520,16 @@ internal class ChannelListViewModelTest { whenever(chatClient.unmuteChannel(any(), any())) doReturn Unit.asCall() } + fun givenSearchMessagesResult(result: SearchMessagesResult) = apply { + whenever( + chatClient.searchMessages(any(), any(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()), + ) doReturn result.asCall() + } + + suspend fun givenRepositorySelectChannels(channels: List = emptyList()) = apply { + whenever(repositoryFacade.selectChannels(any>())) doReturn channels + } + fun givenChannelsState( channelsStateData: ChannelsStateData = ChannelsStateData.Loading, channels: List? = null, diff --git a/stream-chat-android-ui-components/api/stream-chat-android-ui-components.api b/stream-chat-android-ui-components/api/stream-chat-android-ui-components.api index e432f6630a5..77c098e8f27 100644 --- a/stream-chat-android-ui-components/api/stream-chat-android-ui-components.api +++ b/stream-chat-android-ui-components/api/stream-chat-android-ui-components.api @@ -5209,15 +5209,15 @@ public final class io/getstream/chat/android/ui/viewmodel/search/SearchViewModel public final class io/getstream/chat/android/ui/viewmodel/search/SearchViewModel$State { public fun ()V - public fun (Ljava/lang/String;ZLjava/util/List;ZZ)V - public synthetic fun (Ljava/lang/String;ZLjava/util/List;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;ZLjava/util/List;ZZLjava/lang/String;)V + public synthetic fun (Ljava/lang/String;ZLjava/util/List;ZZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Ljava/lang/String; public final fun component2 ()Z public final fun component3 ()Ljava/util/List; public final fun component4 ()Z public final fun component5 ()Z - public final fun copy (Ljava/lang/String;ZLjava/util/List;ZZ)Lio/getstream/chat/android/ui/viewmodel/search/SearchViewModel$State; - public static synthetic fun copy$default (Lio/getstream/chat/android/ui/viewmodel/search/SearchViewModel$State;Ljava/lang/String;ZLjava/util/List;ZZILjava/lang/Object;)Lio/getstream/chat/android/ui/viewmodel/search/SearchViewModel$State; + public final fun copy (Ljava/lang/String;ZLjava/util/List;ZZLjava/lang/String;)Lio/getstream/chat/android/ui/viewmodel/search/SearchViewModel$State; + public static synthetic fun copy$default (Lio/getstream/chat/android/ui/viewmodel/search/SearchViewModel$State;Ljava/lang/String;ZLjava/util/List;ZZLjava/lang/String;ILjava/lang/Object;)Lio/getstream/chat/android/ui/viewmodel/search/SearchViewModel$State; public fun equals (Ljava/lang/Object;)Z public final fun getCanLoadMore ()Z public final fun getQuery ()Ljava/lang/String; diff --git a/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt b/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt index 350bd4d5d1b..f699a39925a 100644 --- a/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt +++ b/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt @@ -22,7 +22,7 @@ import androidx.lifecycle.ViewModel import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.core.internal.coroutines.DispatcherProvider import io.getstream.chat.android.models.Filters -import io.getstream.chat.android.models.Message +import io.getstream.chat.android.models.SearchMessagesResult import io.getstream.chat.android.state.utils.Event import io.getstream.chat.android.ui.common.model.MessageResult import io.getstream.log.taggedLogger @@ -124,7 +124,7 @@ public class SearchViewModel( val currentState = _state.value!! val result = searchMessages( query = currentState.query, - offset = currentState.results.size, + next = currentState.next, ) when (result) { is Result.Success -> handleSearchMessageSuccess(result.value) @@ -136,12 +136,12 @@ public class SearchViewModel( /** * Notifies the UI about the search results and enables the pagination. */ - private suspend fun handleSearchMessageSuccess(messages: List) { - logger.d { "Found messages: ${messages.size}" } + private suspend fun handleSearchMessageSuccess(searchResult: SearchMessagesResult) { + logger.d { "Found messages: ${searchResult.messages.size}" } val currentState = _state.value!! - val channels = chatClient.repositoryFacade.selectChannels(messages.map { it.cid }) + val channels = chatClient.repositoryFacade.selectChannels(searchResult.messages.map { it.cid }) _state.value = currentState.copy( - results = currentState.results + messages.map { + results = currentState.results + searchResult.messages.map { MessageResult( message = it, channel = channels.firstOrNull { channel -> channel.cid == it.cid }, @@ -149,7 +149,8 @@ public class SearchViewModel( }, isLoading = false, isLoadingMore = false, - canLoadMore = messages.size == QUERY_LIMIT, + canLoadMore = !searchResult.next.isNullOrEmpty(), + next = searchResult.next, ) } @@ -161,7 +162,6 @@ public class SearchViewModel( _state.value = _state.value!!.copy( isLoading = false, isLoadingMore = false, - canLoadMore = true, ) _errorEvents.value = Event(Unit) } @@ -170,21 +170,19 @@ public class SearchViewModel( * Searches messages containing [query] text across channels where the current user is a member. * * @param query The search query. - * @param offset The pagination offset offset. + * @param next The cursor for the next page of results. */ - private suspend fun searchMessages(query: String, offset: Int): Result> { - logger.d { "Searching for \"$query\" with offset: $offset" } + private suspend fun searchMessages(query: String, next: String?): Result { + logger.d { "Searching for \"$query\" with next: $next" } val currentUser = requireNotNull(chatClient.clientState.user.value) - // TODO: use the pagination based on "limit" nad "next" params here return chatClient .searchMessages( channelFilter = Filters.`in`("members", listOf(currentUser.id)), messageFilter = Filters.autocomplete("text", query), - offset = offset, limit = QUERY_LIMIT, + next = next, ) .await() - .map { it.messages } } /** @@ -195,6 +193,7 @@ public class SearchViewModel( * @param canLoadMore If we've reached the end of messages, to stop triggering pagination. * @param isLoading If we're currently loading data (initial load). * @param isLoadingMore If we're loading more items (pagination). + * @param next The cursor for the next page of results. */ public data class State( val query: String = "", @@ -202,6 +201,7 @@ public class SearchViewModel( val results: List = emptyList(), val isLoading: Boolean = false, val isLoadingMore: Boolean = false, + internal val next: String? = null, ) private companion object { diff --git a/stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/viewmodels/search/SearchViewModelTest.kt b/stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/viewmodels/search/SearchViewModelTest.kt new file mode 100644 index 00000000000..2a78f15a05e --- /dev/null +++ b/stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/viewmodels/search/SearchViewModelTest.kt @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.chat.android.ui.viewmodels.search + +import io.getstream.chat.android.client.ChatClient +import io.getstream.chat.android.client.persistance.repository.RepositoryFacade +import io.getstream.chat.android.client.setup.state.ClientState +import io.getstream.chat.android.models.Channel +import io.getstream.chat.android.models.SearchMessagesResult +import io.getstream.chat.android.models.User +import io.getstream.chat.android.randomMessage +import io.getstream.chat.android.test.InstantTaskExecutorExtension +import io.getstream.chat.android.test.TestCoroutineExtension +import io.getstream.chat.android.test.asCall +import io.getstream.chat.android.test.observeAll +import io.getstream.chat.android.ui.viewmodel.search.SearchViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.RegisterExtension +import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull +import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +internal class SearchViewModelTest { + + @Test + fun `Given empty query When setting query Should clear results`() = runTest { + val viewModel = Fixture() + .givenCurrentUser() + .givenSearchMessagesResult(SearchMessagesResult(messages = listOf(randomMessage(cid = "messaging:ch1")))) + .givenRepositorySelectChannels() + .get() + + viewModel.setQuery("hello") + viewModel.setQuery("") + + val states = viewModel.state.observeAll() + val lastState = states.last() + assertEquals(0, lastState.results.size) + assertFalse(lastState.isLoading) + assertFalse(lastState.canLoadMore) + assertNull(lastState.next) + } + + @Test + fun `Given search query When searching Should call searchMessages without offset or cursor`() = runTest { + val chatClient: ChatClient = mock() + val messages = listOf(randomMessage(cid = "messaging:ch1")) + val searchResult = SearchMessagesResult(messages = messages, next = "cursor_page2") + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenSearchMessagesResult(searchResult) + .givenRepositorySelectChannels() + .get() + + viewModel.setQuery("hello") + + verify(chatClient).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = eq(null), + limit = any(), + next = eq(null), + sort = eq(null), + ) + } + + @Test + fun `Given search results with next cursor When loading more Should pass the cursor`() = runTest { + val chatClient: ChatClient = mock() + val firstPageMessages = listOf(randomMessage(cid = "messaging:ch1")) + val firstPageResult = SearchMessagesResult(messages = firstPageMessages, next = "cursor_page2") + val secondPageMessages = listOf(randomMessage(cid = "messaging:ch1")) + val secondPageResult = SearchMessagesResult(messages = secondPageMessages, next = null) + + whenever( + chatClient.searchMessages(any(), any(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()), + ).doReturn( + firstPageResult.asCall(), + secondPageResult.asCall(), + ) + + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenRepositorySelectChannels() + .get() + + viewModel.setQuery("hello") + viewModel.loadMore() + + val captor = argumentCaptor() + verify(chatClient, times(2)).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = anyOrNull(), + limit = anyOrNull(), + next = captor.capture(), + sort = anyOrNull(), + ) + assertNull(captor.firstValue) + assertEquals("cursor_page2", captor.secondValue) + } + + @Test + fun `Given search results without next cursor When loading more Should not load more`() = runTest { + val chatClient: ChatClient = mock() + val messages = listOf(randomMessage(cid = "messaging:ch1")) + val searchResult = SearchMessagesResult(messages = messages, next = null) + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenSearchMessagesResult(searchResult) + .givenRepositorySelectChannels() + .get() + + viewModel.setQuery("hello") + + val states = viewModel.state.observeAll() + val lastState = states.last() + assertFalse(lastState.canLoadMore) + + viewModel.loadMore() + + verify(chatClient, times(1)).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = anyOrNull(), + limit = anyOrNull(), + next = anyOrNull(), + sort = anyOrNull(), + ) + } + + private class Fixture( + private val chatClient: ChatClient = mock(), + ) { + private val clientState: ClientState = mock() + private val repositoryFacade: RepositoryFacade = mock() + + init { + whenever(chatClient.clientState) doReturn clientState + whenever(chatClient.repositoryFacade) doReturn repositoryFacade + } + + fun givenCurrentUser(currentUser: User = User(id = "Jc")) = apply { + whenever(clientState.user) doReturn MutableStateFlow(currentUser) + } + + fun givenSearchMessagesResult(result: SearchMessagesResult) = apply { + whenever( + chatClient.searchMessages(any(), any(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()), + ) doReturn result.asCall() + } + + suspend fun givenRepositorySelectChannels(channels: List = emptyList()) = apply { + whenever(repositoryFacade.selectChannels(any>())) doReturn channels + } + + fun get(): SearchViewModel = SearchViewModel(chatClient = chatClient) + } + + companion object { + @JvmField + @RegisterExtension + val testCoroutines: TestCoroutineExtension = TestCoroutineExtension() + + @JvmField + @RegisterExtension + val instantExecutorExtension: InstantTaskExecutorExtension = InstantTaskExecutorExtension() + } +} From db0d4c8db22ee0e5468129cca09ccf269eaef604 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:55:49 +0000 Subject: [PATCH 19/33] [skip ci] Update SDK sizes --- README.md | 2 +- metrics/size.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1be1c72d736..cd2154a682c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ![stream-chat-android-client](https://img.shields.io/badge/stream--chat--android--client-5.25%20MB-lightgreen) ![stream-chat-android-offline](https://img.shields.io/badge/stream--chat--android--offline-5.48%20MB-lightgreen) ![stream-chat-android-ui-components](https://img.shields.io/badge/stream--chat--android--ui--components-10.62%20MB-lightgreen) -![stream-chat-android-compose](https://img.shields.io/badge/stream--chat--android--compose-12.84%20MB-lightgreen) +![stream-chat-android-compose](https://img.shields.io/badge/stream--chat--android--compose-12.85%20MB-lightgreen) diff --git a/metrics/size.json b/metrics/size.json index 6229ac5fffd..e65756105a9 100644 --- a/metrics/size.json +++ b/metrics/size.json @@ -9,6 +9,6 @@ "stream-chat-android-client": 5384, "stream-chat-android-offline": 5616, "stream-chat-android-ui-components": 10884, - "stream-chat-android-compose": 13156 + "stream-chat-android-compose": 13160 } } From 6807a8e4335dfa3c9191e89e7f92900edb21aeac Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Fri, 27 Feb 2026 13:26:40 +0100 Subject: [PATCH 20/33] Add `messageSearchSort` option to `ChannelListViewModel` and `ChannelViewModelFactory` (#6187) * Use cursor-based pagination for search messages Co-Authored-By: Claude * Fix detekt. * Add messageSearchSort option to ChannelListViewModel and ChannelViewModelFactory Co-Authored-By: Claude * Add tests for messageSearchSort in ChannelListViewModel Co-Authored-By: Claude * Make next internal * Add messageSearchSort to logs * detekt * detekt --------- Co-authored-by: Claude --- .../api/stream-chat-android-compose.api | 8 +-- .../channels/ChannelListViewModel.kt | 8 ++- .../channels/ChannelViewModelFactory.kt | 4 ++ .../channels/ChannelListViewModelTest.kt | 71 +++++++++++++++++++ 4 files changed, 86 insertions(+), 5 deletions(-) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 02e067d8f2c..826c04026d2 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -4887,8 +4887,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channel/ChannelIn public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel : androidx/lifecycle/ViewModel { public static final field $stable I - public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;JZLkotlinx/coroutines/flow/Flow;)V - public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;JZLkotlinx/coroutines/flow/Flow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;JZLio/getstream/chat/android/models/querysort/QuerySorter;Lkotlinx/coroutines/flow/Flow;)V + public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;JZLio/getstream/chat/android/models/querysort/QuerySorter;Lkotlinx/coroutines/flow/Flow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun archiveChannel (Lio/getstream/chat/android/models/Channel;)V public final fun deleteConversation (Lio/getstream/chat/android/models/Channel;)V public final fun dismissChannelAction ()V @@ -4920,8 +4920,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelL public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory : androidx/lifecycle/ViewModelProvider$Factory { public static final field $stable I public fun ()V - public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;Z)V - public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;ZLio/getstream/chat/android/models/querysort/QuerySorter;)V + public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/state/event/handler/chat/factory/ChatEventHandlerFactory;ZLio/getstream/chat/android/models/querysort/QuerySorter;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun create (Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; } diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt index 60e2f87fedc..71e60fcd1bb 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel.kt @@ -89,6 +89,7 @@ import kotlin.coroutines.cancellation.CancellationException * @param chatEventHandlerFactory The instance of [ChatEventHandlerFactory] used to create [ChatEventHandler]. * @param searchDebounceMs The debounce time for search queries. * @param isDraftMessageEnabled If the draft message feature is enabled. + * @param messageSearchSort Sorting for message search results. When `null`, the server-side default is used. * @param globalState A flow emitting the current [GlobalState]. */ @OptIn(ExperimentalCoroutinesApi::class) @@ -103,6 +104,7 @@ public class ChannelListViewModel( private val chatEventHandlerFactory: ChatEventHandlerFactory = ChatEventHandlerFactory(chatClient.clientState), searchDebounceMs: Long = SEARCH_DEBOUNCE_MS, private val isDraftMessageEnabled: Boolean = false, + private val messageSearchSort: QuerySorter? = null, private val globalState: Flow = chatClient.globalStateFlow, ) : ViewModel() { @@ -369,10 +371,14 @@ public class ChannelListViewModel( ): SearchMessageState { val limit = channelLimit val next = currentState.next - logger.v { "[searchMessages] #$src; query: '${currentState.query}', next: $next, limit: $limit" } + logger.v { + "[searchMessages] #$src; query: '${currentState.query}', sort: $messageSearchSort, next: $next, " + + "limit: $limit" + } val result = chatClient.searchMessages( channelFilter = channelFilter, messageFilter = Filters.autocomplete("text", currentState.query), + sort = messageSearchSort, limit = limit, next = next, ).await() diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory.kt index fac41b7b87c..fbd2c9afd3c 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.ViewModelProvider import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.models.Channel import io.getstream.chat.android.models.FilterObject +import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.querysort.QuerySortByField import io.getstream.chat.android.models.querysort.QuerySorter import io.getstream.chat.android.state.event.handler.chat.ChatEventHandler @@ -39,6 +40,7 @@ import io.getstream.chat.android.state.event.handler.chat.factory.ChatEventHandl * @param messageLimit How many messages are fetched for each channel item when loading channels. * When `null`, the server-side default is used. * @param chatEventHandlerFactory The instance of [ChatEventHandlerFactory] used to create [ChatEventHandler]. + * @param messageSearchSort Optional sorting for message search results. When `null`, the server-side default is used. */ public class ChannelViewModelFactory( private val chatClient: ChatClient = ChatClient.instance(), @@ -49,6 +51,7 @@ public class ChannelViewModelFactory( private val messageLimit: Int? = null, private val chatEventHandlerFactory: ChatEventHandlerFactory = ChatEventHandlerFactory(chatClient.clientState), private val isDraftMessageEnabled: Boolean = false, + private val messageSearchSort: QuerySorter? = null, ) : ViewModelProvider.Factory { /** @@ -68,6 +71,7 @@ public class ChannelViewModelFactory( memberLimit = memberLimit, chatEventHandlerFactory = chatEventHandlerFactory, isDraftMessageEnabled = isDraftMessageEnabled, + messageSearchSort = messageSearchSort, ) as T } } diff --git a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt index 883bfec1c27..f9c54285f30 100644 --- a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt +++ b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt @@ -30,6 +30,7 @@ import io.getstream.chat.android.models.ChannelMute import io.getstream.chat.android.models.FilterObject import io.getstream.chat.android.models.Filters import io.getstream.chat.android.models.InitializationState +import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.OrFilterObject import io.getstream.chat.android.models.SearchMessagesResult import io.getstream.chat.android.models.TypingEvent @@ -462,6 +463,70 @@ internal class ChannelListViewModelTest { ) } + @Test + fun `Given no messageSearchSort When searching messages Should pass null sort to searchMessages`() = + runTest { + val chatClient: ChatClient = mock() + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenChannelsQuery() + .givenChannelsState( + channelsStateData = ChannelsStateData.Result(listOf(channel1, channel2)), + loading = false, + ) + .givenChannelMutes() + .givenSearchMessagesResult(SearchMessagesResult()) + .givenRepositorySelectChannels() + .get(this) + + viewModel.setSearchQuery(SearchQuery.Messages("test")) + advanceUntilIdle() + + val sortCaptor = argumentCaptor>() + verify(chatClient).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = anyOrNull(), + limit = anyOrNull(), + next = anyOrNull(), + sort = sortCaptor.capture(), + ) + assertNull(sortCaptor.firstValue) + } + + @Test + fun `Given messageSearchSort is set When searching messages Should pass the sort to searchMessages`() = + runTest { + val chatClient: ChatClient = mock() + val messageSearchSort = QuerySortByField.descByName("created_at") + val viewModel = Fixture(chatClient) + .givenCurrentUser() + .givenChannelsQuery() + .givenChannelsState( + channelsStateData = ChannelsStateData.Result(listOf(channel1, channel2)), + loading = false, + ) + .givenChannelMutes() + .givenMessageSearchSort(messageSearchSort) + .givenSearchMessagesResult(SearchMessagesResult()) + .givenRepositorySelectChannels() + .get(this) + + viewModel.setSearchQuery(SearchQuery.Messages("test")) + advanceUntilIdle() + + val sortCaptor = argumentCaptor>() + verify(chatClient).searchMessages( + channelFilter = any(), + messageFilter = any(), + offset = anyOrNull(), + limit = anyOrNull(), + next = anyOrNull(), + sort = sortCaptor.capture(), + ) + assertEquals(messageSearchSort, sortCaptor.firstValue) + } + private class Fixture( private val chatClient: ChatClient = mock(), private val channelClient: ChannelClient = mock(), @@ -472,6 +537,7 @@ internal class ChannelListViewModelTest { private val stateRegistry: StateRegistry = mock() private val globalState: GlobalState = mock() private val repositoryFacade: RepositoryFacade = mock() + private var messageSearchSort: QuerySorter? = null init { val statePlugin: StatePlugin = mock() @@ -520,6 +586,10 @@ internal class ChannelListViewModelTest { whenever(chatClient.unmuteChannel(any(), any())) doReturn Unit.asCall() } + fun givenMessageSearchSort(sort: QuerySorter?) = apply { + messageSearchSort = sort + } + fun givenSearchMessagesResult(result: SearchMessagesResult) = apply { whenever( chatClient.searchMessages(any(), any(), anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull()), @@ -556,6 +626,7 @@ internal class ChannelListViewModelTest { initialFilters = initialFilters, isDraftMessageEnabled = false, chatEventHandlerFactory = ChatEventHandlerFactory(clientState), + messageSearchSort = messageSearchSort, globalState = MutableStateFlow(globalState), ) testScope.advanceUntilIdle() From 7b637878efa94c5a5b0ba616037c0f7dca152acc Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 15:52:05 +0000 Subject: [PATCH 21/33] AUTOMATION: Version Bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 5dfdc6041bc..153ff90b0a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ android.enableR8.fullMode=true android.suppressUnsupportedCompileSdk=34 # Project version -version=6.32.4 +version=6.33.0 From 29b2d88a4e5085a5aa98e3c943c22a894058d3eb Mon Sep 17 00:00:00 2001 From: "stream-pr-merger[bot]" <117762243+stream-pr-merger[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:50:07 +0100 Subject: [PATCH 22/33] AUTOMATION: Clean Detekt Baseline Files (#6198) Co-authored-by: adasiewiczr <17440581+adasiewiczr@users.noreply.github.com> --- stream-chat-android-ui-components/detekt-baseline.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/stream-chat-android-ui-components/detekt-baseline.xml b/stream-chat-android-ui-components/detekt-baseline.xml index 88ba9e162ff..370e3254295 100644 --- a/stream-chat-android-ui-components/detekt-baseline.xml +++ b/stream-chat-android-ui-components/detekt-baseline.xml @@ -8,7 +8,6 @@ ComplexCondition:FootnoteDecorator.kt$FootnoteDecorator$!isGiphy && !isDeleted && userLanguage != i18nLanguage && translatedText != data.message.text ComplexCondition:MediaAttachmentView.kt$MediaAttachmentView$attachment.isImage() || (attachment.isVideo() && ChatUI.videoThumbnailsEnabled && attachment.thumbUrl != null) ForbiddenComment:MediaAttachmentGridView.kt$MediaAttachmentGridView.SharedMediaSpaceItemDecorator$// TODO: leaves empty space after pagination - ForbiddenComment:SearchViewModel.kt$SearchViewModel$// TODO: use the pagination based on "limit" nad "next" params here IteratorNotThrowingNoSuchElementException:MessageComposerView.kt$<no name provided>$<no name provided> : Iterator LargeClass:MessageComposerViewStyle.kt$MessageComposerViewStyle$Companion LargeClass:MessageListView.kt$MessageListView : ConstraintLayout From b18ddb839d2a6d7d8f4f51a12c342b46f50c13bf Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Thu, 5 Mar 2026 13:33:45 +0100 Subject: [PATCH 23/33] Introduce thread safe `AsyncImageHeadersProvider` for custom image headers (#6203) * Introduce AsyncImageHeadersProvider. * Introduce AsyncImageHeadersProvider. * Update KDocs * Set interceptorCoroutineContext --- .../api/stream-chat-android-compose.api | 7 ++- .../android/compose/ui/theme/ChatTheme.kt | 45 ++++++++++++++++-- .../ui/util/ImageHeadersInterceptor.kt | 45 ++++++++++++++++++ .../ui/util/StreamCoilImageLoaderFactory.kt | 39 +++++++++++++-- .../api/stream-chat-android-ui-common.api | 6 +++ .../helper/AsyncImageHeadersProvider.kt | 42 +++++++++++++++++ .../common/images/StreamImageLoaderFactory.kt | 47 +++++++++---------- 7 files changed, 199 insertions(+), 32 deletions(-) create mode 100644 stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/ImageHeadersInterceptor.kt create mode 100644 stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider.kt diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 826c04026d2..44e7788d5fb 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -3245,7 +3245,7 @@ public final class io/getstream/chat/android/compose/ui/theme/ChatTheme { } public final class io/getstream/chat/android/compose/ui/theme/ChatThemeKt { - public static final fun ChatTheme (ZZZZZLio/getstream/chat/android/ui/common/permissions/SystemAttachmentsPickerConfig;Lio/getstream/chat/android/compose/ui/theme/StreamColors;Lio/getstream/chat/android/compose/ui/theme/StreamDimens;Lio/getstream/chat/android/compose/ui/theme/StreamTypography;Lio/getstream/chat/android/compose/ui/theme/StreamShapes;Lio/getstream/chat/android/compose/ui/theme/StreamRippleConfiguration;Lio/getstream/chat/android/ui/common/model/UserPresence;Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Ljava/util/List;Lio/getstream/chat/android/compose/ui/components/messages/factory/MessageContentFactory;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/compose/ui/util/ReactionIconFactory;Lio/getstream/chat/android/ui/common/helper/ReactionPushEmojiFactory;Lio/getstream/chat/android/compose/ui/theme/ReactionOptionsTheme;Lio/getstream/chat/android/compose/ui/util/MessagePreviewIconFactory;Lio/getstream/chat/android/compose/ui/util/PollSwitchItemFactory;ZLio/getstream/chat/android/ui/common/helper/DateFormatter;Lio/getstream/chat/android/ui/common/helper/TimeProvider;Lio/getstream/chat/android/ui/common/helper/DurationFormatter;Lio/getstream/chat/android/ui/common/utils/ChannelNameFormatter;Lio/getstream/chat/android/compose/ui/util/MessagePreviewFormatter;Lio/getstream/chat/android/compose/ui/util/SearchResultNameFormatter;Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Lio/getstream/chat/android/ui/common/helper/ImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/DownloadAttachmentUriGenerator;Lio/getstream/chat/android/ui/common/helper/DownloadRequestInterceptor;Lio/getstream/chat/android/ui/common/helper/ImageAssetTransformer;Lio/getstream/chat/android/compose/ui/util/MessageAlignmentProvider;Lio/getstream/chat/android/compose/ui/theme/MessageOptionsTheme;Lio/getstream/chat/android/compose/ui/theme/ChannelOptionsTheme;Lio/getstream/chat/android/ui/common/state/messages/list/MessageOptionsUserReactionAlignment;Ljava/util/List;ZLio/getstream/chat/android/ui/common/images/resizing/StreamCdnImageResizing;ZLio/getstream/chat/android/compose/ui/theme/MessageTheme;Lio/getstream/chat/android/compose/ui/theme/MessageTheme;Lio/getstream/chat/android/compose/ui/theme/MessageDateSeparatorTheme;Lio/getstream/chat/android/compose/ui/theme/MessageUnreadSeparatorTheme;Lio/getstream/chat/android/compose/ui/theme/MessageComposerTheme;Lio/getstream/chat/android/compose/ui/theme/AttachmentPickerTheme;Lio/getstream/chat/android/compose/ui/util/MessageTextFormatter;Lio/getstream/chat/android/compose/ui/util/QuotedMessageTextFormatter;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lio/getstream/chat/android/compose/ui/theme/StreamKeyboardBehaviour;Lio/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryConfig;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;IIIIIIII)V + public static final fun ChatTheme (ZZZZZLio/getstream/chat/android/ui/common/permissions/SystemAttachmentsPickerConfig;Lio/getstream/chat/android/compose/ui/theme/StreamColors;Lio/getstream/chat/android/compose/ui/theme/StreamDimens;Lio/getstream/chat/android/compose/ui/theme/StreamTypography;Lio/getstream/chat/android/compose/ui/theme/StreamShapes;Lio/getstream/chat/android/compose/ui/theme/StreamRippleConfiguration;Lio/getstream/chat/android/ui/common/model/UserPresence;Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Ljava/util/List;Lio/getstream/chat/android/compose/ui/components/messages/factory/MessageContentFactory;Ljava/util/List;Ljava/util/List;Lio/getstream/chat/android/compose/ui/util/ReactionIconFactory;Lio/getstream/chat/android/ui/common/helper/ReactionPushEmojiFactory;Lio/getstream/chat/android/compose/ui/theme/ReactionOptionsTheme;Lio/getstream/chat/android/compose/ui/util/MessagePreviewIconFactory;Lio/getstream/chat/android/compose/ui/util/PollSwitchItemFactory;ZLio/getstream/chat/android/ui/common/helper/DateFormatter;Lio/getstream/chat/android/ui/common/helper/TimeProvider;Lio/getstream/chat/android/ui/common/helper/DurationFormatter;Lio/getstream/chat/android/ui/common/utils/ChannelNameFormatter;Lio/getstream/chat/android/compose/ui/util/MessagePreviewFormatter;Lio/getstream/chat/android/compose/ui/util/SearchResultNameFormatter;Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Lio/getstream/chat/android/ui/common/helper/ImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/DownloadAttachmentUriGenerator;Lio/getstream/chat/android/ui/common/helper/DownloadRequestInterceptor;Lio/getstream/chat/android/ui/common/helper/ImageAssetTransformer;Lio/getstream/chat/android/compose/ui/util/MessageAlignmentProvider;Lio/getstream/chat/android/compose/ui/theme/MessageOptionsTheme;Lio/getstream/chat/android/compose/ui/theme/ChannelOptionsTheme;Lio/getstream/chat/android/ui/common/state/messages/list/MessageOptionsUserReactionAlignment;Ljava/util/List;ZLio/getstream/chat/android/ui/common/images/resizing/StreamCdnImageResizing;ZLio/getstream/chat/android/compose/ui/theme/MessageTheme;Lio/getstream/chat/android/compose/ui/theme/MessageTheme;Lio/getstream/chat/android/compose/ui/theme/MessageDateSeparatorTheme;Lio/getstream/chat/android/compose/ui/theme/MessageUnreadSeparatorTheme;Lio/getstream/chat/android/compose/ui/theme/MessageComposerTheme;Lio/getstream/chat/android/compose/ui/theme/AttachmentPickerTheme;Lio/getstream/chat/android/compose/ui/util/MessageTextFormatter;Lio/getstream/chat/android/compose/ui/util/QuotedMessageTextFormatter;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lio/getstream/chat/android/compose/ui/theme/StreamKeyboardBehaviour;Lio/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryConfig;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;IIIIIIII)V public static final fun getLocalComponentFactory ()Landroidx/compose/runtime/ProvidableCompositionLocal; } @@ -4734,12 +4734,17 @@ public final class io/getstream/chat/android/compose/ui/util/StorageHelperWrappe public abstract interface class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory { public static final field Companion Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$Companion; public abstract fun imageLoader (Landroid/content/Context;)Lcoil3/ImageLoader; + public abstract fun imageLoader (Landroid/content/Context;Ljava/util/List;)Lcoil3/ImageLoader; } public final class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$Companion { public final fun defaultFactory ()Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory; } +public final class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$DefaultImpls { + public static fun imageLoader (Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Landroid/content/Context;Ljava/util/List;)Lcoil3/ImageLoader; +} + public final class io/getstream/chat/android/compose/ui/util/StreamImageLoaderProvidableCompositionLocal { public static final synthetic fun box-impl (Landroidx/compose/runtime/ProvidableCompositionLocal;)Lio/getstream/chat/android/compose/ui/util/StreamImageLoaderProvidableCompositionLocal; public static synthetic fun constructor-impl$default (Landroidx/compose/runtime/ProvidableCompositionLocal;ILkotlin/jvm/internal/DefaultConstructorMarker;)Landroidx/compose/runtime/ProvidableCompositionLocal; diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt index b01cb248a39..b73eef72968 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt @@ -30,6 +30,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.ProvidableCompositionLocal import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.remember import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter @@ -49,6 +50,7 @@ import io.getstream.chat.android.compose.ui.messages.attachments.factory.Attachm import io.getstream.chat.android.compose.ui.messages.attachments.factory.AttachmentsPickerTabFactory import io.getstream.chat.android.compose.ui.theme.messages.attachments.FileAttachmentTheme import io.getstream.chat.android.compose.ui.util.DefaultPollSwitchItemFactory +import io.getstream.chat.android.compose.ui.util.ImageHeadersInterceptor import io.getstream.chat.android.compose.ui.util.LocalStreamImageLoader import io.getstream.chat.android.compose.ui.util.MessageAlignmentProvider import io.getstream.chat.android.compose.ui.util.MessagePreviewFormatter @@ -59,6 +61,7 @@ import io.getstream.chat.android.compose.ui.util.QuotedMessageTextFormatter import io.getstream.chat.android.compose.ui.util.ReactionIconFactory import io.getstream.chat.android.compose.ui.util.SearchResultNameFormatter import io.getstream.chat.android.compose.ui.util.StreamCoilImageLoaderFactory +import io.getstream.chat.android.ui.common.helper.AsyncImageHeadersProvider import io.getstream.chat.android.ui.common.helper.DateFormatter import io.getstream.chat.android.ui.common.helper.DefaultDownloadAttachmentUriGenerator import io.getstream.chat.android.ui.common.helper.DefaultImageAssetTransformer @@ -160,6 +163,12 @@ private val LocalQuotedMessageTextFormatter = compositionLocalOf { error("No SearchResultNameFormatter provided! Make sure to wrap all usages of Stream components in a ChatTheme.") } + +@Deprecated( + message = "ImageHeadersProvider is deprecated. Use asyncImageHeadersProvider in ChatTheme instead. " + + "Headers are now injected via Coil's interceptor pipeline, which is thread-safe and supports " + + "blocking/suspending operations.", +) private val LocalStreamImageHeadersProvider = compositionLocalOf { error("No ImageHeadersProvider provided! Make sure to wrap all usages of Stream components in a ChatTheme.") } @@ -291,9 +300,17 @@ private val LocalMediaGalleryConfig = compositionLocalOf { * @param durationFormatter [DurationFormatter] Used to format durations in the app. * @param channelNameFormatter [ChannelNameFormatter] Used throughout the app for channel names. * @param messagePreviewFormatter [MessagePreviewFormatter] Used to generate a string preview for the given message. - * @param imageLoaderFactory A factory that creates new Coil [ImageLoader] instances. + * @param imageLoaderFactory A factory that creates new Coil [ImageLoader] instances. If used in combination with + * [asyncImageHeadersProvider] you must override the [StreamCoilImageLoaderFactory.imageLoader] method accepting the + * interceptors parameter. * @param imageAssetTransformer [ImageAssetTransformer] Used to transform image assets. - * @param imageHeadersProvider [ImageHeadersProvider] Used to provide headers for image requests. + * @param imageHeadersProvider [ImageHeadersProvider] Deprecated. Use [asyncImageHeadersProvider] instead. Headers + * provided here are injected synchronously on the main thread, which blocks the UI for any non-trivial work. + * @param asyncImageHeadersProvider [AsyncImageHeadersProvider] Used to provide headers for image + * requests. Invoked on IO Dispatcher inside Coil's interceptor pipeline, making it safe for blocking or suspending + * operations such as reading an auth token. Prefer this over [imageHeadersProvider]. If you are using this in + * combination with a custom [StreamCoilImageLoaderFactory] you must override the + * [StreamCoilImageLoaderFactory.imageLoader] method accepting the interceptors parameter. * @param downloadAttachmentUriGenerator [DownloadAttachmentUriGenerator] Used to generate download URIs for * attachments. * @param downloadRequestInterceptor [DownloadRequestInterceptor] Used to intercept download requests. @@ -361,6 +378,7 @@ public fun ChatTheme( searchResultNameFormatter: SearchResultNameFormatter = SearchResultNameFormatter.defaultFormatter(), imageLoaderFactory: StreamCoilImageLoaderFactory = StreamCoilImageLoaderFactory.defaultFactory(), imageHeadersProvider: ImageHeadersProvider = DefaultImageHeadersProvider, + asyncImageHeadersProvider: AsyncImageHeadersProvider? = null, downloadAttachmentUriGenerator: DownloadAttachmentUriGenerator = DefaultDownloadAttachmentUriGenerator, downloadRequestInterceptor: DownloadRequestInterceptor = DownloadRequestInterceptor { }, imageAssetTransformer: ImageAssetTransformer = DefaultImageAssetTransformer, @@ -430,6 +448,19 @@ public fun ChatTheme( ChatClient.VERSION_PREFIX_HEADER = VersionPrefixHeader.Compose } + val context = LocalContext.current + val imageLoader = remember(imageLoaderFactory, asyncImageHeadersProvider) { + if (asyncImageHeadersProvider == null) { + imageLoaderFactory.imageLoader(context.applicationContext) + } else { + imageLoaderFactory.imageLoader( + context.applicationContext, + listOf(ImageHeadersInterceptor(asyncImageHeadersProvider)), + ) + } + } + + @Suppress("DEPRECATION") CompositionLocalProvider( LocalColors provides colors, LocalDimens provides dimens, @@ -463,7 +494,7 @@ public fun ChatTheme( LocalMessageUnreadSeparatorTheme provides messageUnreadSeparatorTheme, LocalMessageComposerTheme provides messageComposerTheme, LocalAttachmentPickerTheme provides attachmentPickerTheme, - LocalStreamImageLoader provides imageLoaderFactory.imageLoader(LocalContext.current.applicationContext), + LocalStreamImageLoader provides imageLoader, LocalStreamImageHeadersProvider provides imageHeadersProvider, LocalStreamDownloadAttachmentUriGenerator provides downloadAttachmentUriGenerator, LocalStreamDownloadRequestInterceptor provides downloadRequestInterceptor, @@ -820,7 +851,15 @@ public object ChatTheme { /** * Retrieves the current [ImageHeadersProvider] at the call site's position in the hierarchy. + * + * @deprecated Use [asyncImageHeadersProvider] in [ChatTheme] for thread-safe header injection. */ + @Deprecated( + message = "ImageHeadersProvider is deprecated. Pass asyncImageHeadersProvider to ChatTheme instead. " + + "Headers are now injected via Coil's interceptor pipeline, which is thread-safe and supports " + + "blocking/suspending operations.", + ) + @Suppress("DEPRECATION") public val streamImageHeadersProvider: ImageHeadersProvider @Composable @ReadOnlyComposable diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/ImageHeadersInterceptor.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/ImageHeadersInterceptor.kt new file mode 100644 index 00000000000..9acaf6db0cc --- /dev/null +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/ImageHeadersInterceptor.kt @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.chat.android.compose.ui.util + +import coil3.intercept.Interceptor +import coil3.network.httpHeaders +import coil3.request.ImageResult +import io.getstream.chat.android.ui.common.helper.AsyncImageHeadersProvider +import io.getstream.chat.android.ui.common.images.internal.toNetworkHeaders +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +/** + * A Coil [Interceptor] that injects HTTP headers provided by [AsyncImageHeadersProvider] into + * each image request. The provider is invoked as part of Coil's background pipeline, so + * blocking or suspending operations (e.g. fetching an auth token) are safe to perform inside + * [AsyncImageHeadersProvider.getImageRequestHeaders]. + */ +internal class ImageHeadersInterceptor(private val headersProvider: AsyncImageHeadersProvider) : Interceptor { + + override suspend fun intercept(chain: Interceptor.Chain): ImageResult { + val url = chain.request.data.toString() + val headers = withContext(Dispatchers.IO) { + headersProvider.getImageRequestHeaders(url) + } + val newRequest = chain.request.newBuilder() + .httpHeaders(headers.toNetworkHeaders()) + .build() + return chain.withRequest(newRequest).proceed() + } +} diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory.kt index c6f5cf78367..30fb779a480 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory.kt @@ -19,6 +19,7 @@ package io.getstream.chat.android.compose.ui.util import android.content.Context import coil3.ImageLoader import coil3.SingletonImageLoader +import coil3.intercept.Interceptor import io.getstream.chat.android.ui.common.images.StreamImageLoaderFactory /** @@ -31,15 +32,40 @@ public fun interface StreamCoilImageLoaderFactory { */ public fun imageLoader(context: Context): ImageLoader + /** + * Returns a new Coil [ImageLoader] with the given [interceptors] prepended to the component + * registry, ahead of all decoders and Coil's built-in EngineInterceptor. + * + * The default implementation **ignores [interceptors]** and delegates to [imageLoader]. + * This means that when a custom [StreamCoilImageLoaderFactory] is used alongside + * [ChatTheme]'s `asyncImageHeadersProvider`, the async headers will **not** be injected — + * the custom factory's loader is returned as-is. + * + * Custom class implementations that want to support interceptor injection should override this + * method, for example by forwarding [interceptors] to [StreamImageLoaderFactory]: + * ```kotlin + * override fun imageLoader(context: Context, interceptors: List): ImageLoader = + * StreamImageLoaderFactory(interceptors = interceptors, builder = myCustomBuilder) + * .newImageLoader(context) + * ``` + * + * Integrators using a custom [StreamCoilImageLoaderFactory] who also need auth headers on + * image requests should either override this method or inject the headers directly inside + * their factory's [imageLoader] implementation (e.g. via a custom OkHttp client). + * + * @param context The [Context] to build the [ImageLoader] with. + * @param interceptors Coil [Interceptor]s to prepend to the component registry. + */ + public fun imageLoader(context: Context, interceptors: List): ImageLoader = + imageLoader(context) + public companion object { /** * Returns the default singleton instance of [StreamCoilImageLoaderFactory]. * * @return The default implementation of [StreamCoilImageLoaderFactory]. */ - public fun defaultFactory(): StreamCoilImageLoaderFactory { - return DefaultStreamCoilImageLoaderFactory - } + public fun defaultFactory(): StreamCoilImageLoaderFactory = DefaultStreamCoilImageLoaderFactory } } @@ -68,6 +94,13 @@ internal object DefaultStreamCoilImageLoaderFactory : StreamCoilImageLoaderFacto */ override fun imageLoader(context: Context): ImageLoader = imageLoader ?: newImageLoader(context) + override fun imageLoader(context: Context, interceptors: List): ImageLoader = + if (interceptors.isEmpty()) { + imageLoader(context) + } else { + StreamImageLoaderFactory(interceptors = interceptors).newImageLoader(context) + } + /** * Builds a new [ImageLoader] using the given Android [Context]. If the loader already exists, we return it. * diff --git a/stream-chat-android-ui-common/api/stream-chat-android-ui-common.api b/stream-chat-android-ui-common/api/stream-chat-android-ui-common.api index b7b0be2abbe..52ef740895d 100644 --- a/stream-chat-android-ui-common/api/stream-chat-android-ui-common.api +++ b/stream-chat-android-ui-common/api/stream-chat-android-ui-common.api @@ -1065,6 +1065,10 @@ public final class io/getstream/chat/android/ui/common/feature/messages/translat public final class io/getstream/chat/android/ui/common/feature/threads/ThreadListController$Companion { } +public abstract interface class io/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider { + public abstract fun getImageRequestHeaders (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + public abstract interface class io/getstream/chat/android/ui/common/helper/ClipboardHandler { public abstract fun copyMessage (Lio/getstream/chat/android/models/Message;)V } @@ -1194,6 +1198,8 @@ public final class io/getstream/chat/android/ui/common/helper/internal/StorageHe public final class io/getstream/chat/android/ui/common/images/StreamImageLoaderFactory : coil3/SingletonImageLoader$Factory { public static final field $stable I public fun ()V + public fun (Ljava/util/List;Lkotlin/jvm/functions/Function1;)V + public synthetic fun (Ljava/util/List;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lkotlin/jvm/functions/Function1;)V public synthetic fun (Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun newImageLoader (Landroid/content/Context;)Lcoil3/ImageLoader; diff --git a/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider.kt b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider.kt new file mode 100644 index 00000000000..8b1c07e3fa5 --- /dev/null +++ b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider.kt @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-chat-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.chat.android.ui.common.helper + +/** + * Provides HTTP headers for image loading requests in a suspending, thread-safe manner. + * + * Unlike [ImageHeadersProvider], this interface is designed for async operations such as + * reading an auth token from encrypted storage or fetching one from a remote endpoint. + * Implementations are always invoked on [kotlinx.coroutines.Dispatchers.IO], so blocking + * calls are safe. + * + * Prefer this over [ImageHeadersProvider] when integrating with [ChatTheme]. + * + * @see ImageHeadersProvider + */ +public interface AsyncImageHeadersProvider { + + /** + * Returns a map of headers to be used for the image loading request. + * + * Always called on [kotlinx.coroutines.Dispatchers.IO], so blocking operations are safe. + * + * @param url The URL of the image to load. + * @return A map of headers to be used for the image loading request. + */ + public suspend fun getImageRequestHeaders(url: String): Map +} diff --git a/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/images/StreamImageLoaderFactory.kt b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/images/StreamImageLoaderFactory.kt index d3510042ce7..77012a3472c 100644 --- a/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/images/StreamImageLoaderFactory.kt +++ b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/images/StreamImageLoaderFactory.kt @@ -23,15 +23,13 @@ import coil3.SingletonImageLoader import coil3.disk.DiskCache import coil3.gif.AnimatedImageDecoder import coil3.gif.GifDecoder +import coil3.intercept.Interceptor import coil3.memory.MemoryCache -import coil3.network.okhttp.OkHttpNetworkFetcherFactory import coil3.request.allowHardware import coil3.request.crossfade import coil3.video.VideoFrameDecoder import io.getstream.chat.android.client.internal.file.StreamFileManager -import okhttp3.Dispatcher -import okhttp3.Interceptor -import okhttp3.OkHttpClient +import kotlinx.coroutines.Dispatchers import okio.Path.Companion.toOkioPath private const val DEFAULT_MEMORY_PERCENTAGE = 0.25 @@ -52,6 +50,24 @@ public class StreamImageLoaderFactory( private val builder: ImageLoader.Builder.() -> Unit = {}, ) : SingletonImageLoader.Factory { + /** + * Creates a [StreamImageLoaderFactory] with additional [Interceptor]s prepended to the + * component registry, before any decoders and before Coil's built-in [EngineInterceptor]. + * + * This constructor preserves the existing primary constructor signature and is purely additive. + * + * @param interceptors Coil [Interceptor]s to register ahead of all other components. + * @param builder Optional lambda to further customize the [ImageLoader] configuration. + */ + public constructor( + interceptors: List, + builder: ImageLoader.Builder.() -> Unit = {}, + ) : this(builder) { + this.interceptors = interceptors + } + + private var interceptors: List = emptyList() + private val fileManager = StreamFileManager() override fun newImageLoader(context: PlatformContext): ImageLoader { @@ -59,34 +75,15 @@ public class StreamImageLoaderFactory( .memoryCache { MemoryCache.Builder().maxSizePercent(context, DEFAULT_MEMORY_PERCENTAGE).build() } .allowHardware(false) .crossfade(true) - .components { - add( - OkHttpNetworkFetcherFactory( - callFactory = { - val cacheControlInterceptor = Interceptor { chain -> - chain.proceed(chain.request()) - .newBuilder() - .header("Cache-Control", "max-age=3600,public") - .build() - } - // Don't limit concurrent network requests by host. - val dispatcher = Dispatcher().apply { maxRequestsPerHost = maxRequests } - - OkHttpClient.Builder() - .dispatcher(dispatcher) - .addNetworkInterceptor(cacheControlInterceptor) - .build() - }, - ), - ) - } .diskCache { DiskCache.Builder() .directory(fileManager.getImageCache(context).toOkioPath()) .maxSizePercent(DEFAULT_DISK_CACHE_PERCENTAGE) .build() } + .interceptorCoroutineContext(Dispatchers.IO) .components { + interceptors.forEach { add(it) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { add(AnimatedImageDecoder.Factory(enforceMinimumFrameDelay = true)) } else { From 210b48708da0a5fb733f01f344df7d3a9f07cf2b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 12:45:37 +0000 Subject: [PATCH 24/33] [skip ci] Update SDK sizes --- metrics/size.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/size.json b/metrics/size.json index e65756105a9..6bb6b892878 100644 --- a/metrics/size.json +++ b/metrics/size.json @@ -3,7 +3,7 @@ "stream-chat-android-client": 6944, "stream-chat-android-offline": 7284, "stream-chat-android-ui-components": 13400, - "stream-chat-android-compose": 16648 + "stream-chat-android-compose": 16652 }, "release": { "stream-chat-android-client": 5384, From 3b5cd86b5c6f5f2a433ac4af22d0edbcad945c50 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:24:30 +0000 Subject: [PATCH 25/33] AUTOMATION: Version Bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 153ff90b0a9..24de38d6d5e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ android.enableR8.fullMode=true android.suppressUnsupportedCompileSdk=34 # Project version -version=6.33.0 +version=6.34.0 From 56a1073992b1af6c53800e16f20b6e60192b4df5 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Mon, 9 Mar 2026 10:56:19 +0100 Subject: [PATCH 26/33] Disable swipe-to-reply for deleted messages (#6226) * Disable swipe-to-reply for deleted messages Co-Authored-By: Claude * PR remarks. --------- Co-authored-by: Claude --- .../compose/ui/messages/list/MessageItem.kt | 19 +++++++-------- .../MessageOptionItemVisibilityTest.kt | 18 +++++++++++--- .../ui/common/utils/CapabilitiesHelper.kt | 6 ++++- .../ui/common/utils/CapabilitiesHelperTest.kt | 16 +++++++++++-- .../MessageListViewExtensionsKtTest.kt | 24 +++++++++++++++---- 5 files changed, 63 insertions(+), 20 deletions(-) diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt index 6f64febfadb..672d00f13e6 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageItem.kt @@ -267,18 +267,17 @@ public fun MessageItem( val messageAlignment = ChatTheme.messageAlignmentProvider.provideMessageAlignment(messageItem) val description = stringResource(id = R.string.stream_compose_cd_message_item) - val isSwipable = ChatTheme.messageOptionsTheme.optionVisibility - .canReplyToMessage( - message = message, - ownCapabilities = messageItem.ownCapabilities, - ) + val optionVisibility = ChatTheme.messageOptionsTheme.optionVisibility + val isSwipeable = remember(message, messageItem.ownCapabilities, optionVisibility) { + optionVisibility.canReplyToMessage(message, messageItem.ownCapabilities) + } // Remember the message to ensure updated values are captured in the onReply lambda val replyMessage by rememberUpdatedState(message) SwipeToReply( modifier = modifier, onReply = { onReply(replyMessage) }, - isSwipeable = { isSwipable }, + isSwipeable = isSwipeable, swipeToReplyContent = swipeToReplyContent, ) { Box( @@ -735,7 +734,7 @@ private fun getMessageBubbleShape(position: List, ownsMessage: * * @param modifier Modifier for styling. * @param onReply Handler when the user swipes to reply. - * @param isSwipeable Handler to determine if the message is swipeable. + * @param isSwipeable Indicator if swipe-to-reply is enabled. * @param swipeToReplyContent The content to show when swiping to reply. * @param content The swipeable content to show when not swiping to reply. */ @@ -744,7 +743,7 @@ private fun getMessageBubbleShape(position: List, ownsMessage: private fun SwipeToReply( modifier: Modifier = Modifier, onReply: () -> Unit = {}, - isSwipeable: () -> Boolean = { true }, + isSwipeable: Boolean = true, swipeToReplyContent: @Composable RowScope.() -> Unit, content: @Composable () -> Unit, ) { @@ -779,8 +778,8 @@ private fun SwipeToReply( .fillMaxWidth() .onSizeChanged { rowWidth = it.width.toFloat() } .offset { IntOffset(x = offset.value.roundToInt(), y = 0) } - .pointerInput(swipeToReplyWidth) { - if (isSwipeable()) { + .pointerInput(swipeToReplyWidth, isSwipeable) { + if (isSwipeable) { detectHorizontalDragGestures( onHorizontalDrag = { change, dragAmount -> // Only consume if horizontal drag dominates vertical diff --git a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/util/extensions/MessageOptionItemVisibilityTest.kt b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/util/extensions/MessageOptionItemVisibilityTest.kt index efb7696a179..33db376c5e6 100644 --- a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/util/extensions/MessageOptionItemVisibilityTest.kt +++ b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/util/extensions/MessageOptionItemVisibilityTest.kt @@ -32,6 +32,7 @@ import org.amshove.kluent.`should be` import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource +import java.util.Date internal class MessageOptionItemVisibilityTest { @@ -157,27 +158,38 @@ internal class MessageOptionItemVisibilityTest { @JvmStatic fun canReplyToMessageArguments() = listOf( + // case: reply disabled Arguments.of( MessageOptionItemVisibility(isReplyVisible = false), - randomMessage(), + randomMessage(deletedAt = null, deletedForMe = false), randomChannelCapabilities(), false, ), + // case: message not synced Arguments.of( MessageOptionItemVisibility(), randomMessage(syncStatus = randomSyncStatus(exclude = listOf(SyncStatus.COMPLETED))), randomChannelCapabilities(), false, ), + // case: no QUOTE_MESSAGE capability Arguments.of( MessageOptionItemVisibility(), - randomMessage(), + randomMessage(deletedAt = null, deletedForMe = false), randomChannelCapabilities(exclude = setOf(ChannelCapabilities.QUOTE_MESSAGE)), false, ), + // case: message is deleted Arguments.of( MessageOptionItemVisibility(isReplyVisible = true), - randomMessage(syncStatus = SyncStatus.COMPLETED), + randomMessage(syncStatus = SyncStatus.COMPLETED, deletedAt = Date(), deletedForMe = false), + randomChannelCapabilities(include = setOf(ChannelCapabilities.QUOTE_MESSAGE)), + false, + ), + // case: all conditions met + Arguments.of( + MessageOptionItemVisibility(isReplyVisible = true), + randomMessage(syncStatus = SyncStatus.COMPLETED, deletedAt = null, deletedForMe = false), randomChannelCapabilities(include = setOf(ChannelCapabilities.QUOTE_MESSAGE)), true, ), diff --git a/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelper.kt b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelper.kt index d0d7d2cba90..0851b0f6b40 100644 --- a/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelper.kt +++ b/stream-chat-android-ui-common/src/main/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelper.kt @@ -20,6 +20,7 @@ package io.getstream.chat.android.ui.common.utils import io.getstream.chat.android.client.utils.attachment.isGiphy import io.getstream.chat.android.client.utils.message.hasSharedLocation +import io.getstream.chat.android.client.utils.message.isDeleted import io.getstream.chat.android.client.utils.message.isThreadReply import io.getstream.chat.android.models.AttachmentType import io.getstream.chat.android.models.ChannelCapabilities @@ -59,7 +60,10 @@ public fun canReplyToMessage( replyEnabled: Boolean, message: Message, ownCapabilities: Set, -): Boolean = replyEnabled && message.isSynced() && ownCapabilities.contains(ChannelCapabilities.QUOTE_MESSAGE) +): Boolean = replyEnabled && + message.isSynced() && + !message.isDeleted() && + ownCapabilities.contains(ChannelCapabilities.QUOTE_MESSAGE) /** * Determines whether a thread reply can be made to the given message. diff --git a/stream-chat-android-ui-common/src/test/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelperTest.kt b/stream-chat-android-ui-common/src/test/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelperTest.kt index 736843285d8..d72b6e7de7c 100644 --- a/stream-chat-android-ui-common/src/test/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelperTest.kt +++ b/stream-chat-android-ui-common/src/test/kotlin/io/getstream/chat/android/ui/common/utils/CapabilitiesHelperTest.kt @@ -31,6 +31,7 @@ import org.amshove.kluent.`should be` import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource +import java.util.Date internal class CapabilitiesHelperTest { @@ -152,27 +153,38 @@ internal class CapabilitiesHelperTest { @JvmStatic fun canReplyToMessageArguments() = listOf( + // case: reply disabled Arguments.of( false, randomMessage(), randomChannelCapabilities(), false, ), + // case: message not synced Arguments.of( randomBoolean(), randomMessage(syncStatus = randomSyncStatus(exclude = listOf(SyncStatus.COMPLETED))), randomChannelCapabilities(), false, ), + // case: no QUOTE_MESSAGE capability Arguments.of( randomBoolean(), - randomMessage(), + randomMessage(deletedAt = null, deletedForMe = false), randomChannelCapabilities(exclude = setOf(ChannelCapabilities.QUOTE_MESSAGE)), false, ), + // case: message is deleted Arguments.of( true, - randomMessage(syncStatus = SyncStatus.COMPLETED), + randomMessage(syncStatus = SyncStatus.COMPLETED, deletedAt = Date(), deletedForMe = false), + randomChannelCapabilities(include = setOf(ChannelCapabilities.QUOTE_MESSAGE)), + false, + ), + // case: all conditions met + Arguments.of( + true, + randomMessage(syncStatus = SyncStatus.COMPLETED, deletedAt = null, deletedForMe = false), randomChannelCapabilities(include = setOf(ChannelCapabilities.QUOTE_MESSAGE)), true, ), diff --git a/stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/feature/messages/list/internal/MessageListViewExtensionsKtTest.kt b/stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/feature/messages/list/internal/MessageListViewExtensionsKtTest.kt index a18a9b8ad72..e3518973c30 100644 --- a/stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/feature/messages/list/internal/MessageListViewExtensionsKtTest.kt +++ b/stream-chat-android-ui-components/src/test/kotlin/io/getstream/chat/android/ui/feature/messages/list/internal/MessageListViewExtensionsKtTest.kt @@ -33,6 +33,7 @@ import org.amshove.kluent.`should be` import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource +import java.util.Date internal class MessageListViewExtensionsKtTest { @@ -154,27 +155,42 @@ internal class MessageListViewExtensionsKtTest { @JvmStatic fun canReplyToMessageArguments() = listOf( + // case: reply disabled Arguments.of( randomMessageListViewStyle(replyEnabled = false), - randomMessage(), + randomMessage(deletedAt = null, deletedForMe = false), randomChannelCapabilities(), false, ), + // case: message not synced Arguments.of( randomMessageListViewStyle(), - randomMessage(syncStatus = randomSyncStatus(exclude = listOf(SyncStatus.COMPLETED))), + randomMessage( + syncStatus = randomSyncStatus(exclude = listOf(SyncStatus.COMPLETED)), + deletedAt = null, + deletedForMe = false, + ), randomChannelCapabilities(), false, ), + // case: no QUOTE_MESSAGE capability Arguments.of( randomMessageListViewStyle(), - randomMessage(), + randomMessage(deletedAt = null, deletedForMe = false), randomChannelCapabilities(exclude = setOf(ChannelCapabilities.QUOTE_MESSAGE)), false, ), + // case: message is deleted Arguments.of( randomMessageListViewStyle(replyEnabled = true), - randomMessage(syncStatus = SyncStatus.COMPLETED), + randomMessage(syncStatus = SyncStatus.COMPLETED, deletedAt = Date(), deletedForMe = false), + randomChannelCapabilities(include = setOf(ChannelCapabilities.QUOTE_MESSAGE)), + false, + ), + // case: all conditions met + Arguments.of( + randomMessageListViewStyle(replyEnabled = true), + randomMessage(syncStatus = SyncStatus.COMPLETED, deletedAt = null, deletedForMe = false), randomChannelCapabilities(include = setOf(ChannelCapabilities.QUOTE_MESSAGE)), true, ), From 167b04dd73461e627b2cc1b091389358c584d0c8 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Tue, 10 Mar 2026 12:20:49 +0100 Subject: [PATCH 27/33] Ensure SyncManager respects messageLimit and memberLimit when restoring channel queries (#6231) Co-authored-by: Claude --- .../internal/QueryChannelsLogic.kt | 9 +-- .../internal/QueryChannelsLogicTest.kt | 58 +++++++++++++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt index 55837a05359..e4923cea0e7 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogic.kt @@ -32,8 +32,6 @@ import io.getstream.log.taggedLogger import io.getstream.result.Result import kotlinx.coroutines.flow.StateFlow -private const val MESSAGE_LIMIT = 1 -private const val MEMBER_LIMIT = 30 private const val INITIAL_CHANNEL_OFFSET = 0 private const val CHANNEL_LIMIT = 30 @@ -154,13 +152,16 @@ internal class QueryChannelsLogic( */ internal suspend fun queryFirstPage(): Result> { logger.d { "[queryFirstPage] no args" } + val currentRequest = queryChannelsStateLogic.getState().currentRequest.value + val messageLimit = currentRequest?.messageLimit + val memberLimit = currentRequest?.memberLimit val request = QueryChannelsRequest( filter = filter, offset = INITIAL_CHANNEL_OFFSET, limit = CHANNEL_LIMIT, querySort = sort, - messageLimit = MESSAGE_LIMIT, - memberLimit = MEMBER_LIMIT, + messageLimit = messageLimit, + memberLimit = memberLimit, ) queryChannelsStateLogic.setCurrentRequest(request) diff --git a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt index b942afa0f5e..7e2f38c0f1f 100644 --- a/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt +++ b/stream-chat-android-state/src/test/java/io/getstream/chat/android/state/plugin/logic/querychannels/internal/QueryChannelsLogicTest.kt @@ -17,6 +17,7 @@ package io.getstream.chat.android.state.plugin.logic.querychannels.internal import io.getstream.chat.android.client.ChatClient +import io.getstream.chat.android.client.api.models.QueryChannelsRequest import io.getstream.chat.android.client.query.QueryChannelsSpec import io.getstream.chat.android.client.query.pagination.AnyChannelPaginationRequest import io.getstream.chat.android.models.Channel @@ -26,6 +27,7 @@ import io.getstream.chat.android.models.querysort.QuerySortByField import io.getstream.chat.android.randomChannel import io.getstream.chat.android.state.plugin.state.querychannels.QueryChannelsState import io.getstream.chat.android.test.TestCoroutineRule +import io.getstream.chat.android.test.asCall import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -65,6 +67,7 @@ internal class QueryChannelsLogicTest { whenever(queryChannelsStateLogic.getState()) doReturn queryChannelsState whenever(queryChannelsState.recoveryNeeded) doReturn MutableStateFlow(false) + whenever(queryChannelsState.currentRequest) doReturn MutableStateFlow(null) whenever(queryChannelsStateLogic.getQuerySpecs()) doReturn queryChannelsSpec logic = QueryChannelsLogic( @@ -225,4 +228,59 @@ internal class QueryChannelsLogicTest { verify(queryChannelsStateLogic).addChannelsState(cachedChannels) verify(queryChannelsDatabaseLogic).insertQueryChannels(queryChannelsSpec) } + + // region queryFirstPage + + @Test + fun `queryFirstPage uses null messageLimit and memberLimit when no prior request exists`() = runTest { + // Given - currentRequest is null (default from setUp) + whenever(client.queryChannelsInternal(any())) + .thenReturn(emptyList().asCall()) + + // When + logic.queryFirstPage() + + // Then + val expectedRequest = QueryChannelsRequest( + filter = filter, + offset = 0, + limit = 30, + querySort = sort, + messageLimit = null, + memberLimit = null, + ) + verify(client).queryChannelsInternal(expectedRequest) + } + + @Test + fun `queryFirstPage uses messageLimit and memberLimit from prior request`() = runTest { + // Given + val priorRequest = QueryChannelsRequest( + filter = filter, + offset = 0, + limit = 30, + querySort = sort, + messageLimit = 5, + memberLimit = 50, + ) + whenever(queryChannelsState.currentRequest) doReturn MutableStateFlow(priorRequest) + whenever(client.queryChannelsInternal(any())) + .thenReturn(emptyList().asCall()) + + // When + logic.queryFirstPage() + + // Then + val expectedRequest = QueryChannelsRequest( + filter = filter, + offset = 0, + limit = 30, + querySort = sort, + messageLimit = 5, + memberLimit = 50, + ) + verify(client).queryChannelsInternal(expectedRequest) + } + + // endregion } From 73f14e6a9ade4529730771bc385f489471ab5f85 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Tue, 10 Mar 2026 17:01:03 +0100 Subject: [PATCH 28/33] Expose ChannelsScreen isBackPressEnabled config flag. (#6228) --- .../api/stream-chat-android-compose.api | 2 +- .../chat/android/compose/ui/channels/ChannelsScreen.kt | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 44e7788d5fb..ab16848ae3b 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -1192,7 +1192,7 @@ public final class io/getstream/chat/android/compose/ui/channel/info/GroupChanne } public final class io/getstream/chat/android/compose/ui/channels/ChannelsScreenKt { - public static final fun ChannelsScreen (Lio/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/compose/ui/channels/SearchMode;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;III)V + public static final fun ChannelsScreen (Lio/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/compose/ui/channels/SearchMode;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;ZLandroidx/compose/runtime/Composer;III)V } public final class io/getstream/chat/android/compose/ui/channels/SearchMode : java/lang/Enum { diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/ChannelsScreen.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/ChannelsScreen.kt index f03c91128a6..dcfbf128d06 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/ChannelsScreen.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/ChannelsScreen.kt @@ -79,6 +79,8 @@ import io.getstream.chat.android.ui.common.state.channels.actions.ViewInfo * @param onChannelClick Handler for Channel item clicks. * @param onViewChannelInfoAction Handler for when the user selects the [ViewInfo] option for a [Channel]. * @param onBackPressed Handler for back press action. + * @param isBackPressEnabled Indicator if the default back handler is enabled. Set to `false` to fully disable the back + * handling and catch the back-press event in a [BackHandler] higher in the compose hierarchy. Default: `true`. */ @Composable @Suppress("LongMethod") @@ -94,6 +96,7 @@ public fun ChannelsScreen( onSearchMessageItemClick: (Message) -> Unit = {}, onViewChannelInfoAction: (Channel) -> Unit = {}, onBackPressed: () -> Unit = {}, + isBackPressEnabled: Boolean = true, ) { val listViewModel: ChannelListViewModel = viewModel( ChannelListViewModel::class.java, @@ -105,7 +108,7 @@ public fun ChannelsScreen( val user by listViewModel.user.collectAsState() val connectionState by listViewModel.connectionState.collectAsState() - BackHandler(enabled = true) { + BackHandler(enabled = isBackPressEnabled) { if (selectedChannel != null) { listViewModel.selectChannel(null) } else { From 02e4407ebd5cfddb69cf0a6e66f10464bef91092 Mon Sep 17 00:00:00 2001 From: Petar Velikov Date: Wed, 11 Mar 2026 14:41:02 +0100 Subject: [PATCH 29/33] Fix sending wrong type for incomplete command messages (#6236) * Fix wrong message type for commands in getMessageType() Co-Authored-By: Claude * Fix KDoc --------- Co-authored-by: Claude --- .../android/client/utils/internal/MessageUtils.kt | 11 ++++------- .../android/client/utils/internal/MessageUtilsTest.kt | 7 ------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/internal/MessageUtils.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/internal/MessageUtils.kt index f0791349f23..2e9b6baf803 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/internal/MessageUtils.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/internal/MessageUtils.kt @@ -20,17 +20,14 @@ import io.getstream.chat.android.client.extensions.internal.hasPendingAttachment import io.getstream.chat.android.core.internal.InternalStreamChatApi import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.MessageType -import java.util.regex.Pattern - -private val COMMAND_PATTERN = Pattern.compile("^/[a-z]*$") /** * Updates the type of the [Message] based on its content. * - * If the message contains a command or has attachments to upload, the type will be [MessageType.EPHEMERAL]. + * If the message has attachments to upload, the type will be [MessageType.EPHEMERAL] (local-only - after the + * attachments are uploaded, the type is changed to [MessageType.REGULAR]). * If the message is a system message, the type will be [MessageType.SYSTEM]. - * Otherwise, the type will be [MessageType.REGULAR], as we cannot send messages which are not regular, ephemeral, or - * system. + * Otherwise, the type will be [MessageType.REGULAR], as we cannot send messages which are not regular or system. * * @param message The message to update. */ @@ -39,7 +36,7 @@ public fun getMessageType(message: Message): String { val hasAttachments = message.attachments.isNotEmpty() val hasAttachmentsToUpload = message.hasPendingAttachments() - return if (COMMAND_PATTERN.matcher(message.text).find() || (hasAttachments && hasAttachmentsToUpload)) { + return if (hasAttachments && hasAttachmentsToUpload) { MessageType.EPHEMERAL } else if (message.type == MessageType.SYSTEM) { MessageType.SYSTEM diff --git a/stream-chat-android-state/src/test/java/io/getstream/chat/android/client/utils/internal/MessageUtilsTest.kt b/stream-chat-android-state/src/test/java/io/getstream/chat/android/client/utils/internal/MessageUtilsTest.kt index 596fdd3647c..6eda992e991 100644 --- a/stream-chat-android-state/src/test/java/io/getstream/chat/android/client/utils/internal/MessageUtilsTest.kt +++ b/stream-chat-android-state/src/test/java/io/getstream/chat/android/client/utils/internal/MessageUtilsTest.kt @@ -24,13 +24,6 @@ import org.junit.jupiter.api.Test internal class MessageUtilsTest { - @Test - fun testCommandMessage() { - val message = Message(text = "/command") - val updatedMessageType = getMessageType(message) - updatedMessageType `should be equal to` MessageType.EPHEMERAL - } - @Test fun testMessageWithAttachmentsInUploadStateIdle() { val message = Message( From b7c7cc93e96afde21869d6482afd3f1166702700 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 13:50:16 +0000 Subject: [PATCH 30/33] [skip ci] Update SDK sizes --- metrics/size.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metrics/size.json b/metrics/size.json index 6bb6b892878..0afc3fb2fbe 100644 --- a/metrics/size.json +++ b/metrics/size.json @@ -2,7 +2,7 @@ "debug": { "stream-chat-android-client": 6944, "stream-chat-android-offline": 7284, - "stream-chat-android-ui-components": 13400, + "stream-chat-android-ui-components": 13396, "stream-chat-android-compose": 16652 }, "release": { From d7ce8ede69b0098a06fca17cacecaa9dc0bafdbd Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:48:47 +0000 Subject: [PATCH 31/33] AUTOMATION: Version Bump --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 24de38d6d5e..0ff5ea597d8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ android.enableR8.fullMode=true android.suppressUnsupportedCompileSdk=34 # Project version -version=6.34.0 +version=6.35.0 From 946eabeb8ac44d52d6197f30b0d1da5d238c1b09 Mon Sep 17 00:00:00 2001 From: VelikovPetar Date: Tue, 17 Mar 2026 13:42:07 +0100 Subject: [PATCH 32/33] Post merge clean-up. --- .../internal/DeleteMessageListenerState.kt | 2 -- .../client/utils/message/MessageUtils.kt | 1 - .../client/utils/message/MessageUtilsTest.kt | 3 +-- .../api/stream-chat-android-compose.api | 20 ++++++++++++------ .../ui/messages/list/MessageContainer.kt | 19 ++++++++--------- .../android/compose/ui/theme/ChatTheme.kt | 8 +------ .../messages/MessagesViewModelFactory.kt | 20 ------------------ .../channels/ChannelListViewModelTest.kt | 6 ------ ...ges_SelectedMessageMenuTest_my_message.png | Bin 47562 -> 47355 bytes ...essageMenuTest_my_message_in_dark_mode.png | Bin 42677 -> 42383 bytes ..._SelectedMessageMenuTest_their_message.png | Bin 56784 -> 56566 bytes ...ageMenuTest_their_message_in_dark_mode.png | Bin 49865 -> 49670 bytes .../ui/viewmodel/search/SearchViewModel.kt | 2 -- 13 files changed, 24 insertions(+), 57 deletions(-) diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/state/plugin/listener/internal/DeleteMessageListenerState.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/state/plugin/listener/internal/DeleteMessageListenerState.kt index 9df17cc791c..5fbb80fee0f 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/state/plugin/listener/internal/DeleteMessageListenerState.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/internal/state/plugin/listener/internal/DeleteMessageListenerState.kt @@ -17,7 +17,6 @@ package io.getstream.chat.android.client.internal.state.plugin.listener.internal import io.getstream.chat.android.client.api.state.GlobalState -import io.getstream.chat.android.client.errors.cause.MessageModerationDeletedException import io.getstream.chat.android.client.internal.state.plugin.logic.channel.internal.ChannelLogic import io.getstream.chat.android.client.internal.state.plugin.logic.internal.LogicRegistry import io.getstream.chat.android.client.plugin.listeners.DeleteMessageListener @@ -25,7 +24,6 @@ import io.getstream.chat.android.client.setup.state.ClientState import io.getstream.chat.android.client.utils.message.shouldDeleteRemote import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.SyncStatus -import io.getstream.result.Error import io.getstream.result.Result import java.util.Date diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt index 26df3d908b9..c42d10af9e7 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/utils/message/MessageUtils.kt @@ -30,7 +30,6 @@ import io.getstream.chat.android.models.MessageModerationAction import io.getstream.chat.android.models.MessageType import io.getstream.chat.android.models.ModerationAction import io.getstream.chat.android.models.SyncStatus -import io.getstream.chat.android.models.User import io.getstream.result.Error import io.getstream.result.Result import java.util.UUID diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt index 44c43c9bfde..6e6c9987403 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/utils/message/MessageUtilsTest.kt @@ -37,8 +37,8 @@ import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.currentTime import kotlinx.coroutines.test.runTest import org.amshove.kluent.shouldBeEqualTo -import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import java.util.Date @@ -665,7 +665,6 @@ internal class MessageUtilsTest { assertTrue(result is Result.Success) } - private companion object { // Regex matching lowercase UUID format diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 7b3e04cb2c3..495ea1bdef9 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -942,7 +942,7 @@ public final class io/getstream/chat/android/compose/ui/channel/info/GroupChanne } public final class io/getstream/chat/android/compose/ui/channels/ChannelsScreenKt { - public static final fun ChannelsScreen (Lio/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/compose/ui/channels/SearchMode;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;III)V + public static final fun ChannelsScreen (Lio/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/compose/ui/channels/SearchMode;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;ZLandroidx/compose/runtime/Composer;III)V } public final class io/getstream/chat/android/compose/ui/channels/SearchMode : java/lang/Enum { @@ -2437,7 +2437,7 @@ public final class io/getstream/chat/android/compose/ui/messages/list/MessageLis } public final class io/getstream/chat/android/compose/ui/messages/list/MessagesKt { - public static final fun Messages (Lio/getstream/chat/android/ui/common/state/messages/list/MessageListState;Lio/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Vertical;Lio/getstream/chat/android/compose/ui/messages/list/ThreadMessagesStart;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;III)V + public static final fun Messages (Lio/getstream/chat/android/ui/common/state/messages/list/MessageListState;Lio/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Vertical;Lio/getstream/chat/android/compose/ui/messages/list/ThreadMessagesStart;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;III)V } public final class io/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState { @@ -3034,7 +3034,7 @@ public final class io/getstream/chat/android/compose/ui/theme/ChatTheme { } public final class io/getstream/chat/android/compose/ui/theme/ChatThemeKt { - public static final fun ChatTheme (ZLio/getstream/chat/android/compose/ui/theme/ChatConfig;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Typography;Lio/getstream/chat/android/compose/ui/theme/StreamRippleConfiguration;Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Ljava/util/List;Lio/getstream/chat/android/compose/ui/util/ReactionResolver;Lio/getstream/chat/android/compose/ui/theme/ReactionOptionsTheme;Lio/getstream/chat/android/compose/ui/util/MessagePreviewIconFactory;ZLio/getstream/chat/android/ui/common/helper/DateFormatter;Lio/getstream/chat/android/ui/common/helper/TimeProvider;Lio/getstream/chat/android/ui/common/helper/DurationFormatter;Lio/getstream/chat/android/ui/common/utils/ChannelNameFormatter;Lio/getstream/chat/android/compose/ui/util/MessagePreviewFormatter;Lio/getstream/chat/android/compose/ui/util/SearchResultNameFormatter;Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Lio/getstream/chat/android/ui/common/helper/ImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/DownloadAttachmentUriGenerator;Lio/getstream/chat/android/ui/common/helper/DownloadRequestInterceptor;Lio/getstream/chat/android/ui/common/helper/ImageAssetTransformer;Lio/getstream/chat/android/compose/ui/util/MessageAlignmentProvider;Lio/getstream/chat/android/compose/ui/theme/MessageOptionsTheme;Lio/getstream/chat/android/compose/ui/theme/ChannelOptionsTheme;Lio/getstream/chat/android/ui/common/images/resizing/StreamCdnImageResizing;Lio/getstream/chat/android/compose/ui/theme/MessageComposerTheme;Lio/getstream/chat/android/compose/ui/util/MessageTextFormatter;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;IIII)V + public static final fun ChatTheme (ZLio/getstream/chat/android/compose/ui/theme/ChatConfig;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Typography;Lio/getstream/chat/android/compose/ui/theme/StreamRippleConfiguration;Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Ljava/util/List;Lio/getstream/chat/android/compose/ui/util/ReactionResolver;Lio/getstream/chat/android/compose/ui/theme/ReactionOptionsTheme;Lio/getstream/chat/android/compose/ui/util/MessagePreviewIconFactory;ZLio/getstream/chat/android/ui/common/helper/DateFormatter;Lio/getstream/chat/android/ui/common/helper/TimeProvider;Lio/getstream/chat/android/ui/common/helper/DurationFormatter;Lio/getstream/chat/android/ui/common/utils/ChannelNameFormatter;Lio/getstream/chat/android/compose/ui/util/MessagePreviewFormatter;Lio/getstream/chat/android/compose/ui/util/SearchResultNameFormatter;Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Lio/getstream/chat/android/ui/common/helper/ImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/DownloadAttachmentUriGenerator;Lio/getstream/chat/android/ui/common/helper/DownloadRequestInterceptor;Lio/getstream/chat/android/ui/common/helper/ImageAssetTransformer;Lio/getstream/chat/android/compose/ui/util/MessageAlignmentProvider;Lio/getstream/chat/android/compose/ui/theme/MessageOptionsTheme;Lio/getstream/chat/android/compose/ui/theme/ChannelOptionsTheme;Lio/getstream/chat/android/ui/common/images/resizing/StreamCdnImageResizing;Lio/getstream/chat/android/compose/ui/theme/MessageComposerTheme;Lio/getstream/chat/android/compose/ui/util/MessageTextFormatter;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;IIIII)V public static final fun getLocalChatConfig ()Landroidx/compose/runtime/ProvidableCompositionLocal; public static final fun getLocalComponentFactory ()Landroidx/compose/runtime/ProvidableCompositionLocal; } @@ -3958,12 +3958,17 @@ public final class io/getstream/chat/android/compose/ui/util/SearchResultNameFor public abstract interface class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory { public static final field Companion Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$Companion; public abstract fun imageLoader (Landroid/content/Context;)Lcoil3/ImageLoader; + public abstract fun imageLoader (Landroid/content/Context;Ljava/util/List;)Lcoil3/ImageLoader; } public final class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$Companion { public final fun defaultFactory ()Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory; } +public final class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$DefaultImpls { + public static fun imageLoader (Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Landroid/content/Context;Ljava/util/List;)Lcoil3/ImageLoader; +} + public final class io/getstream/chat/android/compose/ui/util/StreamImageLoaderProvidableCompositionLocal { public static final synthetic fun box-impl (Landroidx/compose/runtime/ProvidableCompositionLocal;)Lio/getstream/chat/android/compose/ui/util/StreamImageLoaderProvidableCompositionLocal; public static synthetic fun constructor-impl$default (Landroidx/compose/runtime/ProvidableCompositionLocal;ILkotlin/jvm/internal/DefaultConstructorMarker;)Landroidx/compose/runtime/ProvidableCompositionLocal; @@ -4111,8 +4116,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channel/ChannelIn public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel : androidx/lifecycle/ViewModel { public static final field $stable I - public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLkotlinx/coroutines/flow/Flow;)V - public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLkotlinx/coroutines/flow/Flow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLio/getstream/chat/android/models/querysort/QuerySorter;Lkotlinx/coroutines/flow/Flow;)V + public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLio/getstream/chat/android/models/querysort/QuerySorter;Lkotlinx/coroutines/flow/Flow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun archiveChannel (Lio/getstream/chat/android/models/Channel;)V public final fun blockUser (Ljava/lang/String;)V public final fun confirmPendingAction ()V @@ -4151,8 +4156,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelL public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory : androidx/lifecycle/ViewModelProvider$Factory { public static final field $stable I public fun ()V - public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;Z)V - public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;ZLio/getstream/chat/android/models/querysort/QuerySorter;)V + public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;ZLio/getstream/chat/android/models/querysort/QuerySorter;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun create (Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; } @@ -4203,6 +4208,7 @@ public final class io/getstream/chat/android/compose/viewmodel/mentions/MentionL public final class io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel : androidx/lifecycle/ViewModel { public static final field $stable I + public fun (Lio/getstream/chat/android/ui/common/helper/internal/AttachmentStorageHelper;Lkotlinx/coroutines/flow/StateFlow;)V public fun (Lio/getstream/chat/android/ui/common/helper/internal/AttachmentStorageHelper;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/SavedStateHandle;)V public synthetic fun (Lio/getstream/chat/android/ui/common/helper/internal/AttachmentStorageHelper;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/SavedStateHandle;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAttachments ()Ljava/util/List; diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt index 69aea8da4b3..7a3fb2c05ce 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/list/MessageContainer.kt @@ -187,18 +187,17 @@ public fun MessageContainer( val messageAlignment = ChatTheme.messageAlignmentProvider.provideMessageAlignment(messageItem) val description = stringResource(id = R.string.stream_compose_cd_message_item) - val isSwipable = ChatTheme.messageOptionsTheme.optionVisibility - .canReplyToMessage( - message = message, - ownCapabilities = messageItem.ownCapabilities, - ) + val optionVisibility = ChatTheme.messageOptionsTheme.optionVisibility + val isSwipeable = remember(message, messageItem.ownCapabilities, optionVisibility) { + optionVisibility.canReplyToMessage(message, messageItem.ownCapabilities) + } // Remember the message to ensure updated values are captured in the onReply lambda val replyMessage by rememberUpdatedState(message) SwipeToReply( modifier = modifier, onReply = { onReply(replyMessage) }, - isSwipeable = { isSwipable }, + isSwipeable = isSwipeable, ) { Box( modifier = Modifier @@ -755,7 +754,7 @@ public fun RegularMessageContent( * * @param modifier Modifier for styling. * @param onReply Handler when the user swipes to reply. - * @param isSwipeable Handler to determine if the message is swipeable. + * @param isSwipeable Indicator if swipe-to-reply is enabled. * @param content The swipeable content to show when not swiping to reply. */ @Suppress("LongMethod") @@ -763,7 +762,7 @@ public fun RegularMessageContent( private fun SwipeToReply( modifier: Modifier = Modifier, onReply: () -> Unit = {}, - isSwipeable: () -> Boolean = { true }, + isSwipeable: Boolean = true, content: @Composable () -> Unit, ) { var swipeToReplyWidth by remember { mutableFloatStateOf(0f) } @@ -799,8 +798,8 @@ private fun SwipeToReply( .fillMaxWidth() .onSizeChanged { rowWidth = it.width.toFloat() } .offset { IntOffset(x = offset.value.roundToInt(), y = 0) } - .pointerInput(swipeToReplyWidth) { - if (isSwipeable()) { + .pointerInput(swipeToReplyWidth, isSwipeable) { + if (isSwipeable) { detectHorizontalDragGestures( onHorizontalDrag = { change, dragAmount -> // Only consume if horizontal drag dominates vertical diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt index 25369206515..90710a39d88 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatTheme.kt @@ -40,11 +40,6 @@ import com.valentinilk.shimmer.LocalShimmerTheme import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.header.VersionPrefixHeader import io.getstream.chat.android.compose.ui.attachments.preview.handler.AttachmentPreviewHandler -import io.getstream.chat.android.compose.ui.components.messages.factory.MessageContentFactory -import io.getstream.chat.android.compose.ui.messages.attachments.factory.AttachmentsPickerTabFactories -import io.getstream.chat.android.compose.ui.messages.attachments.factory.AttachmentsPickerTabFactory -import io.getstream.chat.android.compose.ui.theme.messages.attachments.FileAttachmentTheme -import io.getstream.chat.android.compose.ui.util.DefaultPollSwitchItemFactory import io.getstream.chat.android.compose.ui.util.ImageHeadersInterceptor import io.getstream.chat.android.compose.ui.util.LocalStreamImageLoader import io.getstream.chat.android.compose.ui.util.MessageAlignmentProvider @@ -178,7 +173,6 @@ private val LocalStreamMediaRecorder = compositionLocalOf { * @param colors The set of colors we provide, wrapped in [StreamDesign.Colors]. * @param typography The set of typography styles we provide, wrapped in [StreamDesign.Typography]. * @param rippleConfiguration Defines the appearance for ripples. - * @param userPresence The user presence display configuration. * @param componentFactory Provide to customize the stateless components that are used throughout the UI * @param attachmentPreviewHandlers Attachment preview handlers we provide. * @param reactionResolver Provides available reactions and resolves reaction types to emoji codes. @@ -498,7 +492,7 @@ public object ChatTheme { /** * Retrieves the current [ImageHeadersProvider] at the call site's position in the hierarchy. * - * @deprecated Use [asyncImageHeadersProvider] in [ChatTheme] for thread-safe header injection. + * @deprecated Use [AsyncImageHeadersProvider] in [ChatTheme] for thread-safe header injection. */ @Deprecated( message = "ImageHeadersProvider is deprecated. Pass asyncImageHeadersProvider to ChatTheme instead. " + diff --git a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt index 1db6c3085a8..19087aaf531 100644 --- a/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt +++ b/stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/viewmodel/messages/MessagesViewModelFactory.kt @@ -210,24 +210,4 @@ public class MessagesViewModelFactory( @Suppress("UNCHECKED_CAST") return viewModel as T } - - /** - * Creates the required [ViewModel] with access to [CreationExtras], which provides a - * [SavedStateHandle] for persisting state across process death. - * - * Called by Compose's `viewModel()` helper. Falls back to [create] for ViewModels - * that do not require a [SavedStateHandle]. - */ - override fun create(modelClass: Class, extras: CreationExtras): T { - if (modelClass == AttachmentsPickerViewModel::class.java) { - val savedStateHandle = extras.createSavedStateHandle() - @Suppress("UNCHECKED_CAST") - return AttachmentsPickerViewModel( - storageHelper = StorageHelperWrapper(context), - channelState = channelStateFlow, - savedStateHandle = savedStateHandle, - ) as T - } - return create(modelClass) - } } diff --git a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt index 67f2854ed51..151364f9cd1 100644 --- a/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt +++ b/stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModelTest.kt @@ -44,12 +44,6 @@ import io.getstream.chat.android.models.User import io.getstream.chat.android.models.querysort.QuerySortByField import io.getstream.chat.android.models.querysort.QuerySorter import io.getstream.chat.android.randomMessage -import io.getstream.chat.android.state.event.handler.chat.factory.ChatEventHandlerFactory -import io.getstream.chat.android.state.plugin.internal.StatePlugin -import io.getstream.chat.android.state.plugin.state.StateRegistry -import io.getstream.chat.android.state.plugin.state.global.GlobalState -import io.getstream.chat.android.state.plugin.state.querychannels.ChannelsStateData -import io.getstream.chat.android.state.plugin.state.querychannels.QueryChannelsState import io.getstream.chat.android.test.TestCoroutineExtension import io.getstream.chat.android.test.asCall import io.getstream.chat.android.ui.common.state.channels.actions.DeleteConversation diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_SelectedMessageMenuTest_my_message.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_SelectedMessageMenuTest_my_message.png index 62d17196b5972b1bf6002a6584f972eef606092a..f6304aef1933f1f59e6c00259b055efb9e2b6dd7 100644 GIT binary patch literal 47355 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 literal 47562 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 diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_SelectedMessageMenuTest_my_message_in_dark_mode.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_SelectedMessageMenuTest_my_message_in_dark_mode.png index 381cb00c85d97779b5e9cb5bedc23b0a877c8277..c14144f8bbe3dd6a990ea0c4184941476fa1430d 100644 GIT binary patch literal 42383 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 baoq2o8;y3mu=FT^d_D^^Yt!npS7QDSXgJEk literal 42677 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%0A`DkaPTzAlrhtX&R)X){$CSQLL9kK(7*P5F@SkBA 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ⅅ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 diff --git a/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_SelectedMessageMenuTest_their_message_in_dark_mode.png b/stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_SelectedMessageMenuTest_their_message_in_dark_mode.png index e4b17aa01325811b8c7b4319fad2560d68b6f039..2288c19a91144e365940587a93c68be79b92b04e 100644 GIT binary patch literal 49670 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 CsU<1^ diff --git a/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt b/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt index 8eaf55cb3f0..2145d0635ea 100644 --- a/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt +++ b/stream-chat-android-ui-components/src/main/kotlin/io/getstream/chat/android/ui/viewmodel/search/SearchViewModel.kt @@ -23,9 +23,7 @@ import io.getstream.chat.android.client.ChatClient import io.getstream.chat.android.client.api.state.Event import io.getstream.chat.android.core.internal.coroutines.DispatcherProvider import io.getstream.chat.android.models.Filters -import io.getstream.chat.android.models.Message import io.getstream.chat.android.models.SearchMessagesResult -import io.getstream.chat.android.state.utils.Event import io.getstream.chat.android.ui.common.model.MessageResult import io.getstream.log.taggedLogger import io.getstream.result.Error From 59b3932b20c14f12eb9c81603adef915d6cb52f2 Mon Sep 17 00:00:00 2001 From: VelikovPetar Date: Wed, 18 Mar 2026 09:43:48 +0100 Subject: [PATCH 33/33] ApiDUmp. --- .../api/stream-chat-android-compose.api | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/stream-chat-android-compose/api/stream-chat-android-compose.api b/stream-chat-android-compose/api/stream-chat-android-compose.api index 680e226b11f..ba783486be5 100644 --- a/stream-chat-android-compose/api/stream-chat-android-compose.api +++ b/stream-chat-android-compose/api/stream-chat-android-compose.api @@ -942,7 +942,7 @@ public final class io/getstream/chat/android/compose/ui/channel/info/GroupChanne } public final class io/getstream/chat/android/compose/ui/channels/ChannelsScreenKt { - public static final fun ChannelsScreen (Lio/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/compose/ui/channels/SearchMode;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;III)V + public static final fun ChannelsScreen (Lio/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory;Ljava/lang/String;Ljava/lang/String;ZLio/getstream/chat/android/compose/ui/channels/SearchMode;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;ZLandroidx/compose/runtime/Composer;III)V } public final class io/getstream/chat/android/compose/ui/channels/SearchMode : java/lang/Enum { @@ -2428,7 +2428,7 @@ public final class io/getstream/chat/android/compose/ui/messages/list/MessageLis } public final class io/getstream/chat/android/compose/ui/messages/list/MessagesKt { - public static final fun Messages (Lio/getstream/chat/android/ui/common/state/messages/list/MessageListState;Lio/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Vertical;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;III)V + public static final fun Messages (Lio/getstream/chat/android/ui/common/state/messages/list/MessageListState;Lio/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState;Landroidx/compose/foundation/layout/Arrangement$Vertical;Landroidx/compose/foundation/layout/Arrangement$Vertical;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function5;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;III)V } public final class io/getstream/chat/android/compose/ui/messages/list/MessagesLazyListState { @@ -3937,7 +3937,7 @@ public final class io/getstream/chat/android/compose/ui/theme/ChatTheme { } public final class io/getstream/chat/android/compose/ui/theme/ChatThemeKt { - public static final fun ChatTheme (ZLio/getstream/chat/android/compose/ui/theme/ChatConfig;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Typography;Lio/getstream/chat/android/compose/ui/theme/StreamRippleConfiguration;Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Ljava/util/List;Lio/getstream/chat/android/compose/ui/util/ReactionResolver;Lio/getstream/chat/android/compose/ui/theme/ReactionOptionsTheme;Lio/getstream/chat/android/compose/ui/util/MessagePreviewIconFactory;ZLio/getstream/chat/android/ui/common/helper/DateFormatter;Lio/getstream/chat/android/ui/common/helper/TimeProvider;Lio/getstream/chat/android/ui/common/helper/DurationFormatter;Lio/getstream/chat/android/ui/common/utils/ChannelNameFormatter;Lio/getstream/chat/android/compose/ui/util/MessagePreviewFormatter;Lio/getstream/chat/android/compose/ui/util/SearchResultNameFormatter;Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Lio/getstream/chat/android/ui/common/helper/ImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/DownloadAttachmentUriGenerator;Lio/getstream/chat/android/ui/common/helper/DownloadRequestInterceptor;Lio/getstream/chat/android/ui/common/helper/ImageAssetTransformer;Lio/getstream/chat/android/compose/ui/util/MessageAlignmentProvider;Lio/getstream/chat/android/compose/ui/theme/MessageOptionsTheme;Lio/getstream/chat/android/compose/ui/theme/ChannelOptionsTheme;Lio/getstream/chat/android/ui/common/images/resizing/StreamCdnImageResizing;Lio/getstream/chat/android/compose/ui/theme/MessageComposerTheme;Lio/getstream/chat/android/compose/ui/util/MessageTextFormatter;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;IIII)V + public static final fun ChatTheme (ZLio/getstream/chat/android/compose/ui/theme/ChatConfig;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Colors;Lio/getstream/chat/android/compose/ui/theme/StreamDesign$Typography;Lio/getstream/chat/android/compose/ui/theme/StreamRippleConfiguration;Lio/getstream/chat/android/compose/ui/theme/ChatComponentFactory;Ljava/util/List;Lio/getstream/chat/android/compose/ui/util/ReactionResolver;Lio/getstream/chat/android/compose/ui/theme/ReactionOptionsTheme;Lio/getstream/chat/android/compose/ui/util/MessagePreviewIconFactory;ZLio/getstream/chat/android/ui/common/helper/DateFormatter;Lio/getstream/chat/android/ui/common/helper/TimeProvider;Lio/getstream/chat/android/ui/common/helper/DurationFormatter;Lio/getstream/chat/android/ui/common/utils/ChannelNameFormatter;Lio/getstream/chat/android/compose/ui/util/MessagePreviewFormatter;Lio/getstream/chat/android/compose/ui/util/SearchResultNameFormatter;Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Lio/getstream/chat/android/ui/common/helper/ImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/AsyncImageHeadersProvider;Lio/getstream/chat/android/ui/common/helper/DownloadAttachmentUriGenerator;Lio/getstream/chat/android/ui/common/helper/DownloadRequestInterceptor;Lio/getstream/chat/android/ui/common/helper/ImageAssetTransformer;Lio/getstream/chat/android/compose/ui/util/MessageAlignmentProvider;Lio/getstream/chat/android/compose/ui/theme/MessageOptionsTheme;Lio/getstream/chat/android/compose/ui/theme/ChannelOptionsTheme;Lio/getstream/chat/android/ui/common/images/resizing/StreamCdnImageResizing;Lio/getstream/chat/android/compose/ui/theme/MessageComposerTheme;Lio/getstream/chat/android/compose/ui/util/MessageTextFormatter;Lio/getstream/sdk/chat/audio/recording/StreamMediaRecorder;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;IIIII)V public static final fun getLocalChatConfig ()Landroidx/compose/runtime/ProvidableCompositionLocal; public static final fun getLocalComponentFactory ()Landroidx/compose/runtime/ProvidableCompositionLocal; } @@ -6779,12 +6779,17 @@ public final class io/getstream/chat/android/compose/ui/util/SearchResultNameFor public abstract interface class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory { public static final field Companion Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$Companion; public abstract fun imageLoader (Landroid/content/Context;)Lcoil3/ImageLoader; + public abstract fun imageLoader (Landroid/content/Context;Ljava/util/List;)Lcoil3/ImageLoader; } public final class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$Companion { public final fun defaultFactory ()Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory; } +public final class io/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory$DefaultImpls { + public static fun imageLoader (Lio/getstream/chat/android/compose/ui/util/StreamCoilImageLoaderFactory;Landroid/content/Context;Ljava/util/List;)Lcoil3/ImageLoader; +} + public final class io/getstream/chat/android/compose/ui/util/StreamImageLoaderProvidableCompositionLocal { public static final synthetic fun box-impl (Landroidx/compose/runtime/ProvidableCompositionLocal;)Lio/getstream/chat/android/compose/ui/util/StreamImageLoaderProvidableCompositionLocal; public static synthetic fun constructor-impl$default (Landroidx/compose/runtime/ProvidableCompositionLocal;ILkotlin/jvm/internal/DefaultConstructorMarker;)Landroidx/compose/runtime/ProvidableCompositionLocal; @@ -6932,8 +6937,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channel/ChannelIn public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel : androidx/lifecycle/ViewModel { public static final field $stable I - public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLkotlinx/coroutines/flow/Flow;)V - public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLkotlinx/coroutines/flow/Flow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLio/getstream/chat/android/models/querysort/QuerySorter;Lkotlinx/coroutines/flow/Flow;)V + public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;JZLio/getstream/chat/android/models/querysort/QuerySorter;Lkotlinx/coroutines/flow/Flow;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun archiveChannel (Lio/getstream/chat/android/models/Channel;)V public final fun blockUser (Ljava/lang/String;)V public final fun confirmPendingAction ()V @@ -6972,8 +6977,8 @@ public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelL public final class io/getstream/chat/android/compose/viewmodel/channels/ChannelViewModelFactory : androidx/lifecycle/ViewModelProvider$Factory { public static final field $stable I public fun ()V - public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;Z)V - public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;ZLio/getstream/chat/android/models/querysort/QuerySorter;)V + public synthetic fun (Lio/getstream/chat/android/client/ChatClient;Lio/getstream/chat/android/models/querysort/QuerySorter;Lio/getstream/chat/android/models/FilterObject;ILjava/lang/Integer;Ljava/lang/Integer;Lio/getstream/chat/android/client/api/event/ChatEventHandlerFactory;ZLio/getstream/chat/android/models/querysort/QuerySorter;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun create (Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; } @@ -7024,6 +7029,7 @@ public final class io/getstream/chat/android/compose/viewmodel/mentions/MentionL public final class io/getstream/chat/android/compose/viewmodel/messages/AttachmentsPickerViewModel : androidx/lifecycle/ViewModel { public static final field $stable I + public fun (Lio/getstream/chat/android/ui/common/helper/internal/AttachmentStorageHelper;Lkotlinx/coroutines/flow/StateFlow;)V public fun (Lio/getstream/chat/android/ui/common/helper/internal/AttachmentStorageHelper;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/SavedStateHandle;)V public synthetic fun (Lio/getstream/chat/android/ui/common/helper/internal/AttachmentStorageHelper;Lkotlinx/coroutines/flow/StateFlow;Landroidx/lifecycle/SavedStateHandle;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAttachments ()Ljava/util/List;